@mavogel/awscdk-rootmail 0.0.330 → 0.0.331

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 (171) hide show
  1. package/.jsii +3 -3
  2. package/lib/rootmail.js +1 -1
  3. package/lib/ses-receive.js +1 -1
  4. package/node_modules/@aws-sdk/client-cloudwatch-logs/package.json +16 -16
  5. package/node_modules/@aws-sdk/client-route-53/package.json +16 -16
  6. package/node_modules/@aws-sdk/client-s3/package.json +21 -21
  7. package/node_modules/@aws-sdk/client-ses/package.json +15 -15
  8. package/node_modules/@aws-sdk/client-ssm/package.json +15 -15
  9. package/node_modules/@aws-sdk/core/dist-cjs/index.js +54 -21
  10. package/node_modules/@aws-sdk/core/dist-cjs/submodules/protocols/index.js +54 -21
  11. package/node_modules/@aws-sdk/core/dist-es/submodules/protocols/ProtocolLib.js +24 -6
  12. package/node_modules/@aws-sdk/core/dist-es/submodules/protocols/cbor/AwsSmithyRpcV2CborProtocol.js +6 -5
  13. package/node_modules/@aws-sdk/core/dist-es/submodules/protocols/json/AwsJson1_0Protocol.js +2 -1
  14. package/node_modules/@aws-sdk/core/dist-es/submodules/protocols/json/AwsJson1_1Protocol.js +2 -1
  15. package/node_modules/@aws-sdk/core/dist-es/submodules/protocols/json/AwsJsonRpcProtocol.js +6 -4
  16. package/node_modules/@aws-sdk/core/dist-es/submodules/protocols/json/AwsRestJsonProtocol.js +6 -4
  17. package/node_modules/@aws-sdk/core/dist-es/submodules/protocols/query/AwsQueryProtocol.js +4 -2
  18. package/node_modules/@aws-sdk/core/dist-es/submodules/protocols/xml/AwsRestXmlProtocol.js +9 -3
  19. package/node_modules/@aws-sdk/core/dist-types/submodules/protocols/ProtocolLib.d.ts +13 -0
  20. package/node_modules/@aws-sdk/core/dist-types/submodules/protocols/cbor/AwsSmithyRpcV2CborProtocol.d.ts +3 -1
  21. package/node_modules/@aws-sdk/core/dist-types/submodules/protocols/json/AwsJson1_0Protocol.d.ts +3 -1
  22. package/node_modules/@aws-sdk/core/dist-types/submodules/protocols/json/AwsJson1_1Protocol.d.ts +3 -1
  23. package/node_modules/@aws-sdk/core/dist-types/submodules/protocols/json/AwsJsonRpcProtocol.d.ts +3 -1
  24. package/node_modules/@aws-sdk/core/dist-types/submodules/protocols/json/AwsRestJsonProtocol.d.ts +3 -1
  25. package/node_modules/@aws-sdk/core/dist-types/submodules/protocols/query/AwsEc2QueryProtocol.d.ts +3 -0
  26. package/node_modules/@aws-sdk/core/dist-types/submodules/protocols/query/AwsQueryProtocol.d.ts +3 -0
  27. package/node_modules/@aws-sdk/core/dist-types/submodules/protocols/xml/AwsRestXmlProtocol.d.ts +2 -0
  28. package/node_modules/@aws-sdk/core/dist-types/ts3.4/submodules/protocols/ProtocolLib.d.ts +6 -0
  29. package/node_modules/@aws-sdk/core/dist-types/ts3.4/submodules/protocols/cbor/AwsSmithyRpcV2CborProtocol.d.ts +3 -0
  30. package/node_modules/@aws-sdk/core/dist-types/ts3.4/submodules/protocols/json/AwsJson1_0Protocol.d.ts +3 -0
  31. package/node_modules/@aws-sdk/core/dist-types/ts3.4/submodules/protocols/json/AwsJson1_1Protocol.d.ts +3 -0
  32. package/node_modules/@aws-sdk/core/dist-types/ts3.4/submodules/protocols/json/AwsJsonRpcProtocol.d.ts +3 -0
  33. package/node_modules/@aws-sdk/core/dist-types/ts3.4/submodules/protocols/json/AwsRestJsonProtocol.d.ts +8 -1
  34. package/node_modules/@aws-sdk/core/dist-types/ts3.4/submodules/protocols/query/AwsEc2QueryProtocol.d.ts +3 -0
  35. package/node_modules/@aws-sdk/core/dist-types/ts3.4/submodules/protocols/query/AwsQueryProtocol.d.ts +3 -0
  36. package/node_modules/@aws-sdk/core/dist-types/ts3.4/submodules/protocols/xml/AwsRestXmlProtocol.d.ts +6 -1
  37. package/node_modules/@aws-sdk/core/package.json +4 -4
  38. package/node_modules/@aws-sdk/credential-provider-env/package.json +2 -2
  39. package/node_modules/@aws-sdk/credential-provider-http/package.json +5 -5
  40. package/node_modules/@aws-sdk/credential-provider-ini/package.json +9 -9
  41. package/node_modules/@aws-sdk/credential-provider-login/package.json +3 -3
  42. package/node_modules/@aws-sdk/credential-provider-node/package.json +7 -7
  43. package/node_modules/@aws-sdk/credential-provider-process/package.json +2 -2
  44. package/node_modules/@aws-sdk/credential-provider-sso/package.json +4 -4
  45. package/node_modules/@aws-sdk/credential-provider-web-identity/package.json +3 -3
  46. package/node_modules/@aws-sdk/middleware-flexible-checksums/package.json +4 -4
  47. package/node_modules/@aws-sdk/middleware-sdk-s3/package.json +5 -5
  48. package/node_modules/@aws-sdk/middleware-user-agent/package.json +3 -3
  49. package/node_modules/@aws-sdk/nested-clients/package.json +14 -14
  50. package/node_modules/@aws-sdk/region-config-resolver/package.json +2 -2
  51. package/node_modules/@aws-sdk/signature-v4-multi-region/package.json +2 -2
  52. package/node_modules/@aws-sdk/token-providers/package.json +3 -3
  53. package/node_modules/@aws-sdk/util-user-agent-node/package.json +2 -2
  54. package/node_modules/@aws-sdk/xml-builder/dist-cjs/index.js +21 -11
  55. package/node_modules/@aws-sdk/xml-builder/dist-cjs/xml-parser.js +5 -1
  56. package/node_modules/@aws-sdk/xml-builder/dist-es/escape-attribute.js +8 -1
  57. package/node_modules/@aws-sdk/xml-builder/dist-es/escape-element.js +13 -10
  58. package/node_modules/@aws-sdk/xml-builder/dist-es/xml-parser.js +5 -1
  59. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/CHANGELOG.md +40 -4
  60. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/README.md +8 -7
  61. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/lib/fxbuilder.min.js +1 -1
  62. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/lib/fxbuilder.min.js.map +1 -1
  63. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/lib/fxp.cjs +1 -1
  64. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/lib/fxp.d.cts +82 -20
  65. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/lib/fxp.min.js +1 -1
  66. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/lib/fxp.min.js.map +1 -1
  67. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/lib/fxparser.min.js +1 -1
  68. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/lib/fxparser.min.js.map +1 -1
  69. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/lib/fxvalidator.min.js.map +1 -1
  70. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/lib/pem.d.cts +148 -0
  71. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/package.json +4 -3
  72. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/src/fxp.d.ts +75 -19
  73. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/src/pem.d.ts +135 -0
  74. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/src/util.js +18 -0
  75. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/src/xmlparser/DocTypeReader.js +37 -18
  76. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/src/xmlparser/OptionsBuilder.js +76 -5
  77. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/src/xmlparser/OrderedObjParser.js +298 -116
  78. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/src/xmlparser/XMLParser.js +2 -2
  79. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/src/xmlparser/node2json.js +65 -15
  80. package/node_modules/@aws-sdk/xml-builder/package.json +2 -2
  81. package/node_modules/@smithy/config-resolver/dist-cjs/index.js +12 -0
  82. package/node_modules/@smithy/config-resolver/dist-es/endpointsConfig/NodeUseDualstackEndpointConfigOptions.js +5 -0
  83. package/node_modules/@smithy/config-resolver/dist-es/endpointsConfig/NodeUseFipsEndpointConfigOptions.js +5 -0
  84. package/node_modules/@smithy/config-resolver/dist-types/endpointsConfig/NodeUseDualstackEndpointConfigOptions.d.ts +6 -0
  85. package/node_modules/@smithy/config-resolver/dist-types/endpointsConfig/NodeUseFipsEndpointConfigOptions.d.ts +6 -0
  86. package/node_modules/@smithy/config-resolver/dist-types/ts3.4/endpointsConfig/NodeUseDualstackEndpointConfigOptions.d.ts +6 -0
  87. package/node_modules/@smithy/config-resolver/dist-types/ts3.4/endpointsConfig/NodeUseFipsEndpointConfigOptions.d.ts +6 -0
  88. package/node_modules/@smithy/config-resolver/package.json +1 -1
  89. package/node_modules/@smithy/middleware-endpoint/dist-types/resolveEndpointConfig.d.ts +2 -2
  90. package/node_modules/@smithy/middleware-endpoint/dist-types/ts3.4/resolveEndpointConfig.d.ts +2 -2
  91. package/node_modules/@smithy/middleware-endpoint/package.json +1 -1
  92. package/node_modules/@smithy/middleware-retry/package.json +2 -2
  93. package/node_modules/@smithy/smithy-client/package.json +2 -2
  94. package/node_modules/@smithy/util-defaults-mode-browser/package.json +2 -2
  95. package/node_modules/@smithy/util-defaults-mode-node/package.json +3 -3
  96. package/node_modules/fast-xml-builder/CHANGELOG.md +16 -0
  97. package/node_modules/fast-xml-builder/README.md +1 -1
  98. package/node_modules/fast-xml-builder/lib/fxb.cjs +1 -0
  99. package/node_modules/fast-xml-builder/lib/fxb.d.cts +22 -9
  100. package/node_modules/fast-xml-builder/lib/fxb.min.js +2 -0
  101. package/node_modules/fast-xml-builder/lib/fxb.min.js.map +1 -0
  102. package/node_modules/fast-xml-builder/package.json +7 -5
  103. package/node_modules/fast-xml-builder/src/fxb.d.ts +27 -3
  104. package/node_modules/fast-xml-builder/src/fxb.js +265 -21
  105. package/node_modules/fast-xml-builder/src/orderedJs2Xml.js +165 -18
  106. package/node_modules/mailparser/.release-please-manifest.json +1 -1
  107. package/node_modules/mailparser/CHANGELOG.md +7 -0
  108. package/node_modules/mailparser/package.json +3 -3
  109. package/node_modules/nodemailer/CHANGELOG.md +10 -0
  110. package/node_modules/nodemailer/lib/addressparser/index.js +68 -83
  111. package/node_modules/nodemailer/lib/base64/index.js +6 -5
  112. package/node_modules/nodemailer/lib/dkim/index.js +8 -16
  113. package/node_modules/nodemailer/lib/dkim/message-parser.js +12 -13
  114. package/node_modules/nodemailer/lib/dkim/relaxed-body.js +2 -2
  115. package/node_modules/nodemailer/lib/dkim/sign.js +13 -14
  116. package/node_modules/nodemailer/lib/errors.js +4 -7
  117. package/node_modules/nodemailer/lib/fetch/cookies.js +13 -18
  118. package/node_modules/nodemailer/lib/fetch/index.js +12 -15
  119. package/node_modules/nodemailer/lib/json-transport/index.js +4 -4
  120. package/node_modules/nodemailer/lib/mail-composer/index.js +86 -116
  121. package/node_modules/nodemailer/lib/mailer/index.js +26 -26
  122. package/node_modules/nodemailer/lib/mailer/mail-message.js +17 -21
  123. package/node_modules/nodemailer/lib/mime-funcs/index.js +25 -40
  124. package/node_modules/nodemailer/lib/mime-funcs/mime-types.js +7 -11
  125. package/node_modules/nodemailer/lib/mime-node/index.js +81 -72
  126. package/node_modules/nodemailer/lib/mime-node/last-newline.js +1 -1
  127. package/node_modules/nodemailer/lib/mime-node/le-unix.js +4 -7
  128. package/node_modules/nodemailer/lib/mime-node/le-windows.js +1 -4
  129. package/node_modules/nodemailer/lib/nodemailer.js +11 -18
  130. package/node_modules/nodemailer/lib/qp/index.js +24 -21
  131. package/node_modules/nodemailer/lib/sendmail-transport/index.js +30 -41
  132. package/node_modules/nodemailer/lib/ses-transport/index.js +23 -34
  133. package/node_modules/nodemailer/lib/shared/index.js +94 -140
  134. package/node_modules/nodemailer/lib/smtp-connection/data-stream.js +3 -6
  135. package/node_modules/nodemailer/lib/smtp-connection/http-proxy-client.js +11 -13
  136. package/node_modules/nodemailer/lib/smtp-connection/index.js +114 -181
  137. package/node_modules/nodemailer/lib/smtp-pool/index.js +20 -32
  138. package/node_modules/nodemailer/lib/smtp-pool/pool-resource.js +8 -12
  139. package/node_modules/nodemailer/lib/smtp-transport/index.js +22 -42
  140. package/node_modules/nodemailer/lib/stream-transport/index.js +7 -7
  141. package/node_modules/nodemailer/lib/well-known/index.js +7 -7
  142. package/node_modules/nodemailer/lib/xoauth2/index.js +22 -28
  143. package/node_modules/nodemailer/package.json +4 -3
  144. package/node_modules/path-expression-matcher/LICENSE +21 -0
  145. package/node_modules/path-expression-matcher/README.md +720 -0
  146. package/node_modules/path-expression-matcher/lib/pem.cjs +1 -0
  147. package/node_modules/path-expression-matcher/lib/pem.d.cts +523 -0
  148. package/node_modules/path-expression-matcher/lib/pem.min.js +2 -0
  149. package/node_modules/path-expression-matcher/lib/pem.min.js.map +1 -0
  150. package/node_modules/path-expression-matcher/package.json +78 -0
  151. package/node_modules/path-expression-matcher/src/Expression.js +232 -0
  152. package/node_modules/path-expression-matcher/src/Matcher.js +498 -0
  153. package/node_modules/path-expression-matcher/src/index.d.ts +518 -0
  154. package/node_modules/path-expression-matcher/src/index.js +28 -0
  155. package/node_modules/{@aws-sdk/xml-builder/node_modules/strnum → strnum}/CHANGELOG.md +9 -2
  156. package/node_modules/{@aws-sdk/xml-builder/node_modules/strnum → strnum}/README.md +1 -0
  157. package/node_modules/{@aws-sdk/xml-builder/node_modules/strnum → strnum}/package.json +3 -3
  158. package/node_modules/strnum/strnum.js +161 -0
  159. package/node_modules/strnum/tests/infinity_test.js +18 -0
  160. package/node_modules/{@aws-sdk/xml-builder/node_modules/strnum/strnum.test.js → strnum/tests/strnum_test.js} +70 -68
  161. package/node_modules/strnum/tests/temp.js +8 -0
  162. package/package.json +1 -1
  163. package/node_modules/@aws-sdk/xml-builder/node_modules/strnum/strnum.js +0 -129
  164. package/node_modules/@aws-sdk/xml-builder/node_modules/strnum/test.js +0 -9
  165. package/node_modules/fast-xml-builder/lib/builder.cjs +0 -1
  166. package/node_modules/fast-xml-builder/lib/builder.min.js +0 -2
  167. package/node_modules/fast-xml-builder/lib/builder.min.js.map +0 -1
  168. /package/node_modules/{@aws-sdk/xml-builder/node_modules/strnum → strnum}/.github/SECURITY.md +0 -0
  169. /package/node_modules/{@aws-sdk/xml-builder/node_modules/strnum → strnum}/.vscode/launch.json +0 -0
  170. /package/node_modules/{@aws-sdk/xml-builder/node_modules/strnum → strnum}/LICENSE +0 -0
  171. /package/node_modules/{@aws-sdk/xml-builder/node_modules/strnum → strnum}/algo.stflow +0 -0
@@ -0,0 +1,78 @@
1
+ {
2
+ "name": "path-expression-matcher",
3
+ "version": "1.2.0",
4
+ "description": "Efficient path tracking and pattern matching for XML/JSON parsers",
5
+ "main": "./lib/pem.cjs",
6
+ "type": "module",
7
+ "sideEffects": false,
8
+ "module": "./src/index.js",
9
+ "types": "./src/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "import": {
13
+ "types": "./src/index.d.ts",
14
+ "default": "./src/index.js"
15
+ },
16
+ "require": {
17
+ "types": "./lib/pem.d.cts",
18
+ "default": "./lib/pem.cjs"
19
+ }
20
+ }
21
+ },
22
+ "scripts": {
23
+ "test": "c8 --reporter=lcov --reporter=text node test/*test.js",
24
+ "bundle": "webpack --config webpack.cjs.config.js"
25
+ },
26
+ "keywords": [
27
+ "xml",
28
+ "json",
29
+ "yaml",
30
+ "path",
31
+ "matcher",
32
+ "pattern",
33
+ "xpath",
34
+ "selector",
35
+ "parser",
36
+ "fast-xml-parser",
37
+ "fast-xml-builder"
38
+ ],
39
+ "author": "Amit Gupta (https://solothought.com)",
40
+ "license": "MIT",
41
+ "repository": {
42
+ "type": "git",
43
+ "url": "https://github.com/NaturalIntelligence/path-expression-matcher"
44
+ },
45
+ "bugs": {
46
+ "url": "https://github.com/NaturalIntelligence/path-expression-matcher/issues"
47
+ },
48
+ "homepage": "https://github.com/NaturalIntelligence/path-expression-matcher#readme",
49
+ "engines": {
50
+ "node": ">=14.0.0"
51
+ },
52
+ "files": [
53
+ "lib",
54
+ "src/",
55
+ "README.md",
56
+ "LICENSE"
57
+ ],
58
+ "devDependencies": {
59
+ "@babel/core": "^7.13.10",
60
+ "@babel/plugin-transform-runtime": "^7.13.10",
61
+ "@babel/preset-env": "^7.13.10",
62
+ "@babel/register": "^7.13.8",
63
+ "@types/node": "20",
64
+ "babel-loader": "^8.2.2",
65
+ "c8": "^10.1.3",
66
+ "eslint": "^8.3.0",
67
+ "prettier": "^3.5.1",
68
+ "typescript": "5",
69
+ "webpack": "^5.64.4",
70
+ "webpack-cli": "^4.9.1"
71
+ },
72
+ "funding": [
73
+ {
74
+ "type": "github",
75
+ "url": "https://github.com/sponsors/NaturalIntelligence"
76
+ }
77
+ ]
78
+ }
@@ -0,0 +1,232 @@
1
+ /**
2
+ * Expression - Parses and stores a tag pattern expression
3
+ *
4
+ * Patterns are parsed once and stored in an optimized structure for fast matching.
5
+ *
6
+ * @example
7
+ * const expr = new Expression("root.users.user");
8
+ * const expr2 = new Expression("..user[id]:first");
9
+ * const expr3 = new Expression("root/users/user", { separator: '/' });
10
+ */
11
+ export default class Expression {
12
+ /**
13
+ * Create a new Expression
14
+ * @param {string} pattern - Pattern string (e.g., "root.users.user", "..user[id]")
15
+ * @param {Object} options - Configuration options
16
+ * @param {string} options.separator - Path separator (default: '.')
17
+ */
18
+ constructor(pattern, options = {}) {
19
+ this.pattern = pattern;
20
+ this.separator = options.separator || '.';
21
+ this.segments = this._parse(pattern);
22
+
23
+ // Cache expensive checks for performance (O(1) instead of O(n))
24
+ this._hasDeepWildcard = this.segments.some(seg => seg.type === 'deep-wildcard');
25
+ this._hasAttributeCondition = this.segments.some(seg => seg.attrName !== undefined);
26
+ this._hasPositionSelector = this.segments.some(seg => seg.position !== undefined);
27
+ }
28
+
29
+ /**
30
+ * Parse pattern string into segments
31
+ * @private
32
+ * @param {string} pattern - Pattern to parse
33
+ * @returns {Array} Array of segment objects
34
+ */
35
+ _parse(pattern) {
36
+ const segments = [];
37
+
38
+ // Split by separator but handle ".." specially
39
+ let i = 0;
40
+ let currentPart = '';
41
+
42
+ while (i < pattern.length) {
43
+ if (pattern[i] === this.separator) {
44
+ // Check if next char is also separator (deep wildcard)
45
+ if (i + 1 < pattern.length && pattern[i + 1] === this.separator) {
46
+ // Flush current part if any
47
+ if (currentPart.trim()) {
48
+ segments.push(this._parseSegment(currentPart.trim()));
49
+ currentPart = '';
50
+ }
51
+ // Add deep wildcard
52
+ segments.push({ type: 'deep-wildcard' });
53
+ i += 2; // Skip both separators
54
+ } else {
55
+ // Regular separator
56
+ if (currentPart.trim()) {
57
+ segments.push(this._parseSegment(currentPart.trim()));
58
+ }
59
+ currentPart = '';
60
+ i++;
61
+ }
62
+ } else {
63
+ currentPart += pattern[i];
64
+ i++;
65
+ }
66
+ }
67
+
68
+ // Flush remaining part
69
+ if (currentPart.trim()) {
70
+ segments.push(this._parseSegment(currentPart.trim()));
71
+ }
72
+
73
+ return segments;
74
+ }
75
+
76
+ /**
77
+ * Parse a single segment
78
+ * @private
79
+ * @param {string} part - Segment string (e.g., "user", "ns::user", "user[id]", "ns::user:first")
80
+ * @returns {Object} Segment object
81
+ */
82
+ _parseSegment(part) {
83
+ const segment = { type: 'tag' };
84
+
85
+ // NEW NAMESPACE SYNTAX (v2.0):
86
+ // ============================
87
+ // Namespace uses DOUBLE colon (::)
88
+ // Position uses SINGLE colon (:)
89
+ //
90
+ // Examples:
91
+ // "user" → tag
92
+ // "user:first" → tag + position
93
+ // "user[id]" → tag + attribute
94
+ // "user[id]:first" → tag + attribute + position
95
+ // "ns::user" → namespace + tag
96
+ // "ns::user:first" → namespace + tag + position
97
+ // "ns::user[id]" → namespace + tag + attribute
98
+ // "ns::user[id]:first" → namespace + tag + attribute + position
99
+ // "ns::first" → namespace + tag named "first" (NO ambiguity!)
100
+ //
101
+ // This eliminates all ambiguity:
102
+ // :: = namespace separator
103
+ // : = position selector
104
+ // [] = attributes
105
+
106
+ // Step 1: Extract brackets [attr] or [attr=value]
107
+ let bracketContent = null;
108
+ let withoutBrackets = part;
109
+
110
+ const bracketMatch = part.match(/^([^\[]+)(\[[^\]]*\])(.*)$/);
111
+ if (bracketMatch) {
112
+ withoutBrackets = bracketMatch[1] + bracketMatch[3];
113
+ if (bracketMatch[2]) {
114
+ const content = bracketMatch[2].slice(1, -1);
115
+ if (content) {
116
+ bracketContent = content;
117
+ }
118
+ }
119
+ }
120
+
121
+ // Step 2: Check for namespace (double colon ::)
122
+ let namespace = undefined;
123
+ let tagAndPosition = withoutBrackets;
124
+
125
+ if (withoutBrackets.includes('::')) {
126
+ const nsIndex = withoutBrackets.indexOf('::');
127
+ namespace = withoutBrackets.substring(0, nsIndex).trim();
128
+ tagAndPosition = withoutBrackets.substring(nsIndex + 2).trim(); // Skip ::
129
+
130
+ if (!namespace) {
131
+ throw new Error(`Invalid namespace in pattern: ${part}`);
132
+ }
133
+ }
134
+
135
+ // Step 3: Parse tag and position (single colon :)
136
+ let tag = undefined;
137
+ let positionMatch = null;
138
+
139
+ if (tagAndPosition.includes(':')) {
140
+ const colonIndex = tagAndPosition.lastIndexOf(':'); // Use last colon for position
141
+ const tagPart = tagAndPosition.substring(0, colonIndex).trim();
142
+ const posPart = tagAndPosition.substring(colonIndex + 1).trim();
143
+
144
+ // Verify position is a valid keyword
145
+ const isPositionKeyword = ['first', 'last', 'odd', 'even'].includes(posPart) ||
146
+ /^nth\(\d+\)$/.test(posPart);
147
+
148
+ if (isPositionKeyword) {
149
+ tag = tagPart;
150
+ positionMatch = posPart;
151
+ } else {
152
+ // Not a valid position keyword, treat whole thing as tag
153
+ tag = tagAndPosition;
154
+ }
155
+ } else {
156
+ tag = tagAndPosition;
157
+ }
158
+
159
+ if (!tag) {
160
+ throw new Error(`Invalid segment pattern: ${part}`);
161
+ }
162
+
163
+ segment.tag = tag;
164
+ if (namespace) {
165
+ segment.namespace = namespace;
166
+ }
167
+
168
+ // Step 4: Parse attributes
169
+ if (bracketContent) {
170
+ if (bracketContent.includes('=')) {
171
+ const eqIndex = bracketContent.indexOf('=');
172
+ segment.attrName = bracketContent.substring(0, eqIndex).trim();
173
+ segment.attrValue = bracketContent.substring(eqIndex + 1).trim();
174
+ } else {
175
+ segment.attrName = bracketContent.trim();
176
+ }
177
+ }
178
+
179
+ // Step 5: Parse position selector
180
+ if (positionMatch) {
181
+ const nthMatch = positionMatch.match(/^nth\((\d+)\)$/);
182
+ if (nthMatch) {
183
+ segment.position = 'nth';
184
+ segment.positionValue = parseInt(nthMatch[1], 10);
185
+ } else {
186
+ segment.position = positionMatch;
187
+ }
188
+ }
189
+
190
+ return segment;
191
+ }
192
+
193
+ /**
194
+ * Get the number of segments
195
+ * @returns {number}
196
+ */
197
+ get length() {
198
+ return this.segments.length;
199
+ }
200
+
201
+ /**
202
+ * Check if expression contains deep wildcard
203
+ * @returns {boolean}
204
+ */
205
+ hasDeepWildcard() {
206
+ return this._hasDeepWildcard;
207
+ }
208
+
209
+ /**
210
+ * Check if expression has attribute conditions
211
+ * @returns {boolean}
212
+ */
213
+ hasAttributeCondition() {
214
+ return this._hasAttributeCondition;
215
+ }
216
+
217
+ /**
218
+ * Check if expression has position selectors
219
+ * @returns {boolean}
220
+ */
221
+ hasPositionSelector() {
222
+ return this._hasPositionSelector;
223
+ }
224
+
225
+ /**
226
+ * Get string representation
227
+ * @returns {string}
228
+ */
229
+ toString() {
230
+ return this.pattern;
231
+ }
232
+ }