@cdklabs/cdk-ecs-codedeploy 0.0.432 → 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 (274) 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/lambda-invoke-store/dist-cjs/invoke-store.js +2 -2
  8. package/node_modules/@aws/lambda-invoke-store/dist-es/invoke-store.js +2 -2
  9. package/node_modules/@aws/lambda-invoke-store/dist-types/invoke-store.d.ts +1 -1
  10. package/node_modules/@aws/lambda-invoke-store/package.json +1 -1
  11. package/node_modules/@aws-sdk/client-codedeploy/README.md +26 -46
  12. package/node_modules/@aws-sdk/client-codedeploy/package.json +34 -34
  13. package/node_modules/@aws-sdk/core/dist-cjs/index.js +4 -0
  14. package/node_modules/@aws-sdk/core/dist-cjs/submodules/protocols/index.js +4 -0
  15. package/node_modules/@aws-sdk/core/dist-es/submodules/protocols/index.js +2 -0
  16. package/node_modules/@aws-sdk/core/dist-es/submodules/protocols/query/AwsEc2QueryProtocol.js +3 -0
  17. package/node_modules/@aws-sdk/core/dist-types/submodules/protocols/index.d.ts +2 -0
  18. package/node_modules/@aws-sdk/core/dist-types/submodules/protocols/query/AwsEc2QueryProtocol.d.ts +4 -0
  19. package/node_modules/@aws-sdk/core/dist-types/submodules/protocols/query/QuerySerializerSettings.d.ts +3 -0
  20. package/node_modules/@aws-sdk/core/dist-types/ts3.4/submodules/protocols/index.d.ts +2 -0
  21. package/node_modules/@aws-sdk/core/dist-types/ts3.4/submodules/protocols/query/AwsEc2QueryProtocol.d.ts +1 -0
  22. package/node_modules/@aws-sdk/core/package.json +11 -11
  23. package/node_modules/@aws-sdk/credential-provider-env/package.json +5 -5
  24. package/node_modules/@aws-sdk/credential-provider-http/package.json +10 -10
  25. package/node_modules/@aws-sdk/credential-provider-ini/package.json +14 -14
  26. package/node_modules/@aws-sdk/credential-provider-login/package.json +8 -8
  27. package/node_modules/@aws-sdk/credential-provider-node/package.json +12 -12
  28. package/node_modules/@aws-sdk/credential-provider-process/package.json +6 -6
  29. package/node_modules/@aws-sdk/credential-provider-sso/package.json +8 -8
  30. package/node_modules/@aws-sdk/credential-provider-web-identity/package.json +7 -7
  31. package/node_modules/@aws-sdk/middleware-host-header/package.json +4 -4
  32. package/node_modules/@aws-sdk/middleware-logger/package.json +3 -3
  33. package/node_modules/@aws-sdk/middleware-recursion-detection/package.json +4 -4
  34. package/node_modules/@aws-sdk/middleware-user-agent/package.json +8 -8
  35. package/node_modules/@aws-sdk/nested-clients/package.json +32 -32
  36. package/node_modules/@aws-sdk/region-config-resolver/package.json +5 -5
  37. package/node_modules/@aws-sdk/token-providers/package.json +7 -7
  38. package/node_modules/@aws-sdk/types/package.json +2 -2
  39. package/node_modules/@aws-sdk/util-endpoints/package.json +5 -5
  40. package/node_modules/@aws-sdk/util-user-agent-browser/package.json +3 -3
  41. package/node_modules/@aws-sdk/util-user-agent-node/dist-cjs/index.js +75 -19
  42. package/node_modules/@aws-sdk/util-user-agent-node/dist-es/getNodeModulesParentDirs.js +15 -0
  43. package/node_modules/@aws-sdk/util-user-agent-node/dist-es/getSanitizedDevTypeScriptVersion.js +14 -0
  44. package/node_modules/@aws-sdk/util-user-agent-node/dist-es/getTypeScriptUserAgentPair.js +53 -7
  45. package/node_modules/@aws-sdk/util-user-agent-node/dist-types/{getTypeScriptPackageJsonPaths.d.ts → getNodeModulesParentDirs.d.ts} +2 -2
  46. package/node_modules/@aws-sdk/util-user-agent-node/dist-types/getSanitizedDevTypeScriptVersion.d.ts +8 -0
  47. package/node_modules/@aws-sdk/util-user-agent-node/dist-types/ts3.4/getNodeModulesParentDirs.d.ts +1 -0
  48. package/node_modules/@aws-sdk/util-user-agent-node/dist-types/ts3.4/getSanitizedDevTypeScriptVersion.d.ts +3 -0
  49. package/node_modules/@aws-sdk/util-user-agent-node/package.json +6 -5
  50. package/node_modules/@aws-sdk/xml-builder/dist-cjs/index.js +21 -11
  51. package/node_modules/@aws-sdk/xml-builder/dist-cjs/xml-parser.js +5 -1
  52. package/node_modules/@aws-sdk/xml-builder/dist-es/escape-attribute.js +8 -1
  53. package/node_modules/@aws-sdk/xml-builder/dist-es/escape-element.js +13 -10
  54. package/node_modules/@aws-sdk/xml-builder/dist-es/xml-parser.js +5 -1
  55. package/node_modules/{fast-xml-parser → @aws-sdk/xml-builder/node_modules/fast-xml-parser}/CHANGELOG.md +40 -4
  56. package/node_modules/{fast-xml-parser → @aws-sdk/xml-builder/node_modules/fast-xml-parser}/README.md +8 -7
  57. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/lib/fxbuilder.min.js +2 -0
  58. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/lib/fxbuilder.min.js.map +1 -0
  59. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/lib/fxp.cjs +1 -0
  60. package/node_modules/{fast-xml-parser → @aws-sdk/xml-builder/node_modules/fast-xml-parser}/lib/fxp.d.cts +82 -20
  61. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/lib/fxp.min.js +2 -0
  62. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/lib/fxp.min.js.map +1 -0
  63. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/lib/fxparser.min.js +2 -0
  64. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/lib/fxparser.min.js.map +1 -0
  65. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/lib/fxvalidator.min.js.map +1 -0
  66. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/lib/pem.d.cts +148 -0
  67. package/node_modules/{fast-xml-parser → @aws-sdk/xml-builder/node_modules/fast-xml-parser}/package.json +4 -3
  68. package/node_modules/{fast-xml-parser → @aws-sdk/xml-builder/node_modules/fast-xml-parser}/src/fxp.d.ts +75 -19
  69. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/src/pem.d.ts +135 -0
  70. package/node_modules/{fast-xml-parser → @aws-sdk/xml-builder/node_modules/fast-xml-parser}/src/util.js +18 -0
  71. package/node_modules/{fast-xml-parser → @aws-sdk/xml-builder/node_modules/fast-xml-parser}/src/xmlparser/DocTypeReader.js +37 -18
  72. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/src/xmlparser/OptionsBuilder.js +159 -0
  73. package/node_modules/{fast-xml-parser → @aws-sdk/xml-builder/node_modules/fast-xml-parser}/src/xmlparser/OrderedObjParser.js +298 -116
  74. package/node_modules/{fast-xml-parser → @aws-sdk/xml-builder/node_modules/fast-xml-parser}/src/xmlparser/XMLParser.js +2 -2
  75. package/node_modules/{fast-xml-parser → @aws-sdk/xml-builder/node_modules/fast-xml-parser}/src/xmlparser/node2json.js +65 -15
  76. package/node_modules/{strnum → @aws-sdk/xml-builder/node_modules/strnum}/CHANGELOG.md +9 -2
  77. package/node_modules/{strnum → @aws-sdk/xml-builder/node_modules/strnum}/package.json +1 -1
  78. package/node_modules/{strnum → @aws-sdk/xml-builder/node_modules/strnum}/strnum.js +12 -6
  79. package/node_modules/{strnum → @aws-sdk/xml-builder/node_modules/strnum}/tests/strnum_test.js +3 -0
  80. package/node_modules/@aws-sdk/xml-builder/node_modules/strnum/tests/temp.js +8 -0
  81. package/node_modules/@aws-sdk/xml-builder/package.json +3 -3
  82. package/node_modules/@smithy/abort-controller/package.json +2 -2
  83. package/node_modules/@smithy/config-resolver/dist-cjs/index.js +12 -0
  84. package/node_modules/@smithy/config-resolver/dist-es/endpointsConfig/NodeUseDualstackEndpointConfigOptions.js +5 -0
  85. package/node_modules/@smithy/config-resolver/dist-es/endpointsConfig/NodeUseFipsEndpointConfigOptions.js +5 -0
  86. package/node_modules/@smithy/config-resolver/dist-types/endpointsConfig/NodeUseDualstackEndpointConfigOptions.d.ts +6 -0
  87. package/node_modules/@smithy/config-resolver/dist-types/endpointsConfig/NodeUseFipsEndpointConfigOptions.d.ts +6 -0
  88. package/node_modules/@smithy/config-resolver/dist-types/ts3.4/endpointsConfig/NodeUseDualstackEndpointConfigOptions.d.ts +6 -0
  89. package/node_modules/@smithy/config-resolver/dist-types/ts3.4/endpointsConfig/NodeUseFipsEndpointConfigOptions.d.ts +6 -0
  90. package/node_modules/@smithy/config-resolver/package.json +5 -5
  91. package/node_modules/@smithy/core/dist-cjs/index.js +1 -2
  92. package/node_modules/@smithy/core/dist-cjs/submodules/cbor/index.js +7 -1
  93. package/node_modules/@smithy/core/dist-cjs/submodules/endpoints/index.js +22 -0
  94. package/node_modules/@smithy/core/dist-cjs/submodules/protocols/index.js +11 -1
  95. package/node_modules/@smithy/core/dist-cjs/submodules/schema/index.js +41 -4
  96. package/node_modules/@smithy/core/dist-es/middleware-http-auth-scheme/getHttpAuthSchemePlugin.js +1 -2
  97. package/node_modules/@smithy/core/dist-es/submodules/cbor/parseCborBody.js +7 -1
  98. package/node_modules/@smithy/core/dist-es/submodules/endpoints/index.js +1 -0
  99. package/node_modules/@smithy/core/dist-es/submodules/endpoints/toEndpointV1.js +17 -0
  100. package/node_modules/@smithy/core/dist-es/submodules/protocols/HttpProtocol.js +10 -0
  101. package/node_modules/@smithy/core/dist-es/submodules/protocols/RpcProtocol.js +1 -1
  102. package/node_modules/@smithy/core/dist-es/submodules/schema/middleware/schemaSerializationMiddleware.js +3 -2
  103. package/node_modules/@smithy/core/dist-es/submodules/schema/schemas/NormalizedSchema.js +30 -1
  104. package/node_modules/@smithy/core/dist-es/submodules/schema/schemas/translateTraits.js +5 -1
  105. package/node_modules/@smithy/core/dist-types/submodules/endpoints/index.d.ts +1 -0
  106. package/node_modules/@smithy/core/dist-types/submodules/endpoints/toEndpointV1.d.ts +6 -0
  107. package/node_modules/@smithy/core/dist-types/submodules/schema/schemas/NormalizedSchema.d.ts +11 -0
  108. package/node_modules/@smithy/core/dist-types/submodules/schema/schemas/translateTraits.d.ts +6 -0
  109. package/node_modules/@smithy/core/dist-types/ts3.4/submodules/endpoints/index.d.ts +1 -0
  110. package/node_modules/@smithy/core/dist-types/ts3.4/submodules/endpoints/toEndpointV1.d.ts +6 -0
  111. package/node_modules/@smithy/core/dist-types/ts3.4/submodules/schema/schemas/NormalizedSchema.d.ts +11 -0
  112. package/node_modules/@smithy/core/dist-types/ts3.4/submodules/schema/schemas/translateTraits.d.ts +6 -0
  113. package/node_modules/@smithy/core/endpoints.d.ts +7 -0
  114. package/node_modules/@smithy/core/endpoints.js +6 -0
  115. package/node_modules/@smithy/core/package.json +16 -7
  116. package/node_modules/@smithy/credential-provider-imds/package.json +5 -5
  117. package/node_modules/@smithy/fetch-http-handler/dist-cjs/index.js +4 -1
  118. package/node_modules/@smithy/fetch-http-handler/dist-es/fetch-http-handler.js +4 -1
  119. package/node_modules/@smithy/fetch-http-handler/package.json +5 -5
  120. package/node_modules/@smithy/hash-node/package.json +2 -2
  121. package/node_modules/@smithy/invalid-dependency/package.json +2 -2
  122. package/node_modules/@smithy/middleware-content-length/package.json +3 -3
  123. package/node_modules/@smithy/middleware-endpoint/dist-cjs/index.js +17 -1
  124. package/node_modules/@smithy/middleware-endpoint/dist-es/adaptors/getEndpointFromInstructions.js +9 -0
  125. package/node_modules/@smithy/middleware-endpoint/dist-es/adaptors/toEndpointV1.js +8 -1
  126. package/node_modules/@smithy/middleware-endpoint/dist-types/adaptors/toEndpointV1.d.ts +1 -0
  127. package/node_modules/@smithy/middleware-endpoint/dist-types/resolveEndpointConfig.d.ts +2 -2
  128. package/node_modules/@smithy/middleware-endpoint/dist-types/ts3.4/adaptors/toEndpointV1.d.ts +1 -0
  129. package/node_modules/@smithy/middleware-endpoint/dist-types/ts3.4/resolveEndpointConfig.d.ts +2 -2
  130. package/node_modules/@smithy/middleware-endpoint/package.json +8 -8
  131. package/node_modules/@smithy/middleware-retry/dist-cjs/index.js +9 -12
  132. package/node_modules/@smithy/middleware-retry/dist-es/configurations.js +9 -12
  133. package/node_modules/@smithy/middleware-retry/package.json +8 -8
  134. package/node_modules/@smithy/middleware-serde/dist-cjs/index.js +3 -2
  135. package/node_modules/@smithy/middleware-serde/dist-es/serializerMiddleware.js +3 -2
  136. package/node_modules/@smithy/middleware-serde/package.json +4 -3
  137. package/node_modules/@smithy/middleware-stack/package.json +2 -2
  138. package/node_modules/@smithy/node-config-provider/package.json +4 -4
  139. package/node_modules/@smithy/node-http-handler/dist-cjs/index.js +48 -38
  140. package/node_modules/@smithy/node-http-handler/dist-es/build-abort-error.js +4 -1
  141. package/node_modules/@smithy/node-http-handler/dist-es/node-http-handler.js +38 -31
  142. package/node_modules/@smithy/node-http-handler/dist-es/node-http2-connection-manager.js +1 -1
  143. package/node_modules/@smithy/node-http-handler/dist-es/node-http2-handler.js +1 -1
  144. package/node_modules/@smithy/node-http-handler/dist-es/readable.mock.js +1 -1
  145. package/node_modules/@smithy/node-http-handler/dist-es/server.mock.js +6 -6
  146. package/node_modules/@smithy/node-http-handler/dist-es/stream-collector/collector.js +1 -1
  147. package/node_modules/@smithy/node-http-handler/dist-es/stream-collector/readable.mock.js +1 -1
  148. package/node_modules/@smithy/node-http-handler/dist-es/write-request-body.js +1 -1
  149. package/node_modules/@smithy/node-http-handler/dist-types/build-abort-error.d.ts +4 -3
  150. package/node_modules/@smithy/node-http-handler/dist-types/get-transformed-headers.d.ts +1 -1
  151. package/node_modules/@smithy/node-http-handler/dist-types/node-http-handler.d.ts +4 -4
  152. package/node_modules/@smithy/node-http-handler/dist-types/node-http2-connection-manager.d.ts +1 -1
  153. package/node_modules/@smithy/node-http-handler/dist-types/node-http2-connection-pool.d.ts +1 -1
  154. package/node_modules/@smithy/node-http-handler/dist-types/readable.mock.d.ts +2 -2
  155. package/node_modules/@smithy/node-http-handler/dist-types/server.mock.d.ts +3 -3
  156. package/node_modules/@smithy/node-http-handler/dist-types/set-connection-timeout.d.ts +1 -1
  157. package/node_modules/@smithy/node-http-handler/dist-types/set-request-timeout.d.ts +1 -1
  158. package/node_modules/@smithy/node-http-handler/dist-types/set-socket-keep-alive.d.ts +1 -1
  159. package/node_modules/@smithy/node-http-handler/dist-types/set-socket-timeout.d.ts +1 -1
  160. package/node_modules/@smithy/node-http-handler/dist-types/stream-collector/collector.d.ts +1 -1
  161. package/node_modules/@smithy/node-http-handler/dist-types/stream-collector/readable.mock.d.ts +2 -2
  162. package/node_modules/@smithy/node-http-handler/dist-types/ts3.4/build-abort-error.d.ts +4 -3
  163. package/node_modules/@smithy/node-http-handler/dist-types/ts3.4/get-transformed-headers.d.ts +1 -1
  164. package/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http-handler.d.ts +4 -4
  165. package/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-connection-manager.d.ts +1 -1
  166. package/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-connection-pool.d.ts +1 -1
  167. package/node_modules/@smithy/node-http-handler/dist-types/ts3.4/readable.mock.d.ts +2 -2
  168. package/node_modules/@smithy/node-http-handler/dist-types/ts3.4/server.mock.d.ts +3 -3
  169. package/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-connection-timeout.d.ts +1 -1
  170. package/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-request-timeout.d.ts +1 -1
  171. package/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-socket-keep-alive.d.ts +1 -1
  172. package/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-socket-timeout.d.ts +1 -1
  173. package/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/collector.d.ts +1 -1
  174. package/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/readable.mock.d.ts +2 -2
  175. package/node_modules/@smithy/node-http-handler/dist-types/ts3.4/write-request-body.d.ts +2 -2
  176. package/node_modules/@smithy/node-http-handler/dist-types/write-request-body.d.ts +2 -2
  177. package/node_modules/@smithy/node-http-handler/package.json +5 -5
  178. package/node_modules/@smithy/property-provider/package.json +2 -2
  179. package/node_modules/@smithy/protocol-http/package.json +2 -2
  180. package/node_modules/@smithy/querystring-builder/package.json +2 -2
  181. package/node_modules/@smithy/querystring-parser/package.json +2 -2
  182. package/node_modules/@smithy/service-error-classification/package.json +2 -2
  183. package/node_modules/@smithy/shared-ini-file-loader/package.json +2 -2
  184. package/node_modules/@smithy/signature-v4/package.json +4 -4
  185. package/node_modules/@smithy/smithy-client/package.json +7 -7
  186. package/node_modules/@smithy/types/dist-types/http.d.ts +1 -0
  187. package/node_modules/@smithy/types/dist-types/ts3.4/http.d.ts +1 -0
  188. package/node_modules/@smithy/types/package.json +1 -1
  189. package/node_modules/@smithy/url-parser/package.json +3 -3
  190. package/node_modules/@smithy/util-defaults-mode-browser/package.json +4 -4
  191. package/node_modules/@smithy/util-defaults-mode-node/package.json +7 -7
  192. package/node_modules/@smithy/util-endpoints/package.json +3 -3
  193. package/node_modules/@smithy/util-middleware/package.json +2 -2
  194. package/node_modules/@smithy/util-retry/package.json +3 -3
  195. package/node_modules/@smithy/util-stream/package.json +4 -4
  196. package/node_modules/@smithy/util-waiter/dist-cjs/index.js +1 -1
  197. package/node_modules/@smithy/util-waiter/dist-es/poller.js +1 -1
  198. package/node_modules/@smithy/util-waiter/package.json +3 -3
  199. package/node_modules/fast-xml-builder/CHANGELOG.md +16 -0
  200. package/node_modules/fast-xml-builder/README.md +1 -1
  201. package/node_modules/fast-xml-builder/lib/fxb.cjs +1 -0
  202. package/node_modules/fast-xml-builder/lib/fxb.d.cts +22 -9
  203. package/node_modules/fast-xml-builder/lib/fxb.min.js +2 -0
  204. package/node_modules/fast-xml-builder/lib/fxb.min.js.map +1 -0
  205. package/node_modules/fast-xml-builder/package.json +7 -5
  206. package/node_modules/fast-xml-builder/src/fxb.d.ts +27 -3
  207. package/node_modules/fast-xml-builder/src/fxb.js +265 -21
  208. package/node_modules/fast-xml-builder/src/orderedJs2Xml.js +165 -18
  209. package/node_modules/path-expression-matcher/LICENSE +21 -0
  210. package/node_modules/path-expression-matcher/README.md +720 -0
  211. package/node_modules/path-expression-matcher/lib/pem.cjs +1 -0
  212. package/node_modules/path-expression-matcher/lib/pem.d.cts +523 -0
  213. package/node_modules/path-expression-matcher/lib/pem.min.js +2 -0
  214. package/node_modules/path-expression-matcher/lib/pem.min.js.map +1 -0
  215. package/node_modules/path-expression-matcher/package.json +78 -0
  216. package/node_modules/path-expression-matcher/src/Expression.js +232 -0
  217. package/node_modules/path-expression-matcher/src/Matcher.js +498 -0
  218. package/node_modules/path-expression-matcher/src/index.d.ts +518 -0
  219. package/node_modules/path-expression-matcher/src/index.js +28 -0
  220. package/package.json +4 -4
  221. package/node_modules/@aws-sdk/util-user-agent-node/dist-es/getTypeScriptPackageJsonPaths.js +0 -17
  222. package/node_modules/@aws-sdk/util-user-agent-node/dist-types/ts3.4/getTypeScriptPackageJsonPaths.d.ts +0 -3
  223. package/node_modules/fast-xml-builder/lib/builder.cjs +0 -1
  224. package/node_modules/fast-xml-builder/lib/builder.min.js +0 -2
  225. package/node_modules/fast-xml-builder/lib/builder.min.js.map +0 -1
  226. package/node_modules/fast-xml-parser/lib/fxbuilder.min.js +0 -2
  227. package/node_modules/fast-xml-parser/lib/fxbuilder.min.js.map +0 -1
  228. package/node_modules/fast-xml-parser/lib/fxp.cjs +0 -1
  229. package/node_modules/fast-xml-parser/lib/fxp.min.js +0 -2
  230. package/node_modules/fast-xml-parser/lib/fxp.min.js.map +0 -1
  231. package/node_modules/fast-xml-parser/lib/fxparser.min.js +0 -2
  232. package/node_modules/fast-xml-parser/lib/fxparser.min.js.map +0 -1
  233. package/node_modules/fast-xml-parser/lib/fxvalidator.min.js.map +0 -1
  234. package/node_modules/fast-xml-parser/src/xmlparser/OptionsBuilder.js +0 -88
  235. /package/node_modules/{fast-xml-parser → @aws-sdk/xml-builder/node_modules/fast-xml-parser}/LICENSE +0 -0
  236. /package/node_modules/{fast-xml-parser → @aws-sdk/xml-builder/node_modules/fast-xml-parser}/lib/fxvalidator.min.js +0 -0
  237. /package/node_modules/{fast-xml-parser → @aws-sdk/xml-builder/node_modules/fast-xml-parser}/src/cli/cli.js +0 -0
  238. /package/node_modules/{fast-xml-parser → @aws-sdk/xml-builder/node_modules/fast-xml-parser}/src/cli/man.js +0 -0
  239. /package/node_modules/{fast-xml-parser → @aws-sdk/xml-builder/node_modules/fast-xml-parser}/src/cli/read.js +0 -0
  240. /package/node_modules/{fast-xml-parser → @aws-sdk/xml-builder/node_modules/fast-xml-parser}/src/fxp.js +0 -0
  241. /package/node_modules/{fast-xml-parser → @aws-sdk/xml-builder/node_modules/fast-xml-parser}/src/ignoreAttributes.js +0 -0
  242. /package/node_modules/{fast-xml-parser → @aws-sdk/xml-builder/node_modules/fast-xml-parser}/src/v6/CharsSymbol.js +0 -0
  243. /package/node_modules/{fast-xml-parser → @aws-sdk/xml-builder/node_modules/fast-xml-parser}/src/v6/EntitiesParser.js +0 -0
  244. /package/node_modules/{fast-xml-parser → @aws-sdk/xml-builder/node_modules/fast-xml-parser}/src/v6/OptionsBuilder.js +0 -0
  245. /package/node_modules/{fast-xml-parser → @aws-sdk/xml-builder/node_modules/fast-xml-parser}/src/v6/OutputBuilders/BaseOutputBuilder.js +0 -0
  246. /package/node_modules/{fast-xml-parser → @aws-sdk/xml-builder/node_modules/fast-xml-parser}/src/v6/OutputBuilders/JsArrBuilder.js +0 -0
  247. /package/node_modules/{fast-xml-parser → @aws-sdk/xml-builder/node_modules/fast-xml-parser}/src/v6/OutputBuilders/JsMinArrBuilder.js +0 -0
  248. /package/node_modules/{fast-xml-parser → @aws-sdk/xml-builder/node_modules/fast-xml-parser}/src/v6/OutputBuilders/JsObjBuilder.js +0 -0
  249. /package/node_modules/{fast-xml-parser → @aws-sdk/xml-builder/node_modules/fast-xml-parser}/src/v6/OutputBuilders/ParserOptionsBuilder.js +0 -0
  250. /package/node_modules/{fast-xml-parser → @aws-sdk/xml-builder/node_modules/fast-xml-parser}/src/v6/Report.js +0 -0
  251. /package/node_modules/{fast-xml-parser → @aws-sdk/xml-builder/node_modules/fast-xml-parser}/src/v6/TagPath.js +0 -0
  252. /package/node_modules/{fast-xml-parser → @aws-sdk/xml-builder/node_modules/fast-xml-parser}/src/v6/TagPathMatcher.js +0 -0
  253. /package/node_modules/{fast-xml-parser → @aws-sdk/xml-builder/node_modules/fast-xml-parser}/src/v6/XMLParser.js +0 -0
  254. /package/node_modules/{fast-xml-parser → @aws-sdk/xml-builder/node_modules/fast-xml-parser}/src/v6/Xml2JsParser.js +0 -0
  255. /package/node_modules/{fast-xml-parser → @aws-sdk/xml-builder/node_modules/fast-xml-parser}/src/v6/XmlPartReader.js +0 -0
  256. /package/node_modules/{fast-xml-parser → @aws-sdk/xml-builder/node_modules/fast-xml-parser}/src/v6/XmlSpecialTagsReader.js +0 -0
  257. /package/node_modules/{fast-xml-parser → @aws-sdk/xml-builder/node_modules/fast-xml-parser}/src/v6/inputSource/BufferSource.js +0 -0
  258. /package/node_modules/{fast-xml-parser → @aws-sdk/xml-builder/node_modules/fast-xml-parser}/src/v6/inputSource/StringSource.js +0 -0
  259. /package/node_modules/{fast-xml-parser → @aws-sdk/xml-builder/node_modules/fast-xml-parser}/src/v6/valueParsers/EntitiesParser.js +0 -0
  260. /package/node_modules/{fast-xml-parser → @aws-sdk/xml-builder/node_modules/fast-xml-parser}/src/v6/valueParsers/booleanParser.js +0 -0
  261. /package/node_modules/{fast-xml-parser → @aws-sdk/xml-builder/node_modules/fast-xml-parser}/src/v6/valueParsers/booleanParserExt.js +0 -0
  262. /package/node_modules/{fast-xml-parser → @aws-sdk/xml-builder/node_modules/fast-xml-parser}/src/v6/valueParsers/currency.js +0 -0
  263. /package/node_modules/{fast-xml-parser → @aws-sdk/xml-builder/node_modules/fast-xml-parser}/src/v6/valueParsers/join.js +0 -0
  264. /package/node_modules/{fast-xml-parser → @aws-sdk/xml-builder/node_modules/fast-xml-parser}/src/v6/valueParsers/number.js +0 -0
  265. /package/node_modules/{fast-xml-parser → @aws-sdk/xml-builder/node_modules/fast-xml-parser}/src/v6/valueParsers/trim.js +0 -0
  266. /package/node_modules/{fast-xml-parser → @aws-sdk/xml-builder/node_modules/fast-xml-parser}/src/validator.js +0 -0
  267. /package/node_modules/{fast-xml-parser → @aws-sdk/xml-builder/node_modules/fast-xml-parser}/src/xmlbuilder/json2xml.js +0 -0
  268. /package/node_modules/{fast-xml-parser → @aws-sdk/xml-builder/node_modules/fast-xml-parser}/src/xmlparser/xmlNode.js +0 -0
  269. /package/node_modules/{strnum → @aws-sdk/xml-builder/node_modules/strnum}/.github/SECURITY.md +0 -0
  270. /package/node_modules/{strnum → @aws-sdk/xml-builder/node_modules/strnum}/.vscode/launch.json +0 -0
  271. /package/node_modules/{strnum → @aws-sdk/xml-builder/node_modules/strnum}/LICENSE +0 -0
  272. /package/node_modules/{strnum → @aws-sdk/xml-builder/node_modules/strnum}/README.md +0 -0
  273. /package/node_modules/{strnum → @aws-sdk/xml-builder/node_modules/strnum}/algo.stflow +0 -0
  274. /package/node_modules/{strnum → @aws-sdk/xml-builder/node_modules/strnum}/tests/infinity_test.js +0 -0
@@ -2,6 +2,7 @@
2
2
  //parse Empty Node as self closing node
3
3
  import buildFromOrderedJs from './orderedJs2Xml.js';
4
4
  import getIgnoreAttributesFn from "./ignoreAttributes.js";
5
+ import { Expression, Matcher } from 'path-expression-matcher';
5
6
 
6
7
  const defaultOptions = {
7
8
  attributeNamePrefix: '@_',
@@ -34,11 +35,40 @@ const defaultOptions = {
34
35
  stopNodes: [],
35
36
  // transformTagName: false,
36
37
  // transformAttributeName: false,
37
- oneListGroup: false
38
+ oneListGroup: false,
39
+ maxNestedTags: 100,
40
+ jPath: true // When true, callbacks receive string jPath; when false, receive Matcher instance
38
41
  };
39
42
 
40
43
  export default function Builder(options) {
41
44
  this.options = Object.assign({}, defaultOptions, options);
45
+
46
+ // Convert old-style stopNodes for backward compatibility
47
+ // Old syntax: "*.tag" meant "tag anywhere in tree"
48
+ // New syntax: "..tag" means "tag anywhere in tree"
49
+ if (this.options.stopNodes && Array.isArray(this.options.stopNodes)) {
50
+ this.options.stopNodes = this.options.stopNodes.map(node => {
51
+ if (typeof node === 'string' && node.startsWith('*.')) {
52
+ // Convert old wildcard syntax to deep wildcard
53
+ return '..' + node.substring(2);
54
+ }
55
+ return node;
56
+ });
57
+ }
58
+
59
+ // Pre-compile stopNode expressions for pattern matching
60
+ this.stopNodeExpressions = [];
61
+ if (this.options.stopNodes && Array.isArray(this.options.stopNodes)) {
62
+ for (let i = 0; i < this.options.stopNodes.length; i++) {
63
+ const node = this.options.stopNodes[i];
64
+ if (typeof node === 'string') {
65
+ this.stopNodeExpressions.push(new Expression(node));
66
+ } else if (node instanceof Expression) {
67
+ this.stopNodeExpressions.push(node);
68
+ }
69
+ }
70
+ }
71
+
42
72
  if (this.options.ignoreAttributes === true || this.options.attributesGroupName) {
43
73
  this.isAttribute = function (/*a*/) {
44
74
  return false;
@@ -73,14 +103,24 @@ Builder.prototype.build = function (jObj) {
73
103
  [this.options.arrayNodeName]: jObj
74
104
  }
75
105
  }
76
- return this.j2x(jObj, 0, []).val;
106
+ // Initialize matcher for path tracking
107
+ const matcher = new Matcher();
108
+ return this.j2x(jObj, 0, matcher).val;
77
109
  }
78
110
  };
79
111
 
80
- Builder.prototype.j2x = function (jObj, level, ajPath) {
112
+ Builder.prototype.j2x = function (jObj, level, matcher) {
81
113
  let attrStr = '';
82
114
  let val = '';
83
- const jPath = ajPath.join('.')
115
+ if (this.options.maxNestedTags && matcher.getDepth() >= this.options.maxNestedTags) {
116
+ throw new Error("Maximum nested tags exceeded");
117
+ }
118
+ // Get jPath based on option: string for backward compatibility, or Matcher for new features
119
+ const jPath = this.options.jPath ? matcher.toString() : matcher;
120
+
121
+ // Check if current node is a stopNode (will be used for attribute encoding)
122
+ const isCurrentStopNode = this.checkStopNode(matcher);
123
+
84
124
  for (let key in jObj) {
85
125
  if (!Object.prototype.hasOwnProperty.call(jObj, key)) continue;
86
126
  if (typeof jObj[key] === 'undefined') {
@@ -101,19 +141,34 @@ Builder.prototype.j2x = function (jObj, level, ajPath) {
101
141
  }
102
142
  // val += this.indentate(level) + '<' + key + '/' + this.tagEndChar;
103
143
  } else if (jObj[key] instanceof Date) {
104
- val += this.buildTextValNode(jObj[key], key, '', level);
144
+ val += this.buildTextValNode(jObj[key], key, '', level, matcher);
105
145
  } else if (typeof jObj[key] !== 'object') {
106
146
  //premitive type
107
147
  const attr = this.isAttribute(key);
108
148
  if (attr && !this.ignoreAttributesFn(attr, jPath)) {
109
- attrStr += this.buildAttrPairStr(attr, '' + jObj[key]);
149
+ attrStr += this.buildAttrPairStr(attr, '' + jObj[key], isCurrentStopNode);
110
150
  } else if (!attr) {
111
151
  //tag value
112
152
  if (key === this.options.textNodeName) {
113
153
  let newval = this.options.tagValueProcessor(key, '' + jObj[key]);
114
154
  val += this.replaceEntitiesValue(newval);
115
155
  } else {
116
- val += this.buildTextValNode(jObj[key], key, '', level);
156
+ // Check if this is a stopNode before building
157
+ matcher.push(key);
158
+ const isStopNode = this.checkStopNode(matcher);
159
+ matcher.pop();
160
+
161
+ if (isStopNode) {
162
+ // Build as raw content without encoding
163
+ const textValue = '' + jObj[key];
164
+ if (textValue === '') {
165
+ val += this.indentate(level) + '<' + key + this.closeTag(key) + this.tagEndChar;
166
+ } else {
167
+ val += this.indentate(level) + '<' + key + '>' + textValue + '</' + key + this.tagEndChar;
168
+ }
169
+ } else {
170
+ val += this.buildTextValNode(jObj[key], key, '', level, matcher);
171
+ }
117
172
  }
118
173
  }
119
174
  } else if (Array.isArray(jObj[key])) {
@@ -131,13 +186,18 @@ Builder.prototype.j2x = function (jObj, level, ajPath) {
131
186
  // val += this.indentate(level) + '<' + key + '/' + this.tagEndChar;
132
187
  } else if (typeof item === 'object') {
133
188
  if (this.options.oneListGroup) {
134
- const result = this.j2x(item, level + 1, ajPath.concat(key));
189
+ // Push tag to matcher before recursive call
190
+ matcher.push(key);
191
+ const result = this.j2x(item, level + 1, matcher);
192
+ // Pop tag from matcher after recursive call
193
+ matcher.pop();
194
+
135
195
  listTagVal += result.val;
136
196
  if (this.options.attributesGroupName && item.hasOwnProperty(this.options.attributesGroupName)) {
137
197
  listTagAttr += result.attrStr
138
198
  }
139
199
  } else {
140
- listTagVal += this.processTextOrObjNode(item, key, level, ajPath)
200
+ listTagVal += this.processTextOrObjNode(item, key, level, matcher)
141
201
  }
142
202
  } else {
143
203
  if (this.options.oneListGroup) {
@@ -145,7 +205,22 @@ Builder.prototype.j2x = function (jObj, level, ajPath) {
145
205
  textValue = this.replaceEntitiesValue(textValue);
146
206
  listTagVal += textValue;
147
207
  } else {
148
- listTagVal += this.buildTextValNode(item, key, '', level);
208
+ // Check if this is a stopNode before building
209
+ matcher.push(key);
210
+ const isStopNode = this.checkStopNode(matcher);
211
+ matcher.pop();
212
+
213
+ if (isStopNode) {
214
+ // Build as raw content without encoding
215
+ const textValue = '' + item;
216
+ if (textValue === '') {
217
+ listTagVal += this.indentate(level) + '<' + key + this.closeTag(key) + this.tagEndChar;
218
+ } else {
219
+ listTagVal += this.indentate(level) + '<' + key + '>' + textValue + '</' + key + this.tagEndChar;
220
+ }
221
+ } else {
222
+ listTagVal += this.buildTextValNode(item, key, '', level, matcher);
223
+ }
149
224
  }
150
225
  }
151
226
  }
@@ -159,33 +234,191 @@ Builder.prototype.j2x = function (jObj, level, ajPath) {
159
234
  const Ks = Object.keys(jObj[key]);
160
235
  const L = Ks.length;
161
236
  for (let j = 0; j < L; j++) {
162
- attrStr += this.buildAttrPairStr(Ks[j], '' + jObj[key][Ks[j]]);
237
+ attrStr += this.buildAttrPairStr(Ks[j], '' + jObj[key][Ks[j]], isCurrentStopNode);
163
238
  }
164
239
  } else {
165
- val += this.processTextOrObjNode(jObj[key], key, level, ajPath)
240
+ val += this.processTextOrObjNode(jObj[key], key, level, matcher)
166
241
  }
167
242
  }
168
243
  }
169
244
  return { attrStr: attrStr, val: val };
170
245
  };
171
246
 
172
- Builder.prototype.buildAttrPairStr = function (attrName, val) {
173
- val = this.options.attributeValueProcessor(attrName, '' + val);
174
- val = this.replaceEntitiesValue(val);
247
+ Builder.prototype.buildAttrPairStr = function (attrName, val, isStopNode) {
248
+ if (!isStopNode) {
249
+ val = this.options.attributeValueProcessor(attrName, '' + val);
250
+ val = this.replaceEntitiesValue(val);
251
+ }
175
252
  if (this.options.suppressBooleanAttributes && val === "true") {
176
253
  return ' ' + attrName;
177
254
  } else return ' ' + attrName + '="' + val + '"';
178
255
  }
179
256
 
180
- function processTextOrObjNode(object, key, level, ajPath) {
181
- const result = this.j2x(object, level + 1, ajPath.concat(key));
257
+ function processTextOrObjNode(object, key, level, matcher) {
258
+ // Extract attributes to pass to matcher
259
+ const attrValues = this.extractAttributes(object);
260
+
261
+ // Push tag to matcher before recursion WITH attributes
262
+ matcher.push(key, attrValues);
263
+
264
+ // Check if this entire node is a stopNode
265
+ const isStopNode = this.checkStopNode(matcher);
266
+
267
+ if (isStopNode) {
268
+ // For stopNodes, build raw content without entity encoding
269
+ const rawContent = this.buildRawContent(object);
270
+ const attrStr = this.buildAttributesForStopNode(object);
271
+ matcher.pop();
272
+ return this.buildObjectNode(rawContent, key, attrStr, level);
273
+ }
274
+
275
+ const result = this.j2x(object, level + 1, matcher);
276
+ // Pop tag from matcher after recursion
277
+ matcher.pop();
278
+
182
279
  if (object[this.options.textNodeName] !== undefined && Object.keys(object).length === 1) {
183
- return this.buildTextValNode(object[this.options.textNodeName], key, result.attrStr, level);
280
+ return this.buildTextValNode(object[this.options.textNodeName], key, result.attrStr, level, matcher);
184
281
  } else {
185
282
  return this.buildObjectNode(result.val, key, result.attrStr, level);
186
283
  }
187
284
  }
188
285
 
286
+ // Helper method to extract attributes from an object
287
+ Builder.prototype.extractAttributes = function (obj) {
288
+ if (!obj || typeof obj !== 'object') return null;
289
+
290
+ const attrValues = {};
291
+ let hasAttrs = false;
292
+
293
+ // Check for attributesGroupName (when attributes are grouped)
294
+ if (this.options.attributesGroupName && obj[this.options.attributesGroupName]) {
295
+ const attrGroup = obj[this.options.attributesGroupName];
296
+ for (let attrKey in attrGroup) {
297
+ if (!Object.prototype.hasOwnProperty.call(attrGroup, attrKey)) continue;
298
+ // Remove attribute prefix if present
299
+ const cleanKey = attrKey.startsWith(this.options.attributeNamePrefix)
300
+ ? attrKey.substring(this.options.attributeNamePrefix.length)
301
+ : attrKey;
302
+ attrValues[cleanKey] = attrGroup[attrKey];
303
+ hasAttrs = true;
304
+ }
305
+ } else {
306
+ // Look for individual attributes (prefixed with attributeNamePrefix)
307
+ for (let key in obj) {
308
+ if (!Object.prototype.hasOwnProperty.call(obj, key)) continue;
309
+ const attr = this.isAttribute(key);
310
+ if (attr) {
311
+ attrValues[attr] = obj[key];
312
+ hasAttrs = true;
313
+ }
314
+ }
315
+ }
316
+
317
+ return hasAttrs ? attrValues : null;
318
+ };
319
+
320
+ // Build raw content for stopNode without entity encoding
321
+ Builder.prototype.buildRawContent = function (obj) {
322
+ if (typeof obj === 'string') {
323
+ return obj; // Already a string, return as-is
324
+ }
325
+
326
+ if (typeof obj !== 'object' || obj === null) {
327
+ return String(obj);
328
+ }
329
+
330
+ // Check if this is a stopNode data from parser: { "#text": "raw xml", "@_attr": "val" }
331
+ if (obj[this.options.textNodeName] !== undefined) {
332
+ return obj[this.options.textNodeName]; // Return raw text without encoding
333
+ }
334
+
335
+ // Build raw XML from nested structure
336
+ let content = '';
337
+
338
+ for (let key in obj) {
339
+ if (!Object.prototype.hasOwnProperty.call(obj, key)) continue;
340
+
341
+ // Skip attributes
342
+ if (this.isAttribute(key)) continue;
343
+ if (this.options.attributesGroupName && key === this.options.attributesGroupName) continue;
344
+
345
+ const value = obj[key];
346
+
347
+ if (key === this.options.textNodeName) {
348
+ content += value; // Raw text
349
+ } else if (Array.isArray(value)) {
350
+ // Array of same tag
351
+ for (let item of value) {
352
+ if (typeof item === 'string' || typeof item === 'number') {
353
+ content += `<${key}>${item}</${key}>`;
354
+ } else if (typeof item === 'object' && item !== null) {
355
+ const nestedContent = this.buildRawContent(item);
356
+ const nestedAttrs = this.buildAttributesForStopNode(item);
357
+ if (nestedContent === '') {
358
+ content += `<${key}${nestedAttrs}/>`;
359
+ } else {
360
+ content += `<${key}${nestedAttrs}>${nestedContent}</${key}>`;
361
+ }
362
+ }
363
+ }
364
+ } else if (typeof value === 'object' && value !== null) {
365
+ // Nested object
366
+ const nestedContent = this.buildRawContent(value);
367
+ const nestedAttrs = this.buildAttributesForStopNode(value);
368
+ if (nestedContent === '') {
369
+ content += `<${key}${nestedAttrs}/>`;
370
+ } else {
371
+ content += `<${key}${nestedAttrs}>${nestedContent}</${key}>`;
372
+ }
373
+ } else {
374
+ // Primitive value
375
+ content += `<${key}>${value}</${key}>`;
376
+ }
377
+ }
378
+
379
+ return content;
380
+ };
381
+
382
+ // Build attribute string for stopNode (no entity encoding)
383
+ Builder.prototype.buildAttributesForStopNode = function (obj) {
384
+ if (!obj || typeof obj !== 'object') return '';
385
+
386
+ let attrStr = '';
387
+
388
+ // Check for attributesGroupName (when attributes are grouped)
389
+ if (this.options.attributesGroupName && obj[this.options.attributesGroupName]) {
390
+ const attrGroup = obj[this.options.attributesGroupName];
391
+ for (let attrKey in attrGroup) {
392
+ if (!Object.prototype.hasOwnProperty.call(attrGroup, attrKey)) continue;
393
+ const cleanKey = attrKey.startsWith(this.options.attributeNamePrefix)
394
+ ? attrKey.substring(this.options.attributeNamePrefix.length)
395
+ : attrKey;
396
+ const val = attrGroup[attrKey];
397
+ if (val === true && this.options.suppressBooleanAttributes) {
398
+ attrStr += ' ' + cleanKey;
399
+ } else {
400
+ attrStr += ' ' + cleanKey + '="' + val + '"'; // No encoding for stopNode
401
+ }
402
+ }
403
+ } else {
404
+ // Look for individual attributes
405
+ for (let key in obj) {
406
+ if (!Object.prototype.hasOwnProperty.call(obj, key)) continue;
407
+ const attr = this.isAttribute(key);
408
+ if (attr) {
409
+ const val = obj[key];
410
+ if (val === true && this.options.suppressBooleanAttributes) {
411
+ attrStr += ' ' + attr;
412
+ } else {
413
+ attrStr += ' ' + attr + '="' + val + '"'; // No encoding for stopNode
414
+ }
415
+ }
416
+ }
417
+ }
418
+
419
+ return attrStr;
420
+ };
421
+
189
422
  Builder.prototype.buildObjectNode = function (val, key, attrStr, level) {
190
423
  if (val === "") {
191
424
  if (key[0] === "?") return this.indentate(level) + '<' + key + attrStr + '?' + this.tagEndChar;
@@ -228,6 +461,17 @@ Builder.prototype.closeTag = function (key) {
228
461
  return closeTag;
229
462
  }
230
463
 
464
+ Builder.prototype.checkStopNode = function (matcher) {
465
+ if (!this.stopNodeExpressions || this.stopNodeExpressions.length === 0) return false;
466
+
467
+ for (let i = 0; i < this.stopNodeExpressions.length; i++) {
468
+ if (matcher.matches(this.stopNodeExpressions[i])) {
469
+ return true;
470
+ }
471
+ }
472
+ return false;
473
+ }
474
+
231
475
  function buildEmptyObjNode(val, key, attrStr, level) {
232
476
  if (val !== '') {
233
477
  return this.buildObjectNode(val, key, attrStr, level);
@@ -240,7 +484,7 @@ function buildEmptyObjNode(val, key, attrStr, level) {
240
484
  }
241
485
  }
242
486
 
243
- Builder.prototype.buildTextValNode = function (val, key, attrStr, level) {
487
+ Builder.prototype.buildTextValNode = function (val, key, attrStr, level, matcher) {
244
488
  if (this.options.cdataPropName !== false && key === this.options.cdataPropName) {
245
489
  return this.indentate(level) + `<![CDATA[${val}]]>` + this.newLine;
246
490
  } else if (this.options.commentPropName !== false && key === this.options.commentPropName) {
@@ -248,6 +492,7 @@ Builder.prototype.buildTextValNode = function (val, key, attrStr, level) {
248
492
  } else if (key[0] === "?") {//PI tag
249
493
  return this.indentate(level) + '<' + key + attrStr + '?' + this.tagEndChar;
250
494
  } else {
495
+ // Normal processing: apply tagValueProcessor and entity replacement
251
496
  let textValue = this.options.tagValueProcessor(key, val);
252
497
  textValue = this.replaceEntitiesValue(textValue);
253
498
 
@@ -281,5 +526,4 @@ function isAttribute(name /*, options*/) {
281
526
  } else {
282
527
  return false;
283
528
  }
284
- }
285
-
529
+ }
@@ -1,3 +1,5 @@
1
+ import { Expression, Matcher } from 'path-expression-matcher';
2
+
1
3
  const EOL = "\n";
2
4
 
3
5
  /**
@@ -11,13 +13,33 @@ export default function toXml(jArray, options) {
11
13
  if (options.format && options.indentBy.length > 0) {
12
14
  indentation = EOL;
13
15
  }
14
- return arrToStr(jArray, options, "", indentation);
16
+
17
+ // Pre-compile stopNode expressions for pattern matching
18
+ const stopNodeExpressions = [];
19
+ if (options.stopNodes && Array.isArray(options.stopNodes)) {
20
+ for (let i = 0; i < options.stopNodes.length; i++) {
21
+ const node = options.stopNodes[i];
22
+ if (typeof node === 'string') {
23
+ stopNodeExpressions.push(new Expression(node));
24
+ } else if (node instanceof Expression) {
25
+ stopNodeExpressions.push(node);
26
+ }
27
+ }
28
+ }
29
+
30
+ // Initialize matcher for path tracking
31
+ const matcher = new Matcher();
32
+
33
+ return arrToStr(jArray, options, indentation, matcher, stopNodeExpressions);
15
34
  }
16
35
 
17
- function arrToStr(arr, options, jPath, indentation) {
36
+ function arrToStr(arr, options, indentation, matcher, stopNodeExpressions) {
18
37
  let xmlStr = "";
19
38
  let isPreviousElementTag = false;
20
39
 
40
+ if (options.maxNestedTags && matcher.getDepth() > options.maxNestedTags) {
41
+ throw new Error("Maximum nested tags exceeded");
42
+ }
21
43
 
22
44
  if (!Array.isArray(arr)) {
23
45
  // Non-array values (e.g. string tag values) should be treated as text content
@@ -34,13 +56,18 @@ function arrToStr(arr, options, jPath, indentation) {
34
56
  const tagName = propName(tagObj);
35
57
  if (tagName === undefined) continue;
36
58
 
37
- let newJPath = "";
38
- if (jPath.length === 0) newJPath = tagName
39
- else newJPath = `${jPath}.${tagName}`;
59
+ // Extract attributes from ":@" property
60
+ const attrValues = extractAttributeValues(tagObj[":@"], options);
61
+
62
+ // Push tag to matcher WITH attributes
63
+ matcher.push(tagName, attrValues);
64
+
65
+ // Check if this is a stop node using Expression matching
66
+ const isStopNode = checkStopNode(matcher, stopNodeExpressions);
40
67
 
41
68
  if (tagName === options.textNodeName) {
42
69
  let tagText = tagObj[tagName];
43
- if (!isStopNode(newJPath, options)) {
70
+ if (!isStopNode) {
44
71
  tagText = options.tagValueProcessor(tagName, tagText);
45
72
  tagText = replaceEntitiesValue(tagText, options);
46
73
  }
@@ -49,6 +76,7 @@ function arrToStr(arr, options, jPath, indentation) {
49
76
  }
50
77
  xmlStr += tagText;
51
78
  isPreviousElementTag = false;
79
+ matcher.pop();
52
80
  continue;
53
81
  } else if (tagName === options.cdataPropName) {
54
82
  if (isPreviousElementTag) {
@@ -56,27 +84,42 @@ function arrToStr(arr, options, jPath, indentation) {
56
84
  }
57
85
  xmlStr += `<![CDATA[${tagObj[tagName][0][options.textNodeName]}]]>`;
58
86
  isPreviousElementTag = false;
87
+ matcher.pop();
59
88
  continue;
60
89
  } else if (tagName === options.commentPropName) {
61
90
  xmlStr += indentation + `<!--${tagObj[tagName][0][options.textNodeName]}-->`;
62
91
  isPreviousElementTag = true;
92
+ matcher.pop();
63
93
  continue;
64
94
  } else if (tagName[0] === "?") {
65
- const attStr = attr_to_str(tagObj[":@"], options);
95
+ const attStr = attr_to_str(tagObj[":@"], options, isStopNode);
66
96
  const tempInd = tagName === "?xml" ? "" : indentation;
67
97
  let piTextNodeName = tagObj[tagName][0][options.textNodeName];
68
98
  piTextNodeName = piTextNodeName.length !== 0 ? " " + piTextNodeName : ""; //remove extra spacing
69
99
  xmlStr += tempInd + `<${tagName}${piTextNodeName}${attStr}?>`;
70
100
  isPreviousElementTag = true;
101
+ matcher.pop();
71
102
  continue;
72
103
  }
104
+
73
105
  let newIdentation = indentation;
74
106
  if (newIdentation !== "") {
75
107
  newIdentation += options.indentBy;
76
108
  }
77
- const attStr = attr_to_str(tagObj[":@"], options);
109
+
110
+ // Pass isStopNode to attr_to_str so attributes are also not processed for stopNodes
111
+ const attStr = attr_to_str(tagObj[":@"], options, isStopNode);
78
112
  const tagStart = indentation + `<${tagName}${attStr}`;
79
- const tagValue = arrToStr(tagObj[tagName], options, newJPath, newIdentation);
113
+
114
+ // If this is a stopNode, get raw content without processing
115
+ let tagValue;
116
+ if (isStopNode) {
117
+ tagValue = getRawContent(tagObj[tagName], options);
118
+ } else {
119
+
120
+ tagValue = arrToStr(tagObj[tagName], options, newIdentation, matcher, stopNodeExpressions);
121
+ }
122
+
80
123
  if (options.unpairedTags.indexOf(tagName) !== -1) {
81
124
  if (options.suppressUnpairedNode) xmlStr += tagStart + ">";
82
125
  else xmlStr += tagStart + "/>";
@@ -94,11 +137,104 @@ function arrToStr(arr, options, jPath, indentation) {
94
137
  xmlStr += `</${tagName}>`;
95
138
  }
96
139
  isPreviousElementTag = true;
140
+
141
+ // Pop tag from matcher
142
+ matcher.pop();
97
143
  }
98
144
 
99
145
  return xmlStr;
100
146
  }
101
147
 
148
+ /**
149
+ * Extract attribute values from the ":@" object and return as plain object
150
+ * for passing to matcher.push()
151
+ */
152
+ function extractAttributeValues(attrMap, options) {
153
+ if (!attrMap || options.ignoreAttributes) return null;
154
+
155
+ const attrValues = {};
156
+ let hasAttrs = false;
157
+
158
+ for (let attr in attrMap) {
159
+ if (!Object.prototype.hasOwnProperty.call(attrMap, attr)) continue;
160
+ // Remove the attribute prefix to get clean attribute name
161
+ const cleanAttrName = attr.startsWith(options.attributeNamePrefix)
162
+ ? attr.substr(options.attributeNamePrefix.length)
163
+ : attr;
164
+ attrValues[cleanAttrName] = attrMap[attr];
165
+ hasAttrs = true;
166
+ }
167
+
168
+ return hasAttrs ? attrValues : null;
169
+ }
170
+
171
+ /**
172
+ * Extract raw content from a stopNode without any processing
173
+ * This preserves the content exactly as-is, including special characters
174
+ */
175
+ function getRawContent(arr, options) {
176
+ if (!Array.isArray(arr)) {
177
+ // Non-array values return as-is
178
+ if (arr !== undefined && arr !== null) {
179
+ return arr.toString();
180
+ }
181
+ return "";
182
+ }
183
+
184
+ let content = "";
185
+ for (let i = 0; i < arr.length; i++) {
186
+ const item = arr[i];
187
+ const tagName = propName(item);
188
+
189
+ if (tagName === options.textNodeName) {
190
+ // Raw text content - NO processing, NO entity replacement
191
+ content += item[tagName];
192
+ } else if (tagName === options.cdataPropName) {
193
+ // CDATA content
194
+ content += item[tagName][0][options.textNodeName];
195
+ } else if (tagName === options.commentPropName) {
196
+ // Comment content
197
+ content += item[tagName][0][options.textNodeName];
198
+ } else if (tagName && tagName[0] === "?") {
199
+ // Processing instruction - skip for stopNodes
200
+ continue;
201
+ } else if (tagName) {
202
+ // Nested tags within stopNode
203
+ // Recursively get raw content and reconstruct the tag
204
+ // For stopNodes, we don't process attributes either
205
+ const attStr = attr_to_str_raw(item[":@"], options);
206
+ const nestedContent = getRawContent(item[tagName], options);
207
+
208
+ if (!nestedContent || nestedContent.length === 0) {
209
+ content += `<${tagName}${attStr}/>`;
210
+ } else {
211
+ content += `<${tagName}${attStr}>${nestedContent}</${tagName}>`;
212
+ }
213
+ }
214
+ }
215
+ return content;
216
+ }
217
+
218
+ /**
219
+ * Build attribute string for stopNodes - NO entity replacement
220
+ */
221
+ function attr_to_str_raw(attrMap, options) {
222
+ let attrStr = "";
223
+ if (attrMap && !options.ignoreAttributes) {
224
+ for (let attr in attrMap) {
225
+ if (!Object.prototype.hasOwnProperty.call(attrMap, attr)) continue;
226
+ // For stopNodes, use raw value without processing
227
+ let attrVal = attrMap[attr];
228
+ if (attrVal === true && options.suppressBooleanAttributes) {
229
+ attrStr += ` ${attr.substr(options.attributeNamePrefix.length)}`;
230
+ } else {
231
+ attrStr += ` ${attr.substr(options.attributeNamePrefix.length)}="${attrVal}"`;
232
+ }
233
+ }
234
+ }
235
+ return attrStr;
236
+ }
237
+
102
238
  function propName(obj) {
103
239
  const keys = Object.keys(obj);
104
240
  for (let i = 0; i < keys.length; i++) {
@@ -108,13 +244,22 @@ function propName(obj) {
108
244
  }
109
245
  }
110
246
 
111
- function attr_to_str(attrMap, options) {
247
+ function attr_to_str(attrMap, options, isStopNode) {
112
248
  let attrStr = "";
113
249
  if (attrMap && !options.ignoreAttributes) {
114
250
  for (let attr in attrMap) {
115
251
  if (!Object.prototype.hasOwnProperty.call(attrMap, attr)) continue;
116
- let attrVal = options.attributeValueProcessor(attr, attrMap[attr]);
117
- attrVal = replaceEntitiesValue(attrVal, options);
252
+ let attrVal;
253
+
254
+ if (isStopNode) {
255
+ // For stopNodes, use raw value without any processing
256
+ attrVal = attrMap[attr];
257
+ } else {
258
+ // Normal processing: apply attributeValueProcessor and entity replacement
259
+ attrVal = options.attributeValueProcessor(attr, attrMap[attr]);
260
+ attrVal = replaceEntitiesValue(attrVal, options);
261
+ }
262
+
118
263
  if (attrVal === true && options.suppressBooleanAttributes) {
119
264
  attrStr += ` ${attr.substr(options.attributeNamePrefix.length)}`;
120
265
  } else {
@@ -125,11 +270,13 @@ function attr_to_str(attrMap, options) {
125
270
  return attrStr;
126
271
  }
127
272
 
128
- function isStopNode(jPath, options) {
129
- jPath = jPath.substr(0, jPath.length - options.textNodeName.length - 1);
130
- let tagName = jPath.substr(jPath.lastIndexOf(".") + 1);
131
- for (let index in options.stopNodes) {
132
- if (options.stopNodes[index] === jPath || options.stopNodes[index] === "*." + tagName) return true;
273
+ function checkStopNode(matcher, stopNodeExpressions) {
274
+ if (!stopNodeExpressions || stopNodeExpressions.length === 0) return false;
275
+
276
+ for (let i = 0; i < stopNodeExpressions.length; i++) {
277
+ if (matcher.matches(stopNodeExpressions[i])) {
278
+ return true;
279
+ }
133
280
  }
134
281
  return false;
135
282
  }
@@ -142,4 +289,4 @@ function replaceEntitiesValue(textValue, options) {
142
289
  }
143
290
  }
144
291
  return textValue;
145
- }
292
+ }