@push.rocks/smartlinuxrepo 1.1.2 → 1.2.0

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 (51) hide show
  1. package/dist_ts/00_commitinfo_data.js +1 -1
  2. package/dist_ts/alpine/apkindexreader.d.ts +87 -0
  3. package/dist_ts/alpine/apkindexreader.js +193 -0
  4. package/dist_ts/arch/indexreader.d.ts +35 -0
  5. package/dist_ts/arch/indexreader.js +45 -0
  6. package/dist_ts/arch/reader.js +1 -1
  7. package/dist_ts/debian/indexbuilder.js +8 -23
  8. package/dist_ts/debian/indexreader.d.ts +107 -0
  9. package/dist_ts/debian/indexreader.js +274 -0
  10. package/dist_ts/debian/reader.js +1 -1
  11. package/dist_ts/debian/rules.d.ts +18 -0
  12. package/dist_ts/debian/rules.js +81 -2
  13. package/dist_ts/index.d.ts +14 -4
  14. package/dist_ts/index.js +9 -3
  15. package/dist_ts/readers/decompress.d.ts +1 -2
  16. package/dist_ts/readers/decompress.js +1 -1
  17. package/dist_ts/readers/document.d.ts +36 -0
  18. package/dist_ts/readers/document.js +110 -0
  19. package/dist_ts/rpm/repodata.d.ts +3 -2
  20. package/dist_ts/rpm/repodata.js +5 -4
  21. package/dist_ts/rpm/repodatareader.d.ts +173 -0
  22. package/dist_ts/rpm/repodatareader.js +414 -0
  23. package/dist_ts/rpm/xmlreader.d.ts +70 -0
  24. package/dist_ts/rpm/xmlreader.js +576 -0
  25. package/dist_ts/shared/errors.d.ts +12 -4
  26. package/dist_ts/shared/errors.js +1 -1
  27. package/dist_ts/shared/limits.d.ts +8 -1
  28. package/dist_ts/shared/limits.js +5 -2
  29. package/dist_ts/shared/types.d.ts +2 -0
  30. package/dist_ts/signing/verifiers.d.ts +43 -0
  31. package/dist_ts/signing/verifiers.js +81 -2
  32. package/package.json +1 -1
  33. package/readme.md +53 -2
  34. package/ts/00_commitinfo_data.ts +1 -1
  35. package/ts/alpine/apkindexreader.ts +265 -0
  36. package/ts/arch/indexreader.ts +66 -0
  37. package/ts/arch/reader.ts +2 -1
  38. package/ts/debian/indexbuilder.ts +13 -23
  39. package/ts/debian/indexreader.ts +372 -0
  40. package/ts/debian/reader.ts +2 -1
  41. package/ts/debian/rules.ts +83 -1
  42. package/ts/index.ts +40 -2
  43. package/ts/readers/decompress.ts +1 -3
  44. package/ts/readers/document.ts +136 -0
  45. package/ts/rpm/repodata.ts +4 -3
  46. package/ts/rpm/repodatareader.ts +582 -0
  47. package/ts/rpm/xmlreader.ts +680 -0
  48. package/ts/shared/errors.ts +13 -4
  49. package/ts/shared/limits.ts +9 -1
  50. package/ts/shared/types.ts +3 -0
  51. package/ts/signing/verifiers.ts +113 -1
@@ -0,0 +1,414 @@
1
+ import { LinuxRepoError, limitExceeded } from '../shared/errors.js';
2
+ import { resolveLinuxPackageLimits } from '../shared/limits.js';
3
+ import { assertLinuxCompression, assertReaderBytes, assertReaderInput, readIndexDocument } from '../readers/document.js';
4
+ import { scanXmlDocument } from './xmlreader.js';
5
+ const DOCUMENTS = new Map([
6
+ ['primary', 'metadata'],
7
+ ['filelists', 'filelists'],
8
+ ['other', 'otherdata'],
9
+ ]);
10
+ /**
11
+ * Reads a `primary`, `filelists` or `other` document (`.xml`, `.xml.gz`,
12
+ * `.xml.xz`, `.xml.zst`; the caller names `compression` and `document`) into
13
+ * its frame and `<package>` units. The XML rules are the strict scanner's
14
+ * (see `IRpmXmlFrame`; any refusal is `malformed-index`): the root must be
15
+ * `<metadata>`, `<filelists>` or `<otherdata>` for the document, and its
16
+ * children `<package>` elements with only whitespace between them, which is
17
+ * not returned. A package without its key (primary `<checksum pkgid="YES">`,
18
+ * filelists and other `pkgid`) is `missing-field` (`pkgid`); a package with
19
+ * two of an element the view reads (`<name>`, `<arch>`, `<version>`, `<size>`,
20
+ * a key `<checksum>`) is `malformed-index`.
21
+ *
22
+ * Bounds: the decoded document by `maxIndexBytes`, packages and files per
23
+ * package by `maxEntries`, one package by `maxMetadataBytes`, one start tag
24
+ * by `maxHeaderBytes`. Duplicates are kept; all bytes are views into `decoded`.
25
+ */
26
+ export async function readRpmRepodata(inputArg) {
27
+ assertReaderInput(inputArg);
28
+ assertReaderBytes(inputArg.bytes);
29
+ assertLinuxCompression(inputArg.compression);
30
+ const document = inputArg.document;
31
+ const rootName = typeof document === 'string' ? DOCUMENTS.get(document) : undefined;
32
+ if (rootName === undefined) {
33
+ throw new LinuxRepoError('invalid-input', "document must be 'primary', 'filelists' or 'other'", {
34
+ field: 'document',
35
+ value: typeof document === 'string' ? document : typeof document,
36
+ });
37
+ }
38
+ const limits = resolveLinuxPackageLimits(inputArg.limits);
39
+ const decoded = await readIndexDocument(inputArg.bytes, inputArg.compression, limits);
40
+ const packages = [];
41
+ const frame = scanXmlDocument(decoded, {
42
+ rootName,
43
+ unitName: 'package',
44
+ keepOtherChildren: false,
45
+ limits,
46
+ createUnit: (startArg) => new PackageHandler(document, startArg, limits),
47
+ unit: (handlerArg, startArg, endArg) => {
48
+ packages.push(handlerArg.result(decoded.subarray(startArg, endArg)));
49
+ },
50
+ other: () => undefined,
51
+ });
52
+ return { ...frameOf(decoded, rootName, frame), decoded, document, packages };
53
+ }
54
+ /**
55
+ * Reads an `updateinfo` document into its frame and `<update>` units: the
56
+ * root must be `<updates>`, the unit key is the `<id>` text (none is
57
+ * `missing-field`, two are `malformed-index`), and the packages are the
58
+ * `<pkglist><collection short><package …><filename>` entries in order (a
59
+ * package with two `<filename>` elements is `malformed-index`). XML rules,
60
+ * bounds and ownership as `readRpmRepodata`; packages per update count against
61
+ * `maxEntries`.
62
+ */
63
+ export async function readRpmUpdateInfo(inputArg) {
64
+ assertReaderInput(inputArg);
65
+ assertReaderBytes(inputArg.bytes);
66
+ assertLinuxCompression(inputArg.compression);
67
+ const limits = resolveLinuxPackageLimits(inputArg.limits);
68
+ const decoded = await readIndexDocument(inputArg.bytes, inputArg.compression, limits);
69
+ const updates = [];
70
+ const frame = scanXmlDocument(decoded, {
71
+ rootName: 'updates',
72
+ unitName: 'update',
73
+ keepOtherChildren: false,
74
+ limits,
75
+ createUnit: (startArg) => new UpdateHandler(startArg, limits),
76
+ unit: (handlerArg, startArg, endArg) => {
77
+ updates.push(handlerArg.result(decoded.subarray(startArg, endArg)));
78
+ },
79
+ other: () => undefined,
80
+ });
81
+ return { ...frameOf(decoded, 'updates', frame), decoded, updates };
82
+ }
83
+ /**
84
+ * Reads a plain `repomd.xml` into its frame, `<data>` units and the other
85
+ * root children (kept raw, in `otherElements`). A `<data>` without a `type`
86
+ * attribute, `<checksum>` or `<location href>` is `missing-field`; a `<data>`
87
+ * with two of `<checksum>`, `<open-checksum>`, `<location>`, `<timestamp>`,
88
+ * `<size>` or `<open-size>` is `malformed-index`. XML rules and bounds as
89
+ * `readRpmRepodata` (the plain input counts against `maxIndexBytes`); all
90
+ * bytes are views into a copy of the input.
91
+ */
92
+ export async function readRpmRepomd(inputArg) {
93
+ assertReaderInput(inputArg);
94
+ assertReaderBytes(inputArg.bytes);
95
+ const limits = resolveLinuxPackageLimits(inputArg.limits);
96
+ const decoded = await readIndexDocument(inputArg.bytes, 'none', limits);
97
+ const data = [];
98
+ const otherElements = [];
99
+ const frame = scanXmlDocument(decoded, {
100
+ rootName: 'repomd',
101
+ unitName: 'data',
102
+ keepOtherChildren: true,
103
+ limits,
104
+ createUnit: (startArg) => new RepomdDataHandler(startArg),
105
+ unit: (handlerArg, startArg, endArg) => {
106
+ data.push(handlerArg.result(decoded.subarray(startArg, endArg)));
107
+ },
108
+ other: (nameArg, startArg, endArg) => {
109
+ otherElements.push({ name: nameArg, bytes: decoded.subarray(startArg, endArg), offset: startArg });
110
+ },
111
+ });
112
+ return { ...frameOf(decoded, 'repomd', frame), data, otherElements };
113
+ }
114
+ function frameOf(decodedArg, rootNameArg, frameArg) {
115
+ return {
116
+ prolog: decodedArg.subarray(0, frameArg.rootStart),
117
+ rootName: rootNameArg,
118
+ rootStartTag: decodedArg.subarray(frameArg.rootStart, frameArg.rootStartEnd),
119
+ rootAttributes: frameArg.rootAttributes.map((attribute) => ({ name: attribute.name, value: attribute.value })),
120
+ namespace: attributeOf(frameArg.rootAttributes, 'xmlns'),
121
+ rootEndTag: decodedArg.subarray(frameArg.rootEndStart, frameArg.rootEnd),
122
+ trailer: decodedArg.subarray(frameArg.rootEnd),
123
+ };
124
+ }
125
+ function attributeOf(attributesArg, nameArg) {
126
+ return attributesArg.find((attribute) => attribute.name === nameArg)?.value ?? '';
127
+ }
128
+ function hasAttribute(attributesArg, nameArg) {
129
+ return attributesArg.some((attribute) => attribute.name === nameArg);
130
+ }
131
+ /** The path of open element names inside one unit, for the handlers' context. */
132
+ class UnitHandler {
133
+ offset;
134
+ path = [];
135
+ constructor(offset) {
136
+ this.offset = offset;
137
+ }
138
+ start(depthArg, nameArg, attributesArg) {
139
+ const capture = this.open(depthArg, nameArg, attributesArg);
140
+ this.path.push(nameArg);
141
+ return capture;
142
+ }
143
+ end(depthArg, nameArg, textArg) {
144
+ this.path.pop();
145
+ this.close(depthArg, nameArg, textArg);
146
+ }
147
+ /** The parent element's name at `depthArg` (the unit element at depth 1). */
148
+ parent() {
149
+ return this.path[this.path.length - 1];
150
+ }
151
+ duplicate(whatArg) {
152
+ return new LinuxRepoError('malformed-index', `a unit holds two ${whatArg} elements`, { field: whatArg, value: this.offset });
153
+ }
154
+ }
155
+ class PackageHandler extends UnitHandler {
156
+ document;
157
+ limits;
158
+ pkgid = null;
159
+ name = null;
160
+ arch = null;
161
+ version = null;
162
+ size = null;
163
+ files = [];
164
+ fileType = '';
165
+ constructor(document, offsetArg, limits) {
166
+ super(offsetArg);
167
+ this.document = document;
168
+ this.limits = limits;
169
+ }
170
+ open(depthArg, nameArg, attributesArg) {
171
+ if (depthArg === 0) {
172
+ if (this.document !== 'primary') {
173
+ if (!hasAttribute(attributesArg, 'pkgid')) {
174
+ throw this.missingKey();
175
+ }
176
+ this.pkgid = attributeOf(attributesArg, 'pkgid');
177
+ this.name = attributeOf(attributesArg, 'name');
178
+ this.arch = attributeOf(attributesArg, 'arch');
179
+ }
180
+ return false;
181
+ }
182
+ const parent = this.parent();
183
+ if (depthArg === 1) {
184
+ if (nameArg === 'version') {
185
+ if (this.version !== null) {
186
+ throw this.duplicate('<version>');
187
+ }
188
+ this.version = {
189
+ epoch: attributeOf(attributesArg, 'epoch'),
190
+ version: attributeOf(attributesArg, 'ver'),
191
+ release: attributeOf(attributesArg, 'rel'),
192
+ };
193
+ return false;
194
+ }
195
+ if (this.document === 'primary') {
196
+ if (nameArg === 'name' || nameArg === 'arch') {
197
+ return true;
198
+ }
199
+ if (nameArg === 'checksum') {
200
+ return attributeOf(attributesArg, 'pkgid') === 'YES';
201
+ }
202
+ if (nameArg === 'size') {
203
+ if (this.size !== null) {
204
+ throw this.duplicate('<size>');
205
+ }
206
+ this.size = {
207
+ package: attributeOf(attributesArg, 'package'),
208
+ installed: attributeOf(attributesArg, 'installed'),
209
+ archive: attributeOf(attributesArg, 'archive'),
210
+ };
211
+ return false;
212
+ }
213
+ return false;
214
+ }
215
+ if (this.document === 'filelists' && nameArg === 'file') {
216
+ return this.openFile(attributesArg);
217
+ }
218
+ return false;
219
+ }
220
+ if (depthArg === 2 && this.document === 'primary' && parent === 'format' && nameArg === 'file') {
221
+ return this.openFile(attributesArg);
222
+ }
223
+ return false;
224
+ }
225
+ close(depthArg, nameArg, textArg) {
226
+ if (textArg === null) {
227
+ return;
228
+ }
229
+ if (nameArg === 'file') {
230
+ this.files.push({ path: textArg, type: this.fileType });
231
+ }
232
+ else if (nameArg === 'name') {
233
+ if (this.name !== null) {
234
+ throw this.duplicate('<name>');
235
+ }
236
+ this.name = textArg;
237
+ }
238
+ else if (nameArg === 'arch') {
239
+ if (this.arch !== null) {
240
+ throw this.duplicate('<arch>');
241
+ }
242
+ this.arch = textArg;
243
+ }
244
+ else if (nameArg === 'checksum') {
245
+ if (this.pkgid !== null) {
246
+ throw this.duplicate('<checksum pkgid="YES">');
247
+ }
248
+ this.pkgid = textArg;
249
+ }
250
+ }
251
+ openFile(attributesArg) {
252
+ if (this.files.length + 1 > this.limits.maxEntries) {
253
+ throw limitExceeded('maxEntries', this.limits.maxEntries, 'files per package');
254
+ }
255
+ this.fileType = attributeOf(attributesArg, 'type');
256
+ return true;
257
+ }
258
+ missingKey() {
259
+ return new LinuxRepoError('missing-field', `a ${this.document} <package> has no pkgid`, { field: 'pkgid', value: this.offset });
260
+ }
261
+ result(bytesArg) {
262
+ if (this.pkgid === null) {
263
+ throw this.missingKey();
264
+ }
265
+ return {
266
+ bytes: bytesArg,
267
+ offset: this.offset,
268
+ pkgid: this.pkgid,
269
+ name: this.name ?? '',
270
+ arch: this.arch ?? '',
271
+ epoch: this.version?.epoch ?? '',
272
+ version: this.version?.version ?? '',
273
+ release: this.version?.release ?? '',
274
+ size: this.size,
275
+ files: this.files,
276
+ };
277
+ }
278
+ }
279
+ class UpdateHandler extends UnitHandler {
280
+ limits;
281
+ id = null;
282
+ collection = '';
283
+ pending = null;
284
+ packages = [];
285
+ constructor(offsetArg, limits) {
286
+ super(offsetArg);
287
+ this.limits = limits;
288
+ }
289
+ open(depthArg, nameArg, attributesArg) {
290
+ const parent = this.parent();
291
+ if (depthArg === 1 && nameArg === 'id') {
292
+ return true;
293
+ }
294
+ if (depthArg === 2 && parent === 'pkglist' && nameArg === 'collection') {
295
+ this.collection = attributeOf(attributesArg, 'short');
296
+ return false;
297
+ }
298
+ if (depthArg === 3 && parent === 'collection' && this.path[1] === 'pkglist' && nameArg === 'package') {
299
+ if (this.packages.length + 1 > this.limits.maxEntries) {
300
+ throw limitExceeded('maxEntries', this.limits.maxEntries, 'packages per update');
301
+ }
302
+ this.pending = { attributes: attributesArg, fileName: null };
303
+ return false;
304
+ }
305
+ if (depthArg === 4 && parent === 'package' && this.pending !== null && nameArg === 'filename') {
306
+ return true;
307
+ }
308
+ return false;
309
+ }
310
+ close(depthArg, nameArg, textArg) {
311
+ if (depthArg === 1 && nameArg === 'id' && textArg !== null) {
312
+ if (this.id !== null) {
313
+ throw this.duplicate('<id>');
314
+ }
315
+ this.id = textArg;
316
+ }
317
+ else if (depthArg === 4 && nameArg === 'filename' && textArg !== null && this.pending !== null) {
318
+ if (this.pending.fileName !== null) {
319
+ throw this.duplicate('<filename>');
320
+ }
321
+ this.pending.fileName = textArg;
322
+ }
323
+ else if (depthArg === 3 && nameArg === 'package' && this.pending !== null) {
324
+ const attributes = this.pending.attributes;
325
+ this.packages.push({
326
+ collection: this.collection,
327
+ name: attributeOf(attributes, 'name'),
328
+ epoch: attributeOf(attributes, 'epoch'),
329
+ version: attributeOf(attributes, 'version'),
330
+ release: attributeOf(attributes, 'release'),
331
+ arch: attributeOf(attributes, 'arch'),
332
+ src: attributeOf(attributes, 'src'),
333
+ fileName: this.pending.fileName ?? '',
334
+ });
335
+ this.pending = null;
336
+ }
337
+ else if (depthArg === 2 && nameArg === 'collection') {
338
+ this.collection = '';
339
+ }
340
+ }
341
+ result(bytesArg) {
342
+ if (this.id === null) {
343
+ throw new LinuxRepoError('missing-field', 'an <update> has no <id>', { field: 'id', value: this.offset });
344
+ }
345
+ return { bytes: bytesArg, offset: this.offset, id: this.id, packages: this.packages };
346
+ }
347
+ }
348
+ class RepomdDataHandler extends UnitHandler {
349
+ type = null;
350
+ values = new Map();
351
+ pendingType = '';
352
+ open(depthArg, nameArg, attributesArg) {
353
+ if (depthArg === 0) {
354
+ if (hasAttribute(attributesArg, 'type')) {
355
+ this.type = attributeOf(attributesArg, 'type');
356
+ }
357
+ return false;
358
+ }
359
+ if (depthArg !== 1) {
360
+ return false;
361
+ }
362
+ switch (nameArg) {
363
+ case 'checksum':
364
+ case 'open-checksum':
365
+ case 'timestamp':
366
+ case 'size':
367
+ case 'open-size':
368
+ case 'location':
369
+ if (this.values.has(nameArg)) {
370
+ throw this.duplicate(`<${nameArg}>`);
371
+ }
372
+ if (nameArg === 'location') {
373
+ this.values.set(nameArg, { type: '', text: hasAttribute(attributesArg, 'href') ? attributeOf(attributesArg, 'href') : null });
374
+ return false;
375
+ }
376
+ this.pendingType = attributeOf(attributesArg, 'type');
377
+ return true;
378
+ default:
379
+ return false;
380
+ }
381
+ }
382
+ close(depthArg, nameArg, textArg) {
383
+ if (depthArg === 1 && textArg !== null) {
384
+ this.values.set(nameArg, { type: this.pendingType, text: textArg });
385
+ }
386
+ }
387
+ result(bytesArg) {
388
+ const missing = (fieldArg) => new LinuxRepoError('missing-field', `a repomd <data> has no ${fieldArg}`, { field: fieldArg, value: this.offset });
389
+ if (this.type === null) {
390
+ throw missing('type');
391
+ }
392
+ const checksum = this.values.get('checksum');
393
+ if (checksum === undefined || checksum.text === null) {
394
+ throw missing('checksum');
395
+ }
396
+ const location = this.values.get('location');
397
+ if (location === undefined || location.text === null) {
398
+ throw missing('location');
399
+ }
400
+ const openChecksum = this.values.get('open-checksum');
401
+ return {
402
+ bytes: bytesArg,
403
+ offset: this.offset,
404
+ type: this.type,
405
+ location: location.text,
406
+ checksum: { type: checksum.type, value: checksum.text },
407
+ openChecksum: openChecksum === undefined || openChecksum.text === null ? null : { type: openChecksum.type, value: openChecksum.text },
408
+ timestamp: this.values.get('timestamp')?.text ?? null,
409
+ size: this.values.get('size')?.text ?? null,
410
+ openSize: this.values.get('open-size')?.text ?? null,
411
+ };
412
+ }
413
+ }
414
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb2RhdGFyZWFkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9ycG0vcmVwb2RhdGFyZWFkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNwRSxPQUFPLEVBQUUseUJBQXlCLEVBQTRCLE1BQU0scUJBQXFCLENBQUM7QUFFMUYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekgsT0FBTyxFQUFFLGVBQWUsRUFBZ0UsTUFBTSxnQkFBZ0IsQ0FBQztBQXFJL0csTUFBTSxTQUFTLEdBQWdDLElBQUksR0FBRyxDQUErQjtJQUNuRixDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUM7SUFDdkIsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDO0lBQzFCLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQztDQUN2QixDQUFDLENBQUM7QUFFSDs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGVBQWUsQ0FBQyxRQUtyQztJQUNDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzVCLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsQyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDN0MsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQztJQUNuQyxNQUFNLFFBQVEsR0FBRyxPQUFPLFFBQVEsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNwRixJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUMzQixNQUFNLElBQUksY0FBYyxDQUFDLGVBQWUsRUFB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
@@ -0,0 +1,70 @@
1
+ import type { ILinuxPackageLimits } from '../shared/limits.js';
2
+ /**
3
+ * A strict, iterative XML 1.0 scanner over the bytes of one repodata document,
4
+ * the reading side of `xml.ts`. It checks well-formedness and hands the
5
+ * elements of each unit (a child of the root) to a handler, without building a
6
+ * tree. Every refusal is `malformed-index` with the byte offset in
7
+ * `detail.value`:
8
+ * - the document must be strict UTF-8 holding only XML characters; an
9
+ * optional UTF-8 byte order mark and XML declaration may lead it, and a
10
+ * declared `encoding` other than UTF-8 (ASCII case-insensitive) is refused;
11
+ * - `<!DOCTYPE` (or any other `<!` declaration) is refused, so there are no
12
+ * entity definitions: only `&lt; &gt; &amp; &apos; &quot;` and numeric
13
+ * references to XML characters are accepted;
14
+ * - tags must match, attribute names must be unique within a tag and be
15
+ * separated by whitespace, values are quoted and hold no `<`, text holds no
16
+ * `]]>`, comments hold no `--`, a processing instruction's target is not
17
+ * `xml` (except the declaration at the start), and there is exactly one root;
18
+ * - comments, processing instructions and whitespace may sit before and after
19
+ * the root; inside it only whitespace may sit between units; inside a unit
20
+ * CDATA sections, comments, processing instructions and empty-element tags
21
+ * are accepted.
22
+ *
23
+ * Names are matched literally with their prefixes (no namespace processing);
24
+ * a name starts with an ASCII letter, `_`, `:` or a non-ASCII character and
25
+ * continues with those, digits, `.` and `-` (every non-ASCII character counts
26
+ * as a name character, a simplification of the XML name production). Values
27
+ * handed to the handler are decoded: references replaced, line ends
28
+ * normalized (CRLF and CR to LF), and in attribute values literal tabs and
29
+ * line ends become spaces (XML 1.0 sections 2.11 and 3.3.3).
30
+ *
31
+ * Bounds: one start tag by `maxHeaderBytes`, one unit by `maxMetadataBytes`,
32
+ * units and open elements at a time by `maxEntries`.
33
+ */
34
+ export interface IXmlAttribute {
35
+ readonly name: string;
36
+ readonly value: string;
37
+ }
38
+ /** Receives the elements of one unit; `depth` 0 is the unit element itself. */
39
+ export interface IXmlUnitHandler {
40
+ /** An element starts; returning true captures its direct character data for `end`. */
41
+ start(depthArg: number, nameArg: string, attributesArg: readonly IXmlAttribute[]): boolean;
42
+ /** An element ends; `textArg` is its captured character data, or null when not captured. */
43
+ end(depthArg: number, nameArg: string, textArg: string | null): void;
44
+ }
45
+ export interface IXmlScanOptions {
46
+ /** The required root element name. */
47
+ rootName: string;
48
+ /** The unit element name among the root's children. */
49
+ unitName: string;
50
+ /** Whether other root children are accepted (repomd); otherwise they are refused. */
51
+ keepOtherChildren: boolean;
52
+ limits: Readonly<ILinuxPackageLimits>;
53
+ /** A handler for the unit starting at `startArg` (the offset of its `<`). */
54
+ createUnit(startArg: number): IXmlUnitHandler;
55
+ /** A unit ended: its bytes are `[startArg, endArg)`. */
56
+ unit(handlerArg: IXmlUnitHandler, startArg: number, endArg: number): void;
57
+ /** Another root child ended (only with `keepOtherChildren`). */
58
+ other(nameArg: string, startArg: number, endArg: number): void;
59
+ }
60
+ /** Where the root element's tags sit in the document. */
61
+ export interface IXmlFrameScan {
62
+ rootStart: number;
63
+ rootStartEnd: number;
64
+ rootAttributes: IXmlAttribute[];
65
+ /** The root end tag `[rootEndStart, rootEnd)`; both equal `rootStartEnd` for an empty-element root. */
66
+ rootEndStart: number;
67
+ rootEnd: number;
68
+ }
69
+ /** Scans one document; see the module comment. */
70
+ export declare function scanXmlDocument(documentArg: Uint8Array, optionsArg: IXmlScanOptions): IXmlFrameScan;