@poe-platform/safe-bash 0.1.507 → 0.1.508
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/dist/safe-bash/chunks/chunk-3ISDVRIM.js +3821 -0
- package/dist/safe-bash/chunks/chunk-3ISDVRIM.js.map +7 -0
- package/dist/safe-bash/commands/xml/evaluate.d.ts +27 -0
- package/dist/safe-bash/commands/xml/evaluate.d.ts.map +1 -0
- package/dist/safe-bash/commands/xml/evaluate.js +208 -0
- package/dist/safe-bash/commands/xml/evaluate.js.map +1 -0
- package/dist/safe-bash/commands/xml/index.browser.js +11 -0
- package/dist/safe-bash/commands/xml/index.browser.js.map +7 -0
- package/dist/safe-bash/commands/xml/index.d.ts +7 -0
- package/dist/safe-bash/commands/xml/index.d.ts.map +1 -0
- package/dist/safe-bash/commands/xml/index.js +196 -0
- package/dist/safe-bash/commands/xml/index.js.map +1 -0
- package/dist/safe-bash/commands/xml/limits.d.ts +36 -0
- package/dist/safe-bash/commands/xml/limits.d.ts.map +1 -0
- package/dist/safe-bash/commands/xml/limits.js +55 -0
- package/dist/safe-bash/commands/xml/limits.js.map +1 -0
- package/dist/safe-bash/commands/xml/query.d.ts +21 -0
- package/dist/safe-bash/commands/xml/query.d.ts.map +1 -0
- package/dist/safe-bash/commands/xml/query.js +111 -0
- package/dist/safe-bash/commands/xml/query.js.map +1 -0
- package/dist/safe-bash/core.browser.js +990 -3879
- package/dist/safe-bash/core.browser.js.map +4 -4
- package/dist/safe-bash/core.d.ts +1 -0
- package/dist/safe-bash/core.d.ts.map +1 -1
- package/dist/safe-bash/core.js +1 -0
- package/dist/safe-bash/core.js.map +1 -1
- package/dist/safe-bash/plugins/composition.d.ts +2 -0
- package/dist/safe-bash/plugins/composition.d.ts.map +1 -1
- package/dist/safe-bash/plugins/composition.js +3 -1
- package/dist/safe-bash/plugins/composition.js.map +1 -1
- package/package.json +8 -2
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { XmlAttribute, XmlContent, XmlElement } from "@poe-platform/safe-fs/core";
|
|
2
|
+
import type { Query } from "./query.js";
|
|
3
|
+
import { XmlBudget } from "./limits.js";
|
|
4
|
+
type Container = {
|
|
5
|
+
kind: "document";
|
|
6
|
+
children: Node[];
|
|
7
|
+
} | ElementNode;
|
|
8
|
+
interface ElementNode {
|
|
9
|
+
kind: "element";
|
|
10
|
+
value: XmlElement;
|
|
11
|
+
children: Node[];
|
|
12
|
+
attributes: AttributeNode[];
|
|
13
|
+
}
|
|
14
|
+
interface AttributeNode {
|
|
15
|
+
kind: "attribute";
|
|
16
|
+
value: XmlAttribute;
|
|
17
|
+
}
|
|
18
|
+
interface ContentNode {
|
|
19
|
+
kind: Exclude<XmlContent["kind"], "element">;
|
|
20
|
+
value: Exclude<XmlContent, XmlElement>;
|
|
21
|
+
}
|
|
22
|
+
export type Node = Container | AttributeNode | ContentNode;
|
|
23
|
+
export declare function evaluate(query: Query, root: XmlElement, budget: XmlBudget): Promise<Node[]>;
|
|
24
|
+
export declare function stringValue(node: Node | undefined, budget: XmlBudget): AsyncGenerator<string>;
|
|
25
|
+
export declare function serialize(node: Node, budget: XmlBudget): AsyncGenerator<string>;
|
|
26
|
+
export {};
|
|
27
|
+
//# sourceMappingURL=evaluate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluate.d.ts","sourceRoot":"","sources":["../../../src/commands/xml/evaluate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAClF,OAAO,KAAK,EAAE,KAAK,EAAa,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,KAAK,SAAS,GAAG;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,IAAI,EAAE,CAAA;CAAE,GAAG,WAAW,CAAC;AACtE,UAAU,WAAW;IAAG,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;IAAC,UAAU,EAAE,aAAa,EAAE,CAAA;CAAE;AAC3G,UAAU,aAAa;IAAG,IAAI,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,YAAY,CAAA;CAAE;AAClE,UAAU,WAAW;IAAG,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC,UAAU,EAAE,UAAU,CAAC,CAAA;CAAE;AAC9G,MAAM,MAAM,IAAI,GAAG,SAAS,GAAG,aAAa,GAAG,WAAW,CAAC;AAuC3D,wBAAsB,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAkDjG;AAED,wBAAuB,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,SAAS,EAAE,MAAM,EAAE,SAAS,GAAG,cAAc,CAAC,MAAM,CAAC,CAapG;AAED,wBAAuB,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,GAAG,cAAc,CAAC,MAAM,CAAC,CA2BtF"}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import { XmlBudget } from "./limits.js";
|
|
2
|
+
const xmlns = "http://www.w3.org/2000/xmlns/";
|
|
3
|
+
async function indexTree(root, budget) {
|
|
4
|
+
const document = { kind: "document", children: [] };
|
|
5
|
+
const order = [document];
|
|
6
|
+
const pending = [{ parent: document, content: root }];
|
|
7
|
+
while (pending.length) {
|
|
8
|
+
await budget.tick();
|
|
9
|
+
const { parent, content } = pending.pop();
|
|
10
|
+
if (content.kind === "element") {
|
|
11
|
+
const node = { kind: "element", value: content, children: [], attributes: [] };
|
|
12
|
+
parent.children.push(node);
|
|
13
|
+
order.push(node);
|
|
14
|
+
for (const attribute of content.attributes) {
|
|
15
|
+
await budget.tick();
|
|
16
|
+
if (attribute.namespace === xmlns)
|
|
17
|
+
continue;
|
|
18
|
+
const selected = { kind: "attribute", value: attribute };
|
|
19
|
+
node.attributes.push(selected);
|
|
20
|
+
order.push(selected);
|
|
21
|
+
}
|
|
22
|
+
for (let index = content.content.length - 1; index >= 0; index--) {
|
|
23
|
+
await budget.tick();
|
|
24
|
+
pending.push({ parent: node, content: content.content[index] });
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
const node = { kind: content.kind, value: content };
|
|
29
|
+
parent.children.push(node);
|
|
30
|
+
order.push(node);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return { document, order };
|
|
34
|
+
}
|
|
35
|
+
function matches(node, step) {
|
|
36
|
+
if (step.kind === "text")
|
|
37
|
+
return node.kind === "text" || node.kind === "cdata";
|
|
38
|
+
if (node.kind !== step.kind)
|
|
39
|
+
return false;
|
|
40
|
+
if (node.kind === "element" || node.kind === "attribute") {
|
|
41
|
+
return step.name === "*" || node.value.namespace === "" && node.value.localName === step.name;
|
|
42
|
+
}
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
export async function evaluate(query, root, budget) {
|
|
46
|
+
const { document, order } = await indexTree(root, budget);
|
|
47
|
+
let contexts = [document];
|
|
48
|
+
for (const step of query.steps) {
|
|
49
|
+
const parents = new Set();
|
|
50
|
+
const pending = [...contexts];
|
|
51
|
+
while (pending.length) {
|
|
52
|
+
await budget.tick();
|
|
53
|
+
const node = pending.pop();
|
|
54
|
+
if (parents.has(node))
|
|
55
|
+
continue;
|
|
56
|
+
parents.add(node);
|
|
57
|
+
if (step.descendant && (node.kind === "document" || node.kind === "element")) {
|
|
58
|
+
for (const child of node.children) {
|
|
59
|
+
await budget.tick();
|
|
60
|
+
pending.push(child);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
const selected = new Set();
|
|
65
|
+
for (const parent of parents) {
|
|
66
|
+
await budget.tick();
|
|
67
|
+
const candidates = step.kind === "attribute"
|
|
68
|
+
? parent.kind === "element" ? parent.attributes : []
|
|
69
|
+
: parent.kind === "element" || parent.kind === "document" ? parent.children : [];
|
|
70
|
+
let matched = [];
|
|
71
|
+
for (const candidate of candidates) {
|
|
72
|
+
await budget.tick();
|
|
73
|
+
if (matches(candidate, step))
|
|
74
|
+
matched.push(candidate);
|
|
75
|
+
}
|
|
76
|
+
for (const predicate of step.predicates) {
|
|
77
|
+
await budget.tick();
|
|
78
|
+
if (predicate.kind === "position")
|
|
79
|
+
matched = matched[predicate.value - 1] ? [matched[predicate.value - 1]] : [];
|
|
80
|
+
else {
|
|
81
|
+
const filtered = [];
|
|
82
|
+
for (const candidate of matched) {
|
|
83
|
+
await budget.tick();
|
|
84
|
+
if (candidate.kind !== "element")
|
|
85
|
+
continue;
|
|
86
|
+
for (const attribute of candidate.attributes) {
|
|
87
|
+
await budget.tick(attribute.value.value.length + 1);
|
|
88
|
+
if (attribute.value.namespace === "" && attribute.value.localName === predicate.name && attribute.value.value === predicate.value) {
|
|
89
|
+
filtered.push(candidate);
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
matched = filtered;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
for (const node of matched) {
|
|
98
|
+
await budget.tick();
|
|
99
|
+
if (!selected.has(node)) {
|
|
100
|
+
budget.results(selected.size + 1);
|
|
101
|
+
selected.add(node);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
contexts = [];
|
|
106
|
+
for (const node of order) {
|
|
107
|
+
await budget.tick();
|
|
108
|
+
if (selected.has(node))
|
|
109
|
+
contexts.push(node);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return contexts;
|
|
113
|
+
}
|
|
114
|
+
export async function* stringValue(node, budget) {
|
|
115
|
+
if (node === undefined)
|
|
116
|
+
return;
|
|
117
|
+
if (node.kind === "attribute") {
|
|
118
|
+
yield node.value.value;
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
const pending = [node];
|
|
122
|
+
while (pending.length) {
|
|
123
|
+
await budget.tick();
|
|
124
|
+
const current = pending.pop();
|
|
125
|
+
if (current.kind === "element" || current.kind === "document") {
|
|
126
|
+
for (let index = current.children.length - 1; index >= 0; index--) {
|
|
127
|
+
await budget.tick();
|
|
128
|
+
pending.push(current.children[index]);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
else if (current.kind === "text" || current.kind === "cdata")
|
|
132
|
+
yield current.value.text;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
export async function* serialize(node, budget) {
|
|
136
|
+
if (node.kind === "attribute") {
|
|
137
|
+
yield ` ${node.value.name}="`;
|
|
138
|
+
yield* escape(node.value.value, true, budget);
|
|
139
|
+
yield '"';
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
if (node.kind === "document")
|
|
143
|
+
return;
|
|
144
|
+
const pending = [node.value];
|
|
145
|
+
while (pending.length) {
|
|
146
|
+
await budget.tick();
|
|
147
|
+
const current = pending.pop();
|
|
148
|
+
if (typeof current === "string") {
|
|
149
|
+
yield current;
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
if (current.kind === "element") {
|
|
153
|
+
yield `<${current.name}`;
|
|
154
|
+
for (const attribute of current.attributes) {
|
|
155
|
+
await budget.tick();
|
|
156
|
+
yield ` ${attribute.name}="`;
|
|
157
|
+
yield* escape(attribute.value, true, budget);
|
|
158
|
+
yield '"';
|
|
159
|
+
}
|
|
160
|
+
if (!current.content.length)
|
|
161
|
+
yield "/>";
|
|
162
|
+
else {
|
|
163
|
+
yield ">";
|
|
164
|
+
pending.push(`</${current.name}>`);
|
|
165
|
+
for (let index = current.content.length - 1; index >= 0; index--) {
|
|
166
|
+
await budget.tick();
|
|
167
|
+
pending.push(current.content[index]);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
else if (current.kind === "text")
|
|
172
|
+
yield* escape(current.text, false, budget);
|
|
173
|
+
else if (current.kind === "cdata") {
|
|
174
|
+
yield "<![CDATA[";
|
|
175
|
+
yield current.text;
|
|
176
|
+
yield "]]>";
|
|
177
|
+
}
|
|
178
|
+
else if (current.kind === "comment") {
|
|
179
|
+
yield "<!--";
|
|
180
|
+
yield current.text;
|
|
181
|
+
yield "-->";
|
|
182
|
+
}
|
|
183
|
+
else if (current.kind === "processing-instruction") {
|
|
184
|
+
yield `<?${current.target}`;
|
|
185
|
+
if (current.text) {
|
|
186
|
+
yield " ";
|
|
187
|
+
yield current.text;
|
|
188
|
+
}
|
|
189
|
+
yield "?>";
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
async function* escape(value, attribute, budget) {
|
|
194
|
+
let part = "";
|
|
195
|
+
for (const character of value) {
|
|
196
|
+
await budget.tick();
|
|
197
|
+
part += character === "&" ? "&" : character === "<" ? "<" : character === ">" ? ">"
|
|
198
|
+
: attribute && character === '"' ? """ : attribute && character === "\n" ? " "
|
|
199
|
+
: character === "\r" ? " " : attribute && character === "\t" ? "	" : character;
|
|
200
|
+
if (part.length >= 4096) {
|
|
201
|
+
yield part;
|
|
202
|
+
part = "";
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
if (part)
|
|
206
|
+
yield part;
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=evaluate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluate.js","sourceRoot":"","sources":["../../../src/commands/xml/evaluate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type CommandDefinition, type VirtualShellPlugin } from "../../contracts/index.js";
|
|
2
|
+
import { type XmlCommandsOptions } from "./limits.js";
|
|
3
|
+
export { defaultXmlQueryLimits } from "./limits.js";
|
|
4
|
+
export type { XmlCommandsOptions, XmlQueryLimits } from "./limits.js";
|
|
5
|
+
export declare function createXmlCommands(options?: XmlCommandsOptions): readonly CommandDefinition[];
|
|
6
|
+
export declare function xmlCommands(options?: XmlCommandsOptions): VirtualShellPlugin;
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/xml/index.ts"],"names":[],"mappings":"AACA,OAAO,EAA2G,KAAK,iBAAiB,EAAE,KAAK,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAKpM,OAAO,EAAuE,KAAK,kBAAkB,EAAuB,MAAM,aAAa,CAAC;AAIhJ,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AA2HtE,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,kBAAuB,GAAG,SAAS,iBAAiB,EAAE,CAGhG;AACD,wBAAgB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,kBAAkB,CAShF"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { parseXmlSteps, XmlLimitError } from "@poe-platform/safe-fs/core";
|
|
2
|
+
import { FsError, getCommandArguments, readBytes, toByteSource, writeBytes } from "../../contracts/index.js";
|
|
3
|
+
import { shellValueByteLength } from "../../contracts/value.js";
|
|
4
|
+
import { writeDiagnostic } from "../../escaping.js";
|
|
5
|
+
import { pathOf } from "../internal.js";
|
|
6
|
+
import { interruptible } from "../structured/limits.js";
|
|
7
|
+
import { XmlBudget, XmlQueryError, XmlQueryLimitError, resolveXmlQueryLimits } from "./limits.js";
|
|
8
|
+
import { parseQuery } from "./query.js";
|
|
9
|
+
import { evaluate, serialize, stringValue } from "./evaluate.js";
|
|
10
|
+
export { defaultXmlQueryLimits } from "./limits.js";
|
|
11
|
+
async function argumentsFor(context, budget) {
|
|
12
|
+
if (context.args.length > 5)
|
|
13
|
+
throw new XmlQueryError("expected one XML input FILE or -", 2);
|
|
14
|
+
const carrier = getCommandArguments(context);
|
|
15
|
+
const args = carrier.args;
|
|
16
|
+
async function admitted(position, limit) {
|
|
17
|
+
const text = args[position];
|
|
18
|
+
if (text.length > budget.limits[limit])
|
|
19
|
+
throw new XmlQueryLimitError(limit);
|
|
20
|
+
const size = shellValueByteLength(carrier.values[position]);
|
|
21
|
+
if (size > budget.limits[limit])
|
|
22
|
+
throw new XmlQueryLimitError(limit);
|
|
23
|
+
for (let offset = 0; offset < size; offset += 1024)
|
|
24
|
+
await budget.tick(Math.min(1024, size - offset));
|
|
25
|
+
let decoded;
|
|
26
|
+
try {
|
|
27
|
+
decoded = new TextDecoder("utf-8", { fatal: true, ignoreBOM: true }).decode(carrier.bytes(position));
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
throw new XmlQueryError("XPath and filenames require valid UTF-8", 2);
|
|
31
|
+
}
|
|
32
|
+
if (decoded !== text)
|
|
33
|
+
throw new XmlQueryError("XPath and filenames require lossless UTF-8", 2);
|
|
34
|
+
return decoded;
|
|
35
|
+
}
|
|
36
|
+
let index = 0;
|
|
37
|
+
if (context.command === "xmllint") {
|
|
38
|
+
if (args[index++] !== "--xpath")
|
|
39
|
+
throw new XmlQueryError("expected --xpath QUERY [FILE|-]", 2);
|
|
40
|
+
}
|
|
41
|
+
if (args[index] === "--")
|
|
42
|
+
index++;
|
|
43
|
+
const sourceIndex = index++;
|
|
44
|
+
const source = args[sourceIndex];
|
|
45
|
+
if (source === undefined || source.startsWith("-"))
|
|
46
|
+
throw new XmlQueryError("expected QUERY [FILE|-]", 2);
|
|
47
|
+
if (args[index] === "--")
|
|
48
|
+
index++;
|
|
49
|
+
const fileIndex = index++;
|
|
50
|
+
const file = args[fileIndex];
|
|
51
|
+
if (index < args.length || file !== undefined && file.startsWith("-") && file !== "-")
|
|
52
|
+
throw new XmlQueryError("expected one XML input FILE or -", 2);
|
|
53
|
+
const query = await parseQuery(await admitted(sourceIndex, "maxSourceBytes"), budget);
|
|
54
|
+
return { query, file: file === undefined ? undefined : await admitted(fileIndex, "maxInputBytes") };
|
|
55
|
+
}
|
|
56
|
+
async function input(context, file, budget) {
|
|
57
|
+
let source = context.stdin;
|
|
58
|
+
if (file !== undefined && file !== "-") {
|
|
59
|
+
const path = pathOf(context, file);
|
|
60
|
+
const capabilities = context.fs.capabilitiesFor
|
|
61
|
+
? await interruptible(() => context.fs.capabilitiesFor(path, { signal: context.signal }), context.signal)
|
|
62
|
+
: context.fs.capabilities;
|
|
63
|
+
context.signal.throwIfAborted();
|
|
64
|
+
if (context.fs.readStream && capabilities.streamingRead !== false)
|
|
65
|
+
source = context.fs.readStream(path, { signal: context.signal });
|
|
66
|
+
else {
|
|
67
|
+
try {
|
|
68
|
+
source = toByteSource(await interruptible(() => context.fs.readFile(path, { signal: context.signal, maxBytes: budget.limits.maxInputBytes }), context.signal));
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
context.signal.throwIfAborted();
|
|
72
|
+
if (error instanceof FsError && error.code === "EFBIG")
|
|
73
|
+
throw new XmlQueryLimitError("maxInputBytes");
|
|
74
|
+
throw error;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
const parts = [];
|
|
79
|
+
let size = 0;
|
|
80
|
+
const decoder = new TextDecoder("utf-8", { fatal: true });
|
|
81
|
+
for await (const chunk of readBytes(source, context.signal)) {
|
|
82
|
+
await budget.tick();
|
|
83
|
+
size += chunk.byteLength;
|
|
84
|
+
if (size > budget.limits.maxInputBytes)
|
|
85
|
+
throw new XmlQueryLimitError("maxInputBytes");
|
|
86
|
+
// Decode before requesting another chunk; a producer may reuse its backing bytes.
|
|
87
|
+
for (let offset = 0; offset < chunk.length; offset += 4096) {
|
|
88
|
+
await budget.tick(Math.min(4096, chunk.length - offset));
|
|
89
|
+
try {
|
|
90
|
+
parts.push(decoder.decode(chunk.subarray(offset, offset + 4096), { stream: true }));
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
throw new XmlQueryError("XML input must be UTF-8", 1);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
try {
|
|
98
|
+
parts.push(decoder.decode());
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
throw new XmlQueryError("XML input must be UTF-8", 1);
|
|
102
|
+
}
|
|
103
|
+
return parts.join("");
|
|
104
|
+
}
|
|
105
|
+
async function execute(context, limits) {
|
|
106
|
+
const budget = new XmlBudget(limits, context.signal);
|
|
107
|
+
let outputFailed = false;
|
|
108
|
+
try {
|
|
109
|
+
const options = await argumentsFor(context, budget);
|
|
110
|
+
const source = await input(context, options.file, budget);
|
|
111
|
+
const parser = parseXmlSteps(source, { ...limits, maxContentNodes: limits.maxNodes, expectedEncoding: "UTF-8" });
|
|
112
|
+
let parsed = parser.next();
|
|
113
|
+
try {
|
|
114
|
+
while (!parsed.done) {
|
|
115
|
+
await budget.tick(parsed.value);
|
|
116
|
+
parsed = parser.next();
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
finally {
|
|
120
|
+
if (!parsed.done)
|
|
121
|
+
parser.return(undefined);
|
|
122
|
+
}
|
|
123
|
+
const nodes = await evaluate(options.query, parsed.value, budget);
|
|
124
|
+
async function write(part) {
|
|
125
|
+
for (let offset = 0; offset < part.length;) {
|
|
126
|
+
let end = Math.min(offset + 4096, part.length);
|
|
127
|
+
if (end < part.length && part.charCodeAt(end - 1) >= 0xd800 && part.charCodeAt(end - 1) <= 0xdbff)
|
|
128
|
+
end--;
|
|
129
|
+
await budget.tick(end - offset);
|
|
130
|
+
const slice = part.slice(offset, end);
|
|
131
|
+
const size = Buffer.byteLength(slice);
|
|
132
|
+
if (size > limits.maxOutputBytes - budget.outputBytes)
|
|
133
|
+
throw new XmlQueryLimitError("maxOutputBytes");
|
|
134
|
+
budget.outputBytes += size;
|
|
135
|
+
try {
|
|
136
|
+
await writeBytes(context.stdout, Buffer.from(slice), context.signal);
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
outputFailed = true;
|
|
140
|
+
throw error;
|
|
141
|
+
}
|
|
142
|
+
offset = end;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
if (options.query.scalar === "count")
|
|
146
|
+
await write(String(nodes.length));
|
|
147
|
+
else if (options.query.scalar === "boolean")
|
|
148
|
+
await write(nodes.length ? "true" : "false");
|
|
149
|
+
else if (options.query.scalar === "string") {
|
|
150
|
+
for await (const part of stringValue(nodes[0], budget))
|
|
151
|
+
await write(part);
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
if (!nodes.length)
|
|
155
|
+
throw new XmlQueryError("XPath set is empty", 11);
|
|
156
|
+
for (const node of nodes) {
|
|
157
|
+
for await (const part of serialize(node, budget))
|
|
158
|
+
await write(part);
|
|
159
|
+
await write("\n");
|
|
160
|
+
}
|
|
161
|
+
return { exitCode: 0 };
|
|
162
|
+
}
|
|
163
|
+
await write("\n");
|
|
164
|
+
return { exitCode: 0 };
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
context.signal.throwIfAborted();
|
|
168
|
+
if (outputFailed || error instanceof FsError && error.code === "EPIPE")
|
|
169
|
+
throw error;
|
|
170
|
+
const status = error instanceof XmlQueryError ? error.status : error instanceof XmlLimitError ? 5
|
|
171
|
+
: error instanceof SyntaxError || error instanceof FsError ? 1 : undefined;
|
|
172
|
+
if (status === undefined)
|
|
173
|
+
throw error;
|
|
174
|
+
const message = error instanceof Error ? error.message.slice(0, 1000) : "XML query failed";
|
|
175
|
+
await writeDiagnostic(context.stderr, `${context.command}: ${message}\n`, context.signal);
|
|
176
|
+
return { exitCode: status };
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
export function createXmlCommands(options = {}) {
|
|
180
|
+
const limits = resolveXmlQueryLimits(options.limits);
|
|
181
|
+
return ["xq", "xmllint"].map(name => ({ name, execute: context => execute(context, limits) }));
|
|
182
|
+
}
|
|
183
|
+
export function xmlCommands(options = {}) {
|
|
184
|
+
const definitions = createXmlCommands(options);
|
|
185
|
+
const replace = options.replace ?? false;
|
|
186
|
+
return { name: "xml-commands", setup(host) {
|
|
187
|
+
if (!replace)
|
|
188
|
+
for (const definition of definitions) {
|
|
189
|
+
if (host.commands.has(definition.name))
|
|
190
|
+
throw new Error(`Command already registered: ${definition.name}`);
|
|
191
|
+
}
|
|
192
|
+
for (const definition of definitions)
|
|
193
|
+
host.commands.register(definition, { replace });
|
|
194
|
+
} };
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/xml/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export interface XmlQueryLimits {
|
|
2
|
+
readonly maxInputBytes: number;
|
|
3
|
+
readonly maxOutputBytes: number;
|
|
4
|
+
readonly maxSourceBytes: number;
|
|
5
|
+
readonly maxDepth: number;
|
|
6
|
+
readonly maxNodes: number;
|
|
7
|
+
readonly maxAttributes: number;
|
|
8
|
+
readonly maxAttributesPerElement: number;
|
|
9
|
+
readonly maxNamespaces: number;
|
|
10
|
+
readonly maxSteps: number;
|
|
11
|
+
readonly maxResults: number;
|
|
12
|
+
}
|
|
13
|
+
export interface XmlCommandsOptions {
|
|
14
|
+
readonly replace?: boolean;
|
|
15
|
+
readonly limits?: Partial<XmlQueryLimits>;
|
|
16
|
+
}
|
|
17
|
+
export declare const defaultXmlQueryLimits: Readonly<XmlQueryLimits>;
|
|
18
|
+
export declare class XmlQueryError extends Error {
|
|
19
|
+
readonly status: number;
|
|
20
|
+
constructor(message: string, status: number);
|
|
21
|
+
}
|
|
22
|
+
export declare class XmlQueryLimitError extends XmlQueryError {
|
|
23
|
+
constructor(name: keyof XmlQueryLimits);
|
|
24
|
+
}
|
|
25
|
+
export declare function resolveXmlQueryLimits(options?: Partial<XmlQueryLimits>): XmlQueryLimits;
|
|
26
|
+
export declare class XmlBudget {
|
|
27
|
+
readonly limits: XmlQueryLimits;
|
|
28
|
+
readonly signal: AbortSignal;
|
|
29
|
+
private steps;
|
|
30
|
+
private checkpoint;
|
|
31
|
+
outputBytes: number;
|
|
32
|
+
constructor(limits: XmlQueryLimits, signal: AbortSignal);
|
|
33
|
+
tick(work?: number): Promise<void>;
|
|
34
|
+
results(size: number): void;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=limits.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"limits.d.ts","sourceRoot":"","sources":["../../../src/commands/xml/limits.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AACD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;CAC3C;AACD,eAAO,MAAM,qBAAqB,EAAE,QAAQ,CAAC,cAAc,CAKzD,CAAC;AACH,qBAAa,aAAc,SAAQ,KAAK;IACT,QAAQ,CAAC,MAAM,EAAE,MAAM;gBAAxC,OAAO,EAAE,MAAM,EAAW,MAAM,EAAE,MAAM;CACrD;AACD,qBAAa,kBAAmB,SAAQ,aAAa;gBACvC,IAAI,EAAE,MAAM,cAAc;CACvC;AACD,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,OAAO,CAAC,cAAc,CAAM,GAAG,cAAc,CAS3F;AACD,qBAAa,SAAS;IAIR,QAAQ,CAAC,MAAM,EAAE,cAAc;IAAE,QAAQ,CAAC,MAAM,EAAE,WAAW;IAHzE,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,UAAU,CAAK;IACvB,WAAW,SAAK;gBACK,MAAM,EAAE,cAAc,EAAW,MAAM,EAAE,WAAW;IACnE,IAAI,CAAC,IAAI,SAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAUnC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;CAG5B"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { yieldTurn } from "../../contracts/yield.js";
|
|
2
|
+
export const defaultXmlQueryLimits = Object.freeze({
|
|
3
|
+
maxInputBytes: 8 * 1024 * 1024, maxOutputBytes: 8 * 1024 * 1024,
|
|
4
|
+
maxSourceBytes: 64 * 1024, maxDepth: 64, maxNodes: 100_000,
|
|
5
|
+
maxAttributes: 10_000, maxAttributesPerElement: 128,
|
|
6
|
+
maxNamespaces: 256, maxSteps: 1_000_000, maxResults: 100_000,
|
|
7
|
+
});
|
|
8
|
+
export class XmlQueryError extends Error {
|
|
9
|
+
status;
|
|
10
|
+
constructor(message, status) {
|
|
11
|
+
super(message);
|
|
12
|
+
this.status = status;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export class XmlQueryLimitError extends XmlQueryError {
|
|
16
|
+
constructor(name) { super(`${name} limit exceeded`, 5); }
|
|
17
|
+
}
|
|
18
|
+
export function resolveXmlQueryLimits(options = {}) {
|
|
19
|
+
const limits = { ...defaultXmlQueryLimits, ...options };
|
|
20
|
+
for (const [name, value] of Object.entries(limits)) {
|
|
21
|
+
if (!Object.hasOwn(defaultXmlQueryLimits, name) || !Number.isSafeInteger(value) || value < 1) {
|
|
22
|
+
throw new RangeError(`${name} must be a positive safe integer XML limit`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
if (limits.maxDepth > 256)
|
|
26
|
+
throw new RangeError("maxDepth must be <=256");
|
|
27
|
+
return Object.freeze(limits);
|
|
28
|
+
}
|
|
29
|
+
export class XmlBudget {
|
|
30
|
+
limits;
|
|
31
|
+
signal;
|
|
32
|
+
steps = 0;
|
|
33
|
+
checkpoint = 0;
|
|
34
|
+
outputBytes = 0;
|
|
35
|
+
constructor(limits, signal) {
|
|
36
|
+
this.limits = limits;
|
|
37
|
+
this.signal = signal;
|
|
38
|
+
}
|
|
39
|
+
async tick(work = 1) {
|
|
40
|
+
this.signal.throwIfAborted();
|
|
41
|
+
this.steps += work;
|
|
42
|
+
if (this.steps > this.limits.maxSteps)
|
|
43
|
+
throw new XmlQueryLimitError("maxSteps");
|
|
44
|
+
this.checkpoint += work;
|
|
45
|
+
if (this.checkpoint >= 1024) {
|
|
46
|
+
this.checkpoint = 0;
|
|
47
|
+
await yieldTurn(this.signal);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
results(size) {
|
|
51
|
+
if (size > this.limits.maxResults)
|
|
52
|
+
throw new XmlQueryLimitError("maxResults");
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=limits.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"limits.js","sourceRoot":"","sources":["../../../src/commands/xml/limits.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAkBrD,MAAM,CAAC,MAAM,qBAAqB,GAA6B,MAAM,CAAC,MAAM,CAAC;IAC3E,aAAa,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,EAAE,cAAc,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI;IAC/D,cAAc,EAAE,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO;IAC1D,aAAa,EAAE,MAAM,EAAE,uBAAuB,EAAE,GAAG;IACnD,aAAa,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO;CAC7D,CAAC,CAAC;AACH,MAAM,OAAO,aAAc,SAAQ,KAAK;IACA;IAAtC,YAAY,OAAe,EAAW,MAAc;QAAI,KAAK,CAAC,OAAO,CAAC,CAAC;QAAjC,WAAM,GAAN,MAAM,CAAQ;IAAoB,CAAC;CAC1E;AACD,MAAM,OAAO,kBAAmB,SAAQ,aAAa;IACnD,YAAY,IAA0B,IAAI,KAAK,CAAC,GAAG,IAAI,iBAAiB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;CAChF;AACD,MAAM,UAAU,qBAAqB,CAAC,UAAmC,EAAE;IACzE,MAAM,MAAM,GAAG,EAAE,GAAG,qBAAqB,EAAE,GAAG,OAAO,EAAE,CAAC;IACxD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACnD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,qBAAqB,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YAC7F,MAAM,IAAI,UAAU,CAAC,GAAG,IAAI,4CAA4C,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,GAAG,GAAG;QAAE,MAAM,IAAI,UAAU,CAAC,wBAAwB,CAAC,CAAC;IAC1E,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC;AACD,MAAM,OAAO,SAAS;IAIC;IAAiC;IAH9C,KAAK,GAAG,CAAC,CAAC;IACV,UAAU,GAAG,CAAC,CAAC;IACvB,WAAW,GAAG,CAAC,CAAC;IAChB,YAAqB,MAAsB,EAAW,MAAmB;QAApD,WAAM,GAAN,MAAM,CAAgB;QAAW,WAAM,GAAN,MAAM,CAAa;IAAG,CAAC;IAC7E,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC;QACjB,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;QAC7B,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC;QACnB,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ;YAAE,MAAM,IAAI,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAChF,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC;QACxB,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;YACpB,MAAM,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IACD,OAAO,CAAC,IAAY;QAClB,IAAI,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU;YAAE,MAAM,IAAI,kBAAkB,CAAC,YAAY,CAAC,CAAC;IAChF,CAAC;CACF"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { XmlBudget } from "./limits.js";
|
|
2
|
+
export type Predicate = {
|
|
3
|
+
kind: "position";
|
|
4
|
+
value: number;
|
|
5
|
+
} | {
|
|
6
|
+
kind: "attribute";
|
|
7
|
+
name: string;
|
|
8
|
+
value: string;
|
|
9
|
+
};
|
|
10
|
+
export interface QueryStep {
|
|
11
|
+
readonly descendant: boolean;
|
|
12
|
+
readonly kind: "element" | "attribute" | "text";
|
|
13
|
+
readonly name: string;
|
|
14
|
+
readonly predicates: readonly Predicate[];
|
|
15
|
+
}
|
|
16
|
+
export interface Query {
|
|
17
|
+
readonly scalar: "string" | "count" | "boolean" | undefined;
|
|
18
|
+
readonly steps: readonly QueryStep[];
|
|
19
|
+
}
|
|
20
|
+
export declare function parseQuery(source: string, budget: XmlBudget): Promise<Query>;
|
|
21
|
+
//# sourceMappingURL=query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../src/commands/xml/query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAqC,MAAM,aAAa,CAAC;AAE3E,MAAM,MAAM,SAAS,GAAG;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AACjH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,WAAW,GAAG,MAAM,CAAC;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,SAAS,SAAS,EAAE,CAAC;CAC3C;AACD,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,MAAM,EAAE,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;IAC5D,QAAQ,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,CAAC;CACtC;AAID,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,CAwElF"}
|