@psnext/slingcli 2.5.20260617-2 → 2.5.20260621-1
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.
- package/node_modules/@aws-sdk/core/dist-cjs/submodules/client/index.browser.js +276 -1
- package/node_modules/@aws-sdk/core/dist-cjs/submodules/client/index.js +276 -1
- package/node_modules/@aws-sdk/core/dist-cjs/submodules/client/index.native.js +276 -1
- package/node_modules/@aws-sdk/core/dist-es/submodules/client/util-endpoints/lib/aws/partitions.js +276 -1
- package/node_modules/@aws-sdk/core/package.json +1 -1
- package/node_modules/@aws-sdk/credential-provider-env/package.json +2 -2
- package/node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/node-http-handler/package.json +2 -2
- package/node_modules/@aws-sdk/credential-provider-http/package.json +2 -2
- package/node_modules/@aws-sdk/credential-provider-ini/package.json +9 -9
- package/node_modules/@aws-sdk/credential-provider-login/package.json +3 -3
- package/node_modules/@aws-sdk/credential-provider-node/package.json +7 -7
- package/node_modules/@aws-sdk/credential-provider-process/package.json +2 -2
- package/node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/token-providers/package.json +3 -3
- package/node_modules/@aws-sdk/credential-provider-sso/package.json +4 -4
- package/node_modules/@aws-sdk/credential-provider-web-identity/package.json +3 -3
- package/node_modules/@aws-sdk/middleware-websocket/package.json +2 -2
- package/node_modules/@aws-sdk/nested-clients/dist-cjs/submodules/cognito-identity/index.js +1 -1
- package/node_modules/@aws-sdk/nested-clients/dist-cjs/submodules/signin/index.js +1 -1
- package/node_modules/@aws-sdk/nested-clients/dist-cjs/submodules/sso/index.js +1 -1
- package/node_modules/@aws-sdk/nested-clients/dist-cjs/submodules/sso-oidc/index.js +1 -1
- package/node_modules/@aws-sdk/nested-clients/dist-cjs/submodules/sts/index.js +1 -1
- package/node_modules/@aws-sdk/nested-clients/node_modules/@smithy/node-http-handler/package.json +2 -2
- package/node_modules/@aws-sdk/nested-clients/package.json +2 -2
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js +30 -0
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.js +139 -109
- package/node_modules/@smithy/core/dist-cjs/submodules/protocols/index.js +10 -2
- package/node_modules/@smithy/core/dist-es/submodules/protocols/HttpProtocol.js +10 -2
- package/node_modules/@smithy/core/dist-types/submodules/protocols/HttpProtocol.d.ts +6 -0
- package/node_modules/@smithy/core/package.json +1 -1
- package/node_modules/@smithy/credential-provider-imds/package.json +2 -2
- package/node_modules/@smithy/fetch-http-handler/package.json +2 -2
- package/node_modules/@smithy/signature-v4/package.json +2 -2
- package/node_modules/@types/node/README.md +1 -1
- package/node_modules/@types/node/assert/strict.d.ts +10 -1
- package/node_modules/@types/node/assert.d.ts +144 -17
- package/node_modules/@types/node/async_hooks.d.ts +9 -9
- package/node_modules/@types/node/buffer.d.ts +0 -5
- package/node_modules/@types/node/child_process.d.ts +17 -21
- package/node_modules/@types/node/cluster.d.ts +13 -13
- package/node_modules/@types/node/console.d.ts +1 -1
- package/node_modules/@types/node/crypto.d.ts +454 -571
- package/node_modules/@types/node/diagnostics_channel.d.ts +20 -9
- package/node_modules/@types/node/dns.d.ts +14 -14
- package/node_modules/@types/node/events.d.ts +3 -3
- package/node_modules/@types/node/fs/promises.d.ts +4 -4
- package/node_modules/@types/node/fs.d.ts +3 -12
- package/node_modules/@types/node/globals.d.ts +4 -4
- package/node_modules/@types/node/http.d.ts +5 -5
- package/node_modules/@types/node/http2.d.ts +1 -1
- package/node_modules/@types/node/index.d.ts +0 -3
- package/node_modules/@types/node/inspector.d.ts +1 -1
- package/node_modules/@types/node/module.d.ts +16 -45
- package/node_modules/@types/node/net.d.ts +1 -1
- package/node_modules/@types/node/os.d.ts +2 -2
- package/node_modules/@types/node/package.json +4 -4
- package/node_modules/@types/node/perf_hooks.d.ts +1 -9
- package/node_modules/@types/node/process.d.ts +11 -11
- package/node_modules/@types/node/readline.d.ts +12 -11
- package/node_modules/@types/node/repl.d.ts +10 -10
- package/node_modules/@types/node/sqlite.d.ts +1 -1
- package/node_modules/@types/node/stream/promises.d.ts +2 -2
- package/node_modules/@types/node/stream/web.d.ts +1 -1
- package/node_modules/@types/node/stream.d.ts +5 -5
- package/node_modules/@types/node/test/reporters.d.ts +1 -1
- package/node_modules/@types/node/test.d.ts +8 -8
- package/node_modules/@types/node/tls.d.ts +1 -1
- package/node_modules/@types/node/ts5.6/index.d.ts +1 -4
- package/node_modules/@types/node/ts5.7/index.d.ts +0 -3
- package/node_modules/@types/node/url.d.ts +3 -3
- package/node_modules/@types/node/util/types.d.ts +1 -1
- package/node_modules/@types/node/util.d.ts +3 -20
- package/node_modules/@types/node/v8.d.ts +1 -1
- package/node_modules/@types/node/vm.d.ts +9 -9
- package/node_modules/@types/node/web-globals/domexception.d.ts +15 -0
- package/node_modules/@types/node/worker_threads.d.ts +2 -5
- package/node_modules/@types/node/zlib.d.ts +3 -3
- package/node_modules/anynum/package.json +2 -2
- package/node_modules/path-expression-matcher/README.md +82 -7
- package/node_modules/path-expression-matcher/lib/pem.cjs +1 -1
- package/node_modules/path-expression-matcher/lib/pem.d.cts +83 -2
- package/node_modules/path-expression-matcher/lib/pem.min.js +1 -1
- package/node_modules/path-expression-matcher/lib/pem.min.js.map +1 -1
- package/node_modules/path-expression-matcher/package.json +3 -2
- package/node_modules/path-expression-matcher/src/ExpressionSet.js +18 -2
- package/node_modules/path-expression-matcher/src/Matcher.js +93 -3
- package/node_modules/path-expression-matcher/src/index.d.ts +67 -1
- package/node_modules/semver/classes/range.js +6 -2
- package/node_modules/semver/package.json +1 -1
- package/node_modules/strnum/package.json +5 -4
- package/node_modules/undici-types/agent.d.ts +0 -2
- package/node_modules/undici-types/client.d.ts +25 -19
- package/node_modules/undici-types/dispatcher.d.ts +7 -33
- package/node_modules/undici-types/dispatcher1-wrapper.d.ts +7 -0
- package/node_modules/undici-types/fetch.d.ts +24 -4
- package/node_modules/undici-types/h2c-client.d.ts +6 -6
- package/node_modules/undici-types/handlers.d.ts +1 -2
- package/node_modules/undici-types/header.d.ts +5 -0
- package/node_modules/undici-types/index.d.ts +3 -1
- package/node_modules/undici-types/interceptors.d.ts +1 -1
- package/node_modules/undici-types/package.json +1 -1
- package/node_modules/undici-types/pool.d.ts +0 -2
- package/node_modules/undici-types/proxy-agent.d.ts +2 -2
- package/node_modules/undici-types/round-robin-pool.d.ts +0 -2
- package/node_modules/undici-types/snapshot-agent.d.ts +4 -0
- package/node_modules/undici-types/socks5-proxy-agent.d.ts +2 -2
- package/node_modules/undici-types/webidl.d.ts +0 -1
- package/package.json +2 -2
- package/slingshot/index.js +118 -118
- package/node_modules/@types/node/compatibility/iterators.d.ts +0 -21
|
@@ -35,7 +35,7 @@ declare module "node:vm" {
|
|
|
35
35
|
/**
|
|
36
36
|
* Used to specify how the modules should be loaded during the evaluation of this script when `import()` is called. This option is
|
|
37
37
|
* part of the experimental modules API. We do not recommend using it in a production environment. For detailed information, see
|
|
38
|
-
* [Support of dynamic `import()` in compilation APIs](https://nodejs.org/docs/latest-
|
|
38
|
+
* [Support of dynamic `import()` in compilation APIs](https://nodejs.org/docs/latest-v26.x/api/vm.html#support-of-dynamic-import-in-compilation-apis).
|
|
39
39
|
* @experimental
|
|
40
40
|
*/
|
|
41
41
|
importModuleDynamically?:
|
|
@@ -81,7 +81,7 @@ declare module "node:vm" {
|
|
|
81
81
|
/**
|
|
82
82
|
* Used to specify how the modules should be loaded during the evaluation of this script when `import()` is called. This option is
|
|
83
83
|
* part of the experimental modules API. We do not recommend using it in a production environment. For detailed information, see
|
|
84
|
-
* [Support of dynamic `import()` in compilation APIs](https://nodejs.org/docs/latest-
|
|
84
|
+
* [Support of dynamic `import()` in compilation APIs](https://nodejs.org/docs/latest-v26.x/api/vm.html#support-of-dynamic-import-in-compilation-apis).
|
|
85
85
|
* @experimental
|
|
86
86
|
*/
|
|
87
87
|
importModuleDynamically?:
|
|
@@ -95,7 +95,7 @@ declare module "node:vm" {
|
|
|
95
95
|
/**
|
|
96
96
|
* Used to specify how the modules should be loaded during the evaluation of this script when `import()` is called. This option is
|
|
97
97
|
* part of the experimental modules API. We do not recommend using it in a production environment. For detailed information, see
|
|
98
|
-
* [Support of dynamic `import()` in compilation APIs](https://nodejs.org/docs/latest-
|
|
98
|
+
* [Support of dynamic `import()` in compilation APIs](https://nodejs.org/docs/latest-v26.x/api/vm.html#support-of-dynamic-import-in-compilation-apis).
|
|
99
99
|
* @experimental
|
|
100
100
|
*/
|
|
101
101
|
importModuleDynamically?:
|
|
@@ -115,7 +115,7 @@ declare module "node:vm" {
|
|
|
115
115
|
/**
|
|
116
116
|
* Used to specify how the modules should be loaded during the evaluation of this script when `import()` is called. This option is
|
|
117
117
|
* part of the experimental modules API. We do not recommend using it in a production environment. For detailed information, see
|
|
118
|
-
* [Support of dynamic `import()` in compilation APIs](https://nodejs.org/docs/latest-
|
|
118
|
+
* [Support of dynamic `import()` in compilation APIs](https://nodejs.org/docs/latest-v26.x/api/vm.html#support-of-dynamic-import-in-compilation-apis).
|
|
119
119
|
* @experimental
|
|
120
120
|
*/
|
|
121
121
|
importModuleDynamically?:
|
|
@@ -159,7 +159,7 @@ declare module "node:vm" {
|
|
|
159
159
|
/**
|
|
160
160
|
* Used to specify how the modules should be loaded during the evaluation of this script when `import()` is called. This option is
|
|
161
161
|
* part of the experimental modules API. We do not recommend using it in a production environment. For detailed information, see
|
|
162
|
-
* [Support of dynamic `import()` in compilation APIs](https://nodejs.org/docs/latest-
|
|
162
|
+
* [Support of dynamic `import()` in compilation APIs](https://nodejs.org/docs/latest-v26.x/api/vm.html#support-of-dynamic-import-in-compilation-apis).
|
|
163
163
|
* @experimental
|
|
164
164
|
*/
|
|
165
165
|
importModuleDynamically?:
|
|
@@ -363,9 +363,9 @@ declare module "node:vm" {
|
|
|
363
363
|
}
|
|
364
364
|
/**
|
|
365
365
|
* If the given `contextObject` is an object, the `vm.createContext()` method will
|
|
366
|
-
* [prepare that object](https://nodejs.org/docs/latest-
|
|
366
|
+
* [prepare that object](https://nodejs.org/docs/latest-v26.x/api/vm.html#what-does-it-mean-to-contextify-an-object)
|
|
367
367
|
* and return a reference to it so that it can be used in calls to {@link runInContext} or
|
|
368
|
-
* [`script.runInContext()`](https://nodejs.org/docs/latest-
|
|
368
|
+
* [`script.runInContext()`](https://nodejs.org/docs/latest-v26.x/api/vm.html#scriptrunincontextcontextifiedobject-options).
|
|
369
369
|
* Inside such scripts, the global object will be wrapped by the `contextObject`, retaining all of its
|
|
370
370
|
* existing properties but also having the built-in objects and functions any standard
|
|
371
371
|
* [global object](https://es5.github.io/#x15.1) has. Outside of scripts run by the vm module, global
|
|
@@ -837,7 +837,7 @@ declare module "node:vm" {
|
|
|
837
837
|
/**
|
|
838
838
|
* Used to specify how the modules should be loaded during the evaluation of this script when `import()` is called. This option is
|
|
839
839
|
* part of the experimental modules API. We do not recommend using it in a production environment. For detailed information, see
|
|
840
|
-
* [Support of dynamic `import()` in compilation APIs](https://nodejs.org/docs/latest-
|
|
840
|
+
* [Support of dynamic `import()` in compilation APIs](https://nodejs.org/docs/latest-v26.x/api/vm.html#support-of-dynamic-import-in-compilation-apis).
|
|
841
841
|
* @experimental
|
|
842
842
|
*/
|
|
843
843
|
importModuleDynamically?: DynamicModuleLoader<SourceTextModule> | undefined;
|
|
@@ -1112,7 +1112,7 @@ declare module "node:vm" {
|
|
|
1112
1112
|
* and `vm.compileFunction()` so that Node.js uses the default ESM loader from the main
|
|
1113
1113
|
* context to load the requested module.
|
|
1114
1114
|
*
|
|
1115
|
-
* For detailed information, see [Support of dynamic `import()` in compilation APIs](https://nodejs.org/docs/latest-
|
|
1115
|
+
* For detailed information, see [Support of dynamic `import()` in compilation APIs](https://nodejs.org/docs/latest-v26.x/api/vm.html#support-of-dynamic-import-in-compilation-apis).
|
|
1116
1116
|
* @since v21.7.0, v20.12.0
|
|
1117
1117
|
*/
|
|
1118
1118
|
const USE_MAIN_CONTEXT_DEFAULT_LOADER: number;
|
|
@@ -65,4 +65,19 @@ declare global {
|
|
|
65
65
|
readonly INVALID_NODE_TYPE_ERR: 24;
|
|
66
66
|
readonly DATA_CLONE_ERR: 25;
|
|
67
67
|
};
|
|
68
|
+
|
|
69
|
+
// Not conditional, as this is not yet exposed by the DOM lib generator.
|
|
70
|
+
interface QuotaExceededError extends DOMException {
|
|
71
|
+
readonly quota: number | null;
|
|
72
|
+
readonly requested: number | null;
|
|
73
|
+
}
|
|
74
|
+
var QuotaExceededError: {
|
|
75
|
+
prototype: QuotaExceededError;
|
|
76
|
+
new(message?: string, options?: QuotaExceededErrorOptions): QuotaExceededError;
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
interface QuotaExceededErrorOptions {
|
|
80
|
+
quota?: number;
|
|
81
|
+
requested?: number;
|
|
82
|
+
}
|
|
68
83
|
}
|
|
@@ -22,9 +22,6 @@ declare module "node:worker_threads" {
|
|
|
22
22
|
const threadName: string | null;
|
|
23
23
|
const workerData: any;
|
|
24
24
|
interface WorkerPerformance extends Pick<Performance, "eventLoopUtilization"> {}
|
|
25
|
-
/** @deprecated Use `import { Transferable } from "node:worker_threads"` instead. */
|
|
26
|
-
// TODO: remove in a future major @types/node version.
|
|
27
|
-
type TransferListItem = Transferable;
|
|
28
25
|
interface WorkerOptions {
|
|
29
26
|
/**
|
|
30
27
|
* List of arguments which would be stringified and appended to
|
|
@@ -340,13 +337,13 @@ declare module "node:worker_threads" {
|
|
|
340
337
|
interface Worker extends InternalEventEmitter<WorkerEventMap> {}
|
|
341
338
|
/**
|
|
342
339
|
* Mark an object as not transferable. If `object` occurs in the transfer list of
|
|
343
|
-
* a [`port.postMessage()`](https://nodejs.org/docs/latest-
|
|
340
|
+
* a [`port.postMessage()`](https://nodejs.org/docs/latest-v26.x/api/worker_threads.html#portpostmessagevalue-transferlist) call, an error is thrown. This is a no-op if
|
|
344
341
|
* `object` is a primitive value.
|
|
345
342
|
*
|
|
346
343
|
* In particular, this makes sense for objects that can be cloned, rather than
|
|
347
344
|
* transferred, and which are used by other objects on the sending side.
|
|
348
345
|
* For example, Node.js marks the `ArrayBuffer`s it uses for its
|
|
349
|
-
* [`Buffer` pool](https://nodejs.org/docs/latest-
|
|
346
|
+
* [`Buffer` pool](https://nodejs.org/docs/latest-v26.x/api/buffer.html#static-method-bufferallocunsafesize) with this.
|
|
350
347
|
* `ArrayBuffer.prototype.transfer()` is disallowed on such array buffer
|
|
351
348
|
* instances.
|
|
352
349
|
*
|
|
@@ -55,7 +55,7 @@ declare module "node:zlib" {
|
|
|
55
55
|
}
|
|
56
56
|
| undefined;
|
|
57
57
|
/**
|
|
58
|
-
* Limits output size when using [convenience methods](https://nodejs.org/docs/latest-
|
|
58
|
+
* Limits output size when using [convenience methods](https://nodejs.org/docs/latest-v26.x/api/zlib.html#convenience-methods).
|
|
59
59
|
* @default buffer.kMaxLength
|
|
60
60
|
*/
|
|
61
61
|
maxOutputLength?: number | undefined;
|
|
@@ -79,12 +79,12 @@ declare module "node:zlib" {
|
|
|
79
79
|
chunkSize?: number | undefined;
|
|
80
80
|
/**
|
|
81
81
|
* Key-value object containing indexed
|
|
82
|
-
* [Zstd parameters](https://nodejs.org/docs/latest-
|
|
82
|
+
* [Zstd parameters](https://nodejs.org/docs/latest-v26.x/api/zlib.html#zstd-constants).
|
|
83
83
|
*/
|
|
84
84
|
params?: { [key: number]: number | boolean } | undefined;
|
|
85
85
|
/**
|
|
86
86
|
* Limits output size when using
|
|
87
|
-
* [convenience methods](https://nodejs.org/docs/latest-
|
|
87
|
+
* [convenience methods](https://nodejs.org/docs/latest-v26.x/api/zlib.html#convenience-methods).
|
|
88
88
|
* @default buffer.kMaxLength
|
|
89
89
|
*/
|
|
90
90
|
maxOutputLength?: number | undefined;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "anynum",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"description": "Normalize all Unicode decimal digits (Devanagari, Arabic, Thai, etc.) to ASCII numerals. Zero dependencies, performance-first.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./anynum.js",
|
|
@@ -39,4 +39,4 @@
|
|
|
39
39
|
"url": "https://github.com/sponsors/NaturalIntelligence"
|
|
40
40
|
}
|
|
41
41
|
]
|
|
42
|
-
}
|
|
42
|
+
}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
# path-expression-matcher
|
|
2
2
|
|
|
3
|
+
[](https://npm-compare.com/path-expression-matcher)
|
|
4
|
+
[](https://www.npmjs.com/package/path-expression-matcher)
|
|
5
|
+
[](https://github.com/NaturalIntelligence/path-expression-matcher)
|
|
6
|
+
|
|
3
7
|
Efficient path tracking and pattern matching for XML, JSON, YAML or any other parsers.
|
|
4
8
|
|
|
5
9
|
## 🎯 Purpose
|
|
@@ -71,9 +75,10 @@ console.log(matcher.toString()); // "soap:Envelope.soap:Body.ns:UserId"
|
|
|
71
75
|
```javascript
|
|
72
76
|
"user[id]" // user with "id" attribute
|
|
73
77
|
"user[type=admin]" // user with type="admin" (current node only)
|
|
74
|
-
"root[lang]..user" // user under root that has "lang" attribute
|
|
75
78
|
```
|
|
76
79
|
|
|
80
|
+
> **Note:** Attribute conditions in expressions only ever look at the **current** (last) node in the path — `..user` matches `user` at any depth, but bracket conditions like `[lang]` still apply to `user` itself, never to an ancestor tag. To check an *ancestor's* attribute (e.g. "is there a `lang` attribute somewhere above this node?"), use `push(..., { keep: [...] })` with `getAnyParentAttr()` / `hasAnyParentAttr()` — see [Ancestor Attributes (`keep`)](#ancestor-attributes-keep) below.
|
|
81
|
+
|
|
77
82
|
### Position Selectors
|
|
78
83
|
|
|
79
84
|
```javascript
|
|
@@ -174,7 +179,7 @@ new Matcher(options)
|
|
|
174
179
|
|
|
175
180
|
#### Path Tracking Methods
|
|
176
181
|
|
|
177
|
-
##### `push(tagName, attrValues, namespace)`
|
|
182
|
+
##### `push(tagName, attrValues, namespace, options)`
|
|
178
183
|
|
|
179
184
|
Add a tag to the current path. Position and counter are automatically calculated.
|
|
180
185
|
|
|
@@ -182,6 +187,8 @@ Add a tag to the current path. Position and counter are automatically calculated
|
|
|
182
187
|
- `tagName` (string): Tag name
|
|
183
188
|
- `attrValues` (object, optional): Attribute key-value pairs (current node only)
|
|
184
189
|
- `namespace` (string, optional): Namespace for the tag
|
|
190
|
+
- `options` (object, optional):
|
|
191
|
+
- `keep` (string[], optional): Names of attributes (from `attrValues`) to retain for ancestor lookup via `getAnyParentAttr()` / `hasAnyParentAttr()`, even after this node is no longer the current node. See [Ancestor Attributes (`keep`)](#ancestor-attributes-keep).
|
|
185
192
|
|
|
186
193
|
**Example:**
|
|
187
194
|
```javascript
|
|
@@ -189,6 +196,7 @@ matcher.push("user", { id: "123", type: "admin" });
|
|
|
189
196
|
matcher.push("item"); // No attributes
|
|
190
197
|
matcher.push("Envelope", null, "soap"); // With namespace
|
|
191
198
|
matcher.push("Body", { version: "1.1" }, "soap"); // With both
|
|
199
|
+
matcher.push("Body", { version: "1.1" }, "soap", { keep: ["version"] }); // Retain "version" for descendants
|
|
192
200
|
```
|
|
193
201
|
|
|
194
202
|
**Position vs Counter:**
|
|
@@ -293,6 +301,29 @@ if (matcher.hasAttr("id")) {
|
|
|
293
301
|
}
|
|
294
302
|
```
|
|
295
303
|
|
|
304
|
+
##### `getAnyParentAttr(attrName)`
|
|
305
|
+
|
|
306
|
+
Get the value of an attribute that was explicitly **kept** (via `push(..., { keep: [...] })`) by the current node or any ancestor. Unlike `getAttrValue()`, this works regardless of how far the path has descended since the attribute was pushed — but only for names that were marked with `keep` at push time. If the same name was kept at multiple depths, the **nearest** (most recent) one wins.
|
|
307
|
+
|
|
308
|
+
```javascript
|
|
309
|
+
matcher.push("Body", { version: "1.1" }, "soap", { keep: ["version"] });
|
|
310
|
+
matcher.push("GetUserRequest");
|
|
311
|
+
matcher.push("UserId");
|
|
312
|
+
|
|
313
|
+
matcher.getAttrValue("version"); // undefined — Body is no longer current
|
|
314
|
+
matcher.getAnyParentAttr("version"); // "1.1" — still reachable, because it was kept
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
##### `hasAnyParentAttr(attrName)`
|
|
318
|
+
|
|
319
|
+
Check whether the current node or any ancestor kept the given attribute via `push(..., { keep: [...] })`.
|
|
320
|
+
|
|
321
|
+
```javascript
|
|
322
|
+
if (matcher.hasAnyParentAttr("version")) {
|
|
323
|
+
// Some node on the path (current or ancestor) kept "version"
|
|
324
|
+
}
|
|
325
|
+
```
|
|
326
|
+
|
|
296
327
|
##### `getPosition()`
|
|
297
328
|
|
|
298
329
|
Get sibling position of current node (child index in parent).
|
|
@@ -528,6 +559,32 @@ const expr2 = new Expression("user[type=admin]");
|
|
|
528
559
|
console.log(matcher.matches(expr2)); // true
|
|
529
560
|
```
|
|
530
561
|
|
|
562
|
+
> Need to check an attribute from an *ancestor* node, not just the current one? See [Example 5b](#example-5b-ancestor-attributes-keep) and [Ancestor Attributes (`keep`)](#ancestor-attributes-keep).
|
|
563
|
+
|
|
564
|
+
### Example 5b: Ancestor Attributes (`keep`)
|
|
565
|
+
|
|
566
|
+
`getAttrValue()` / `hasAttr()` only ever see the **current** node — by design, ancestor attribute values are discarded as soon as you push past them, to keep memory usage low. If you know in advance that a specific attribute (e.g. a SOAP envelope's `version`, or `xml:space`) will matter much deeper in the tree, mark it to be **kept**:
|
|
567
|
+
|
|
568
|
+
```javascript
|
|
569
|
+
const matcher = new Matcher();
|
|
570
|
+
matcher.push("Envelope", null, "soap");
|
|
571
|
+
matcher.push("Body", { version: "1.1" }, "soap", { keep: ["version"] });
|
|
572
|
+
matcher.push("GetUserRequest", { id: "42" });
|
|
573
|
+
matcher.push("UserId");
|
|
574
|
+
|
|
575
|
+
// Ordinary attribute access only sees the current node:
|
|
576
|
+
console.log(matcher.getAttrValue("version")); // undefined
|
|
577
|
+
|
|
578
|
+
// getAnyParentAttr/hasAnyParentAttr still see it, however deep we've gone:
|
|
579
|
+
console.log(matcher.hasAnyParentAttr("version")); // true
|
|
580
|
+
console.log(matcher.getAnyParentAttr("version")); // "1.1"
|
|
581
|
+
|
|
582
|
+
matcher.pop(); matcher.pop(); matcher.pop(); // back to Envelope
|
|
583
|
+
console.log(matcher.hasAnyParentAttr("version")); // false — Body (and its kept attrs) was popped
|
|
584
|
+
```
|
|
585
|
+
|
|
586
|
+
**When to use this:** only for the small number of attributes you specifically know you'll need many levels deeper — not as a general substitute for `getAttrValue()`. Each name passed to `keep` adds a tiny, constant amount of bookkeeping at `push()` time; lookups scan only the kept-attributes list (typically 0-3 entries), never the full path, so cost does not grow with document depth.
|
|
587
|
+
|
|
531
588
|
### Example 6: Position vs Counter
|
|
532
589
|
|
|
533
590
|
```javascript
|
|
@@ -634,24 +691,42 @@ console.log(matcher.matches(expr)); // true - matches namespace "ns", tag "first
|
|
|
634
691
|
|
|
635
692
|
This design minimizes memory usage:
|
|
636
693
|
- No attribute names stored (derived from values object when needed)
|
|
637
|
-
- Attribute values only for current node, not ancestors
|
|
638
|
-
- Attribute checking for ancestors is not supported (acceptable trade-off)
|
|
694
|
+
- Attribute values only for current node, not ancestors, **by default**
|
|
639
695
|
- For 1M nodes with 3 attributes each, saves ~50MB vs storing attribute names
|
|
640
696
|
|
|
697
|
+
### Ancestor Attributes (`keep`)
|
|
698
|
+
|
|
699
|
+
The trade-off above is the right default, but XML/SOAP documents occasionally have a handful of attributes — `xml:space`, a SOAP envelope's `version`, a feature-flag at the document root — that genuinely need to be visible many levels deeper. Rather than retaining *all* attribute values for *every* node (defeating the memory savings above), `push()` accepts an explicit opt-in:
|
|
700
|
+
|
|
701
|
+
```javascript
|
|
702
|
+
matcher.push("Body", { version: "1.1" }, "soap", { keep: ["version"] });
|
|
703
|
+
```
|
|
704
|
+
|
|
705
|
+
Only the named attribute(s) are copied into a small side-stack (`_keptAttrs`), independent of the normal per-node `values`. Reachable later via `getAnyParentAttr(name)` / `hasAnyParentAttr(name)` regardless of depth — see [Example 5b](#example-5b-ancestor-attributes-keep).
|
|
706
|
+
|
|
707
|
+
**Why this stays cheap:**
|
|
708
|
+
- Pushing without `options` costs two extra property reads — no allocation, no measurable overhead (benchmarked: within run-to-run noise vs. plain `push()`).
|
|
709
|
+
- Lookups scan only the kept-attributes stack, not the full path — cost is proportional to *how many distinct attributes are currently kept* (typically 0-3 in real usage), not to document depth.
|
|
710
|
+
- `pop()` truncates kept entries belonging to the popped subtree in the same backward-scan style, so the stack never grows unbounded.
|
|
711
|
+
- The core `matches()` / `_matchSegment` pattern-matching path is completely unaffected — `keep` is a separate, opt-in mechanism with no new expression syntax.
|
|
712
|
+
|
|
713
|
+
This is intentionally a narrow escape hatch, not a general "remember everything" toggle — overusing `keep` (e.g. keeping every attribute on every node) reintroduces the same memory cost this library avoids by default.
|
|
714
|
+
|
|
641
715
|
### Matching Strategy
|
|
642
716
|
|
|
643
717
|
Matching is performed **bottom-to-top** (from current node toward root):
|
|
644
718
|
1. Start at current node
|
|
645
719
|
2. Match segments from pattern end to start
|
|
646
|
-
3. Attribute
|
|
720
|
+
3. Attribute *expression* conditions (`[attr=value]`) only apply to the current node — ancestors have no attribute data in the path itself. For genuinely ancestor-scoped checks outside of expression matching, use `keep` (above).
|
|
647
721
|
4. Position selectors use **counter** (occurrence count), not position (child index)
|
|
648
722
|
|
|
649
723
|
### Performance
|
|
650
724
|
|
|
651
725
|
- **Expression parsing:** One-time cost when Expression is created
|
|
652
726
|
- **Expression analysis:** Cached (hasDeepWildcard, hasAttributeCondition, hasPositionSelector)
|
|
653
|
-
- **Path tracking:** O(1) for push/pop operations
|
|
727
|
+
- **Path tracking:** O(1) for push/pop operations (O(k) additionally when `options.keep` is used, where k = number of kept attribute names — typically 0-3)
|
|
654
728
|
- **Pattern matching:** O(n*m) where n = path depth, m = pattern segments
|
|
729
|
+
- **Ancestor attribute lookup:** O(k) where k = number of currently-kept attributes, independent of path depth
|
|
655
730
|
- **Memory per ancestor node:** ~40-60 bytes (tag, position, counter only)
|
|
656
731
|
- **Memory per current node:** ~80-120 bytes (adds attribute values)
|
|
657
732
|
|
|
@@ -869,4 +944,4 @@ MIT
|
|
|
869
944
|
|
|
870
945
|
## 🤝 Contributing
|
|
871
946
|
|
|
872
|
-
Issues and PRs welcome! This package is designed to be used by XML/JSON parsers like fast-xml-parser. But can be used with any formar parser.
|
|
947
|
+
Issues and PRs welcome! This package is designed to be used by XML/JSON parsers like fast-xml-parser. But can be used with any formar parser.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(()=>{"use strict";var t={d:(e,s)=>{for(var
|
|
1
|
+
(()=>{"use strict";var t={d:(e,s)=>{for(var n in s)t.o(s,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:s[n]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{Expression:()=>s,ExpressionSet:()=>h,Matcher:()=>r,default:()=>i});class s{constructor(t,e={},s){this.pattern=t,this.separator=e.separator||".",this.segments=this._parse(t),this.data=s,this._hasDeepWildcard=this.segments.some(t=>"deep-wildcard"===t.type),this._hasAttributeCondition=this.segments.some(t=>void 0!==t.attrName),this._hasPositionSelector=this.segments.some(t=>void 0!==t.position)}_parse(t){const e=[];let s=0,n="";for(;s<t.length;)t[s]===this.separator?s+1<t.length&&t[s+1]===this.separator?(n.trim()&&(e.push(this._parseSegment(n.trim())),n=""),e.push({type:"deep-wildcard"}),s+=2):(n.trim()&&e.push(this._parseSegment(n.trim())),n="",s++):(n+=t[s],s++);return n.trim()&&e.push(this._parseSegment(n.trim())),e}_parseSegment(t){const e={type:"tag"};let s=null,n=t;const r=t.match(/^([^\[]+)(\[[^\]]*\])(.*)$/);if(r&&(n=r[1]+r[3],r[2])){const t=r[2].slice(1,-1);t&&(s=t)}let h,i,a=n;if(n.includes("::")){const e=n.indexOf("::");if(h=n.substring(0,e).trim(),a=n.substring(e+2).trim(),!h)throw new Error(`Invalid namespace in pattern: ${t}`)}let p=null;if(a.includes(":")){const t=a.lastIndexOf(":"),e=a.substring(0,t).trim(),s=a.substring(t+1).trim();["first","last","odd","even"].includes(s)||/^nth\(\d+\)$/.test(s)?(i=e,p=s):i=a}else i=a;if(!i)throw new Error(`Invalid segment pattern: ${t}`);if(e.tag=i,h&&(e.namespace=h),s)if(s.includes("=")){const t=s.indexOf("=");e.attrName=s.substring(0,t).trim(),e.attrValue=s.substring(t+1).trim()}else e.attrName=s.trim();if(p){const t=p.match(/^nth\((\d+)\)$/);t?(e.position="nth",e.positionValue=parseInt(t[1],10)):e.position=p}return e}get length(){return this.segments.length}hasDeepWildcard(){return this._hasDeepWildcard}hasAttributeCondition(){return this._hasAttributeCondition}hasPositionSelector(){return this._hasPositionSelector}toString(){return this.pattern}}class n{constructor(t){this._matcher=t}get separator(){return this._matcher.separator}getCurrentTag(){const t=this._matcher.path;return t.length>0?t[t.length-1].tag:void 0}getCurrentNamespace(){const t=this._matcher.path;return t.length>0?t[t.length-1].namespace:void 0}getAttrValue(t){const e=this._matcher.path;if(0!==e.length)return e[e.length-1].values?.[t]}hasAttr(t){const e=this._matcher.path;if(0===e.length)return!1;const s=e[e.length-1];return void 0!==s.values&&t in s.values}getAnyParentAttr(t){return this._matcher.getAnyParentAttr(t)}hasAnyParentAttr(t){return this._matcher.hasAnyParentAttr(t)}getPosition(){const t=this._matcher.path;return 0===t.length?-1:t[t.length-1].position??0}getCounter(){const t=this._matcher.path;return 0===t.length?-1:t[t.length-1].counter??0}getIndex(){return this.getPosition()}getDepth(){return this._matcher.path.length}toString(t,e=!0){return this._matcher.toString(t,e)}toArray(){return this._matcher.path.map(t=>t.tag)}matches(t){return this._matcher.matches(t)}matchesAny(t){return t.matchesAny(this._matcher)}}class r{constructor(t={}){this.separator=t.separator||".",this.path=[],this.siblingStacks=[],this._pathStringCache=null,this._view=new n(this),this._keptAttrs=[]}push(t,e=null,s=null,n=null){this._pathStringCache=null,this.path.length>0&&(this.path[this.path.length-1].values=void 0);const r=this.path.length;this.siblingStacks[r]||(this.siblingStacks[r]=new Map);const h=this.siblingStacks[r],i=s?`${s}:${t}`:t,a=h.get(i)||0;let p=0;for(const t of h.values())p+=t;h.set(i,a+1);const l={tag:t,position:p,counter:a};null!=s&&(l.namespace=s),null!=e&&(l.values=e),this.path.push(l);const o=this.path.length,g=null!==n?n.keep:null;if(null!=g&&g.length>0&&e)for(let t=0;t<g.length;t++){const s=g[t];void 0!==e[s]&&this._keptAttrs.push({depth:o,name:s,value:e[s]})}}pop(){if(0===this.path.length)return;this._pathStringCache=null;const t=this.path.pop();this.siblingStacks.length>this.path.length+1&&(this.siblingStacks.length=this.path.length+1);const e=this.path.length+1;for(;this._keptAttrs.length>0&&this._keptAttrs[this._keptAttrs.length-1].depth>=e;)this._keptAttrs.pop();return t}updateCurrent(t){if(this.path.length>0){const e=this.path[this.path.length-1];null!=t&&(e.values=t)}}getCurrentTag(){return this.path.length>0?this.path[this.path.length-1].tag:void 0}getCurrentNamespace(){return this.path.length>0?this.path[this.path.length-1].namespace:void 0}getAttrValue(t){if(0!==this.path.length)return this.path[this.path.length-1].values?.[t]}hasAttr(t){if(0===this.path.length)return!1;const e=this.path[this.path.length-1];return void 0!==e.values&&t in e.values}getAnyParentAttr(t){const e=this._keptAttrs;for(let s=e.length-1;s>=0;s--)if(e[s].name===t)return e[s].value}hasAnyParentAttr(t){const e=this._keptAttrs;for(let s=e.length-1;s>=0;s--)if(e[s].name===t)return!0;return!1}getPosition(){return 0===this.path.length?-1:this.path[this.path.length-1].position??0}getCounter(){return 0===this.path.length?-1:this.path[this.path.length-1].counter??0}getIndex(){return this.getPosition()}getDepth(){return this.path.length}toString(t,e=!0){const s=t||this.separator;if(s===this.separator&&!0===e){if(null!==this._pathStringCache)return this._pathStringCache;const t=this.path.map(t=>t.namespace?`${t.namespace}:${t.tag}`:t.tag).join(s);return this._pathStringCache=t,t}return this.path.map(t=>e&&t.namespace?`${t.namespace}:${t.tag}`:t.tag).join(s)}toArray(){return this.path.map(t=>t.tag)}reset(){this._pathStringCache=null,this.path=[],this.siblingStacks=[],this._keptAttrs=[]}matches(t){const e=t.segments;return 0!==e.length&&(t.hasDeepWildcard()?this._matchWithDeepWildcard(e):this._matchSimple(e))}_matchSimple(t){if(this.path.length!==t.length)return!1;for(let e=0;e<t.length;e++)if(!this._matchSegment(t[e],this.path[e],e===this.path.length-1))return!1;return!0}_matchWithDeepWildcard(t){let e=this.path.length-1,s=t.length-1;for(;s>=0&&e>=0;){const n=t[s];if("deep-wildcard"===n.type){if(s--,s<0)return!0;const n=t[s];let r=!1;for(let t=e;t>=0;t--)if(this._matchSegment(n,this.path[t],t===this.path.length-1)){e=t-1,s--,r=!0;break}if(!r)return!1}else{if(!this._matchSegment(n,this.path[e],e===this.path.length-1))return!1;e--,s--}}return s<0}_matchSegment(t,e,s){if("*"!==t.tag&&t.tag!==e.tag)return!1;if(void 0!==t.namespace&&"*"!==t.namespace&&t.namespace!==e.namespace)return!1;if(void 0!==t.attrName){if(!s)return!1;if(!e.values||!(t.attrName in e.values))return!1;if(void 0!==t.attrValue&&String(e.values[t.attrName])!==String(t.attrValue))return!1}if(void 0!==t.position){if(!s)return!1;const n=e.counter??0;if("first"===t.position&&0!==n)return!1;if("odd"===t.position&&n%2!=1)return!1;if("even"===t.position&&n%2!=0)return!1;if("nth"===t.position&&n!==t.positionValue)return!1}return!0}matchesAny(t){return t.matchesAny(this)}snapshot(){return{path:this.path.map(t=>({...t})),siblingStacks:this.siblingStacks.map(t=>new Map(t)),keptAttrs:this._keptAttrs.map(t=>({...t}))}}restore(t){this._pathStringCache=null,this.path=t.path.map(t=>({...t})),this.siblingStacks=t.siblingStacks.map(t=>new Map(t)),this._keptAttrs=(t.keptAttrs||[]).map(t=>({...t}))}readOnly(){return this._view}}class h{constructor(){this._byDepthAndTag=new Map,this._wildcardByDepth=new Map,this._deepWildcards=[],this._deepByTerminalTag=new Map,this._patterns=new Set,this._sealed=!1}add(t){if(this._sealed)throw new TypeError("ExpressionSet is sealed. Create a new ExpressionSet to add more expressions.");if(this._patterns.has(t.pattern))return this;if(this._patterns.add(t.pattern),t.hasDeepWildcard()){const e=t.segments[t.segments.length-1];if(e&&"deep-wildcard"!==e.type&&"*"!==e.tag){const s=e.tag;this._deepByTerminalTag.has(s)||this._deepByTerminalTag.set(s,[]),this._deepByTerminalTag.get(s).push(t)}else this._deepWildcards.push(t);return this}const e=t.length,s=t.segments[t.segments.length-1],n=s?.tag;if(n&&"*"!==n){const s=`${e}:${n}`;this._byDepthAndTag.has(s)||this._byDepthAndTag.set(s,[]),this._byDepthAndTag.get(s).push(t)}else this._wildcardByDepth.has(e)||this._wildcardByDepth.set(e,[]),this._wildcardByDepth.get(e).push(t);return this}addAll(t){for(const e of t)this.add(e);return this}has(t){return this._patterns.has(t.pattern)}get size(){return this._patterns.size}seal(){return this._sealed=!0,this}get isSealed(){return this._sealed}matchesAny(t){return null!==this.findMatch(t)}findMatch(t){const e=t.getDepth(),s=t.getCurrentTag(),n=`${e}:${s}`,r=this._byDepthAndTag.get(n);if(r)for(let e=0;e<r.length;e++)if(t.matches(r[e]))return r[e];const h=this._wildcardByDepth.get(e);if(h)for(let e=0;e<h.length;e++)if(t.matches(h[e]))return h[e];const i=this._deepByTerminalTag.get(s);if(i)for(let e=0;e<i.length;e++)if(t.matches(i[e]))return i[e];for(let e=0;e<this._deepWildcards.length;e++)if(t.matches(this._deepWildcards[e]))return this._deepWildcards[e];return null}}const i={Expression:s,Matcher:r,ExpressionSet:h};module.exports=e})();
|
|
@@ -186,6 +186,42 @@ declare interface MatcherSnapshot {
|
|
|
186
186
|
* Copy of sibling tracking maps
|
|
187
187
|
*/
|
|
188
188
|
siblingStacks: Map<string, number>[];
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Copy of the kept-attrs stack (see {@link PushOptions.keep})
|
|
192
|
+
*/
|
|
193
|
+
keptAttrs: KeptAttrEntry[];
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* A single entry in the matcher's kept-attrs stack — an attribute value
|
|
198
|
+
* explicitly retained at push time via `{ keep: [...] }` so it remains
|
|
199
|
+
* reachable from descendants after the owning node is no longer current.
|
|
200
|
+
*/
|
|
201
|
+
declare interface KeptAttrEntry {
|
|
202
|
+
/** Path depth (1-based) of the node that declared this kept attribute */
|
|
203
|
+
depth: number;
|
|
204
|
+
/** Attribute name */
|
|
205
|
+
name: string;
|
|
206
|
+
/** Attribute value at push time */
|
|
207
|
+
value: any;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* Options for {@link Matcher.push}
|
|
212
|
+
*/
|
|
213
|
+
declare interface PushOptions {
|
|
214
|
+
/**
|
|
215
|
+
* Names of attributes (from `attrValues`) to retain for ancestor lookup
|
|
216
|
+
* (`getAnyParentAttr` / `hasAnyParentAttr`) even after this node is no
|
|
217
|
+
* longer the current node.
|
|
218
|
+
*
|
|
219
|
+
* Use sparingly — this is for attributes you know you'll need much deeper
|
|
220
|
+
* in the tree (e.g. `xml:space`, a SOAP envelope's `version`), not a
|
|
221
|
+
* general substitute for `getAttrValue()`. Cost is proportional to
|
|
222
|
+
* `keep.length`, independent of path depth.
|
|
223
|
+
*/
|
|
224
|
+
keep?: string[];
|
|
189
225
|
}
|
|
190
226
|
|
|
191
227
|
/**
|
|
@@ -253,6 +289,24 @@ declare interface ReadOnlyMatcher {
|
|
|
253
289
|
*/
|
|
254
290
|
hasAttr(attrName: string): boolean;
|
|
255
291
|
|
|
292
|
+
/**
|
|
293
|
+
* Get the value of a "kept" attribute from the nearest ancestor (or
|
|
294
|
+
* current node) that declared it via `push(tag, attrs, ns, { keep: [...] })`.
|
|
295
|
+
* Unlike `getAttrValue()`, this works regardless of how deep the path has
|
|
296
|
+
* gone since the attribute was pushed — but only for attribute names that
|
|
297
|
+
* were explicitly marked with `keep` at push time.
|
|
298
|
+
* @param attrName - Attribute name
|
|
299
|
+
* @returns The kept value, or undefined if no ancestor kept this attribute
|
|
300
|
+
*/
|
|
301
|
+
getAnyParentAttr(attrName: string): any;
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* Check whether any ancestor (or the current node) kept the given
|
|
305
|
+
* attribute via `push(tag, attrs, ns, { keep: [...] })`.
|
|
306
|
+
* @param attrName - Attribute name
|
|
307
|
+
*/
|
|
308
|
+
hasAnyParentAttr(attrName: string): boolean;
|
|
309
|
+
|
|
256
310
|
/**
|
|
257
311
|
* Get current node's sibling position (child index in parent)
|
|
258
312
|
* @returns Position index or -1 if path is empty
|
|
@@ -386,15 +440,23 @@ declare class Matcher {
|
|
|
386
440
|
* @param tagName - Name of the tag
|
|
387
441
|
* @param attrValues - Attribute key-value pairs for current node (optional)
|
|
388
442
|
* @param namespace - Namespace for the tag (optional)
|
|
443
|
+
* @param options - Push options, e.g. `{ keep: ['version'] }` to retain
|
|
444
|
+
* specific attributes for ancestor lookup after this node stops being current
|
|
389
445
|
*
|
|
390
446
|
* @example
|
|
391
447
|
* ```javascript
|
|
392
448
|
* matcher.push("user", { id: "123", type: "admin" });
|
|
393
449
|
* matcher.push("user", { id: "456" }, "ns");
|
|
394
450
|
* matcher.push("container", null);
|
|
451
|
+
* matcher.push("Body", { version: "1.1" }, "soap", { keep: ["version"] });
|
|
395
452
|
* ```
|
|
396
453
|
*/
|
|
397
|
-
push(
|
|
454
|
+
push(
|
|
455
|
+
tagName: string,
|
|
456
|
+
attrValues?: Record<string, any> | null,
|
|
457
|
+
namespace?: string | null,
|
|
458
|
+
options?: PushOptions | null
|
|
459
|
+
): void;
|
|
398
460
|
|
|
399
461
|
/**
|
|
400
462
|
* Pop the last tag from the path
|
|
@@ -434,6 +496,23 @@ declare class Matcher {
|
|
|
434
496
|
*/
|
|
435
497
|
hasAttr(attrName: string): boolean;
|
|
436
498
|
|
|
499
|
+
/**
|
|
500
|
+
* Get the value of a "kept" attribute from the nearest ancestor (or current
|
|
501
|
+
* node) that declared it via `push(tag, attrs, ns, { keep: [...] })`.
|
|
502
|
+
* Cost is proportional to the number of currently-kept attributes, not
|
|
503
|
+
* path depth.
|
|
504
|
+
* @param attrName - Attribute name
|
|
505
|
+
* @returns The kept value, or undefined if no ancestor kept this attribute
|
|
506
|
+
*/
|
|
507
|
+
getAnyParentAttr(attrName: string): any;
|
|
508
|
+
|
|
509
|
+
/**
|
|
510
|
+
* Check whether any ancestor (or the current node) kept the given
|
|
511
|
+
* attribute via `push(tag, attrs, ns, { keep: [...] })`.
|
|
512
|
+
* @param attrName - Attribute name
|
|
513
|
+
*/
|
|
514
|
+
hasAnyParentAttr(attrName: string): boolean;
|
|
515
|
+
|
|
437
516
|
/**
|
|
438
517
|
* Get current node's sibling position (child index in parent)
|
|
439
518
|
* @returns Position index or -1 if path is empty
|
|
@@ -628,7 +707,9 @@ declare namespace pathExpressionMatcher {
|
|
|
628
707
|
Segment,
|
|
629
708
|
PathNode,
|
|
630
709
|
MatcherSnapshot,
|
|
710
|
+
KeptAttrEntry,
|
|
711
|
+
PushOptions,
|
|
631
712
|
};
|
|
632
713
|
}
|
|
633
714
|
|
|
634
|
-
export = pathExpressionMatcher;
|
|
715
|
+
export = pathExpressionMatcher;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.pem=e():t.pem=e()}(this,()=>(()=>{"use strict";var t={d:(e,s)=>{for(var
|
|
1
|
+
!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.pem=e():t.pem=e()}(this,()=>(()=>{"use strict";var t={d:(e,s)=>{for(var n in s)t.o(s,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:s[n]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{Expression:()=>s,ExpressionSet:()=>i,Matcher:()=>r,default:()=>h});class s{constructor(t,e={},s){this.pattern=t,this.separator=e.separator||".",this.segments=this._parse(t),this.data=s,this._hasDeepWildcard=this.segments.some(t=>"deep-wildcard"===t.type),this._hasAttributeCondition=this.segments.some(t=>void 0!==t.attrName),this._hasPositionSelector=this.segments.some(t=>void 0!==t.position)}_parse(t){const e=[];let s=0,n="";for(;s<t.length;)t[s]===this.separator?s+1<t.length&&t[s+1]===this.separator?(n.trim()&&(e.push(this._parseSegment(n.trim())),n=""),e.push({type:"deep-wildcard"}),s+=2):(n.trim()&&e.push(this._parseSegment(n.trim())),n="",s++):(n+=t[s],s++);return n.trim()&&e.push(this._parseSegment(n.trim())),e}_parseSegment(t){const e={type:"tag"};let s=null,n=t;const r=t.match(/^([^\[]+)(\[[^\]]*\])(.*)$/);if(r&&(n=r[1]+r[3],r[2])){const t=r[2].slice(1,-1);t&&(s=t)}let i,h,a=n;if(n.includes("::")){const e=n.indexOf("::");if(i=n.substring(0,e).trim(),a=n.substring(e+2).trim(),!i)throw new Error(`Invalid namespace in pattern: ${t}`)}let p=null;if(a.includes(":")){const t=a.lastIndexOf(":"),e=a.substring(0,t).trim(),s=a.substring(t+1).trim();["first","last","odd","even"].includes(s)||/^nth\(\d+\)$/.test(s)?(h=e,p=s):h=a}else h=a;if(!h)throw new Error(`Invalid segment pattern: ${t}`);if(e.tag=h,i&&(e.namespace=i),s)if(s.includes("=")){const t=s.indexOf("=");e.attrName=s.substring(0,t).trim(),e.attrValue=s.substring(t+1).trim()}else e.attrName=s.trim();if(p){const t=p.match(/^nth\((\d+)\)$/);t?(e.position="nth",e.positionValue=parseInt(t[1],10)):e.position=p}return e}get length(){return this.segments.length}hasDeepWildcard(){return this._hasDeepWildcard}hasAttributeCondition(){return this._hasAttributeCondition}hasPositionSelector(){return this._hasPositionSelector}toString(){return this.pattern}}class n{constructor(t){this._matcher=t}get separator(){return this._matcher.separator}getCurrentTag(){const t=this._matcher.path;return t.length>0?t[t.length-1].tag:void 0}getCurrentNamespace(){const t=this._matcher.path;return t.length>0?t[t.length-1].namespace:void 0}getAttrValue(t){const e=this._matcher.path;if(0!==e.length)return e[e.length-1].values?.[t]}hasAttr(t){const e=this._matcher.path;if(0===e.length)return!1;const s=e[e.length-1];return void 0!==s.values&&t in s.values}getAnyParentAttr(t){return this._matcher.getAnyParentAttr(t)}hasAnyParentAttr(t){return this._matcher.hasAnyParentAttr(t)}getPosition(){const t=this._matcher.path;return 0===t.length?-1:t[t.length-1].position??0}getCounter(){const t=this._matcher.path;return 0===t.length?-1:t[t.length-1].counter??0}getIndex(){return this.getPosition()}getDepth(){return this._matcher.path.length}toString(t,e=!0){return this._matcher.toString(t,e)}toArray(){return this._matcher.path.map(t=>t.tag)}matches(t){return this._matcher.matches(t)}matchesAny(t){return t.matchesAny(this._matcher)}}class r{constructor(t={}){this.separator=t.separator||".",this.path=[],this.siblingStacks=[],this._pathStringCache=null,this._view=new n(this),this._keptAttrs=[]}push(t,e=null,s=null,n=null){this._pathStringCache=null,this.path.length>0&&(this.path[this.path.length-1].values=void 0);const r=this.path.length;this.siblingStacks[r]||(this.siblingStacks[r]=new Map);const i=this.siblingStacks[r],h=s?`${s}:${t}`:t,a=i.get(h)||0;let p=0;for(const t of i.values())p+=t;i.set(h,a+1);const l={tag:t,position:p,counter:a};null!=s&&(l.namespace=s),null!=e&&(l.values=e),this.path.push(l);const o=this.path.length,g=null!==n?n.keep:null;if(null!=g&&g.length>0&&e)for(let t=0;t<g.length;t++){const s=g[t];void 0!==e[s]&&this._keptAttrs.push({depth:o,name:s,value:e[s]})}}pop(){if(0===this.path.length)return;this._pathStringCache=null;const t=this.path.pop();this.siblingStacks.length>this.path.length+1&&(this.siblingStacks.length=this.path.length+1);const e=this.path.length+1;for(;this._keptAttrs.length>0&&this._keptAttrs[this._keptAttrs.length-1].depth>=e;)this._keptAttrs.pop();return t}updateCurrent(t){if(this.path.length>0){const e=this.path[this.path.length-1];null!=t&&(e.values=t)}}getCurrentTag(){return this.path.length>0?this.path[this.path.length-1].tag:void 0}getCurrentNamespace(){return this.path.length>0?this.path[this.path.length-1].namespace:void 0}getAttrValue(t){if(0!==this.path.length)return this.path[this.path.length-1].values?.[t]}hasAttr(t){if(0===this.path.length)return!1;const e=this.path[this.path.length-1];return void 0!==e.values&&t in e.values}getAnyParentAttr(t){const e=this._keptAttrs;for(let s=e.length-1;s>=0;s--)if(e[s].name===t)return e[s].value}hasAnyParentAttr(t){const e=this._keptAttrs;for(let s=e.length-1;s>=0;s--)if(e[s].name===t)return!0;return!1}getPosition(){return 0===this.path.length?-1:this.path[this.path.length-1].position??0}getCounter(){return 0===this.path.length?-1:this.path[this.path.length-1].counter??0}getIndex(){return this.getPosition()}getDepth(){return this.path.length}toString(t,e=!0){const s=t||this.separator;if(s===this.separator&&!0===e){if(null!==this._pathStringCache)return this._pathStringCache;const t=this.path.map(t=>t.namespace?`${t.namespace}:${t.tag}`:t.tag).join(s);return this._pathStringCache=t,t}return this.path.map(t=>e&&t.namespace?`${t.namespace}:${t.tag}`:t.tag).join(s)}toArray(){return this.path.map(t=>t.tag)}reset(){this._pathStringCache=null,this.path=[],this.siblingStacks=[],this._keptAttrs=[]}matches(t){const e=t.segments;return 0!==e.length&&(t.hasDeepWildcard()?this._matchWithDeepWildcard(e):this._matchSimple(e))}_matchSimple(t){if(this.path.length!==t.length)return!1;for(let e=0;e<t.length;e++)if(!this._matchSegment(t[e],this.path[e],e===this.path.length-1))return!1;return!0}_matchWithDeepWildcard(t){let e=this.path.length-1,s=t.length-1;for(;s>=0&&e>=0;){const n=t[s];if("deep-wildcard"===n.type){if(s--,s<0)return!0;const n=t[s];let r=!1;for(let t=e;t>=0;t--)if(this._matchSegment(n,this.path[t],t===this.path.length-1)){e=t-1,s--,r=!0;break}if(!r)return!1}else{if(!this._matchSegment(n,this.path[e],e===this.path.length-1))return!1;e--,s--}}return s<0}_matchSegment(t,e,s){if("*"!==t.tag&&t.tag!==e.tag)return!1;if(void 0!==t.namespace&&"*"!==t.namespace&&t.namespace!==e.namespace)return!1;if(void 0!==t.attrName){if(!s)return!1;if(!e.values||!(t.attrName in e.values))return!1;if(void 0!==t.attrValue&&String(e.values[t.attrName])!==String(t.attrValue))return!1}if(void 0!==t.position){if(!s)return!1;const n=e.counter??0;if("first"===t.position&&0!==n)return!1;if("odd"===t.position&&n%2!=1)return!1;if("even"===t.position&&n%2!=0)return!1;if("nth"===t.position&&n!==t.positionValue)return!1}return!0}matchesAny(t){return t.matchesAny(this)}snapshot(){return{path:this.path.map(t=>({...t})),siblingStacks:this.siblingStacks.map(t=>new Map(t)),keptAttrs:this._keptAttrs.map(t=>({...t}))}}restore(t){this._pathStringCache=null,this.path=t.path.map(t=>({...t})),this.siblingStacks=t.siblingStacks.map(t=>new Map(t)),this._keptAttrs=(t.keptAttrs||[]).map(t=>({...t}))}readOnly(){return this._view}}class i{constructor(){this._byDepthAndTag=new Map,this._wildcardByDepth=new Map,this._deepWildcards=[],this._deepByTerminalTag=new Map,this._patterns=new Set,this._sealed=!1}add(t){if(this._sealed)throw new TypeError("ExpressionSet is sealed. Create a new ExpressionSet to add more expressions.");if(this._patterns.has(t.pattern))return this;if(this._patterns.add(t.pattern),t.hasDeepWildcard()){const e=t.segments[t.segments.length-1];if(e&&"deep-wildcard"!==e.type&&"*"!==e.tag){const s=e.tag;this._deepByTerminalTag.has(s)||this._deepByTerminalTag.set(s,[]),this._deepByTerminalTag.get(s).push(t)}else this._deepWildcards.push(t);return this}const e=t.length,s=t.segments[t.segments.length-1],n=s?.tag;if(n&&"*"!==n){const s=`${e}:${n}`;this._byDepthAndTag.has(s)||this._byDepthAndTag.set(s,[]),this._byDepthAndTag.get(s).push(t)}else this._wildcardByDepth.has(e)||this._wildcardByDepth.set(e,[]),this._wildcardByDepth.get(e).push(t);return this}addAll(t){for(const e of t)this.add(e);return this}has(t){return this._patterns.has(t.pattern)}get size(){return this._patterns.size}seal(){return this._sealed=!0,this}get isSealed(){return this._sealed}matchesAny(t){return null!==this.findMatch(t)}findMatch(t){const e=t.getDepth(),s=t.getCurrentTag(),n=`${e}:${s}`,r=this._byDepthAndTag.get(n);if(r)for(let e=0;e<r.length;e++)if(t.matches(r[e]))return r[e];const i=this._wildcardByDepth.get(e);if(i)for(let e=0;e<i.length;e++)if(t.matches(i[e]))return i[e];const h=this._deepByTerminalTag.get(s);if(h)for(let e=0;e<h.length;e++)if(t.matches(h[e]))return h[e];for(let e=0;e<this._deepWildcards.length;e++)if(t.matches(this._deepWildcards[e]))return this._deepWildcards[e];return null}}const h={Expression:s,Matcher:r,ExpressionSet:i};return e})());
|
|
2
2
|
//# sourceMappingURL=pem.min.js.map
|