@push.rocks/smartlinuxrepo 1.1.1 → 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 +2 -2
  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 +6 -2
  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 +14 -5
  16. package/dist_ts/readers/decompress.js +401 -26
  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 +9 -2
  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 +56 -3
  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 +3 -2
  38. package/ts/debian/indexbuilder.ts +13 -23
  39. package/ts/debian/indexreader.ts +372 -0
  40. package/ts/debian/reader.ts +7 -2
  41. package/ts/debian/rules.ts +83 -1
  42. package/ts/index.ts +40 -2
  43. package/ts/readers/decompress.ts +442 -32
  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 +10 -2
  50. package/ts/shared/types.ts +3 -0
  51. package/ts/signing/verifiers.ts +113 -1
@@ -0,0 +1,576 @@
1
+ import { LinuxRepoError, limitExceeded } from '../shared/errors.js';
2
+ const LT = 0x3c;
3
+ const GT = 0x3e;
4
+ const AMP = 0x26;
5
+ const SLASH = 0x2f;
6
+ const BANG = 0x21;
7
+ const QUESTION = 0x3f;
8
+ const EQUALS = 0x3d;
9
+ const QUOTE = 0x22;
10
+ const APOSTROPHE = 0x27;
11
+ const SEMICOLON = 0x3b;
12
+ const HASH = 0x23;
13
+ const CR = 0x0d;
14
+ const LF = 0x0a;
15
+ const TAB = 0x09;
16
+ const SPACE = 0x20;
17
+ const BRACKET_CLOSE = 0x5d;
18
+ const utf8 = new TextDecoder('utf-8');
19
+ const ascii = (textArg) => Uint8Array.from(textArg, (characterArg) => characterArg.charCodeAt(0));
20
+ const COMMENT_OPEN = ascii('<!--');
21
+ const CDATA_OPEN = ascii('<![CDATA[');
22
+ const XML_DECLARATION_OPEN = ascii('<?xml');
23
+ const PREDEFINED = new Map([
24
+ ['lt', '<'],
25
+ ['gt', '>'],
26
+ ['amp', '&'],
27
+ ['apos', "'"],
28
+ ['quot', '"'],
29
+ ]);
30
+ function isSpace(byteArg) {
31
+ return byteArg === SPACE || byteArg === TAB || byteArg === LF || byteArg === CR;
32
+ }
33
+ function isNameStart(byteArg) {
34
+ return ((byteArg >= 0x61 && byteArg <= 0x7a) ||
35
+ (byteArg >= 0x41 && byteArg <= 0x5a) ||
36
+ byteArg === 0x5f ||
37
+ byteArg === 0x3a ||
38
+ byteArg >= 0x80);
39
+ }
40
+ function isNameChar(byteArg) {
41
+ return isNameStart(byteArg) || (byteArg >= 0x30 && byteArg <= 0x39) || byteArg === 0x2e || byteArg === 0x2d;
42
+ }
43
+ function isXmlCharacter(codePointArg) {
44
+ return (codePointArg === 0x09 ||
45
+ codePointArg === 0x0a ||
46
+ codePointArg === 0x0d ||
47
+ (codePointArg >= 0x20 && codePointArg <= 0xd7ff) ||
48
+ (codePointArg >= 0xe000 && codePointArg <= 0xfffd) ||
49
+ (codePointArg >= 0x10000 && codePointArg <= 0x10ffff));
50
+ }
51
+ /** Scans one document; see the module comment. */
52
+ export function scanXmlDocument(documentArg, optionsArg) {
53
+ return new XmlScanner(documentArg, optionsArg).scan();
54
+ }
55
+ class XmlScanner {
56
+ options;
57
+ doc;
58
+ buffer;
59
+ limits;
60
+ constructor(documentArg, options) {
61
+ this.options = options;
62
+ this.doc = documentArg;
63
+ this.buffer = Buffer.from(documentArg.buffer, documentArg.byteOffset, documentArg.byteLength);
64
+ this.limits = options.limits;
65
+ }
66
+ scan() {
67
+ const doc = this.doc;
68
+ this.checkCharacters();
69
+ let pos = 0;
70
+ if (doc[0] === 0xef && doc[1] === 0xbb && doc[2] === 0xbf) {
71
+ pos = 3;
72
+ }
73
+ if (this.startsWith(pos, XML_DECLARATION_OPEN) && (isSpace(doc[pos + 5]) || doc[pos + 5] === QUESTION)) {
74
+ pos = this.xmlDeclaration(pos);
75
+ }
76
+ pos = this.misc(pos);
77
+ if (pos >= doc.length || doc[pos] !== LT || !isNameStart(doc[pos + 1])) {
78
+ throw this.malformed('the document has no root element', pos);
79
+ }
80
+ const rootStart = pos;
81
+ const root = this.startTag(pos);
82
+ if (root.name !== this.options.rootName) {
83
+ throw this.malformed(`the root element is <${root.name}>, expected <${this.options.rootName}>`, pos);
84
+ }
85
+ let rootEndStart = root.end;
86
+ let rootEnd = root.end;
87
+ if (!root.selfClosing) {
88
+ pos = root.end;
89
+ let units = 0;
90
+ for (;;) {
91
+ while (pos < doc.length && isSpace(doc[pos])) {
92
+ pos += 1;
93
+ }
94
+ if (pos >= doc.length) {
95
+ throw this.malformed(`the <${root.name}> element is not closed`, rootStart);
96
+ }
97
+ if (doc[pos] !== LT) {
98
+ throw this.malformed(`character data between the units of <${root.name}>`, pos);
99
+ }
100
+ if (doc[pos + 1] === SLASH) {
101
+ rootEndStart = pos;
102
+ rootEnd = this.endTag(pos, { name: root.name, nameStart: root.nameStart, nameEnd: root.nameEnd, text: null });
103
+ break;
104
+ }
105
+ if (!isNameStart(doc[pos + 1])) {
106
+ throw this.malformed(`markup other than an element between the units of <${root.name}>`, pos);
107
+ }
108
+ const tag = this.startTag(pos);
109
+ units += 1;
110
+ if (units > this.limits.maxEntries) {
111
+ throw limitExceeded('maxEntries', this.limits.maxEntries, `<${root.name}> unit count`);
112
+ }
113
+ if (tag.name === this.options.unitName) {
114
+ const handler = this.options.createUnit(pos);
115
+ const end = this.element(pos, tag, handler);
116
+ this.options.unit(handler, pos, end);
117
+ pos = end;
118
+ }
119
+ else if (this.options.keepOtherChildren) {
120
+ const end = this.element(pos, tag, null);
121
+ this.options.other(tag.name, pos, end);
122
+ pos = end;
123
+ }
124
+ else {
125
+ throw this.malformed(`<${root.name}> holds a <${tag.name}> element, expected <${this.options.unitName}>`, pos);
126
+ }
127
+ }
128
+ }
129
+ pos = this.misc(rootEnd);
130
+ if (pos < doc.length) {
131
+ throw this.malformed('content after the root element', pos);
132
+ }
133
+ return { rootStart, rootStartEnd: root.end, rootAttributes: root.attributes, rootEndStart, rootEnd };
134
+ }
135
+ /** Strict UTF-8 holding only XML characters (XML 1.0 `Char`). */
136
+ checkCharacters() {
137
+ const doc = this.doc;
138
+ const length = doc.length;
139
+ let i = 0;
140
+ while (i < length) {
141
+ const b0 = doc[i];
142
+ if (b0 < 0x80) {
143
+ if (b0 < 0x20 && b0 !== TAB && b0 !== LF && b0 !== CR) {
144
+ throw this.malformed('the document holds a control character that is not an XML character', i);
145
+ }
146
+ i += 1;
147
+ continue;
148
+ }
149
+ let need;
150
+ let codePoint;
151
+ let low = 0x80;
152
+ let high = 0xbf;
153
+ if (b0 >= 0xc2 && b0 <= 0xdf) {
154
+ need = 1;
155
+ codePoint = b0 & 0x1f;
156
+ }
157
+ else if (b0 >= 0xe0 && b0 <= 0xef) {
158
+ need = 2;
159
+ codePoint = b0 & 0x0f;
160
+ if (b0 === 0xe0) {
161
+ low = 0xa0;
162
+ }
163
+ else if (b0 === 0xed) {
164
+ high = 0x9f;
165
+ }
166
+ }
167
+ else if (b0 >= 0xf0 && b0 <= 0xf4) {
168
+ need = 3;
169
+ codePoint = b0 & 0x07;
170
+ if (b0 === 0xf0) {
171
+ low = 0x90;
172
+ }
173
+ else if (b0 === 0xf4) {
174
+ high = 0x8f;
175
+ }
176
+ }
177
+ else {
178
+ throw this.malformed('the document is not valid UTF-8', i);
179
+ }
180
+ if (i + need >= length) {
181
+ throw this.malformed('the document is not valid UTF-8', i);
182
+ }
183
+ for (let k = 1; k <= need; k++) {
184
+ const b = doc[i + k];
185
+ if (b < (k === 1 ? low : 0x80) || b > (k === 1 ? high : 0xbf)) {
186
+ throw this.malformed('the document is not valid UTF-8', i);
187
+ }
188
+ codePoint = (codePoint << 6) | (b & 0x3f);
189
+ }
190
+ if (!isXmlCharacter(codePoint)) {
191
+ throw this.malformed('the document holds a code point that is not an XML character', i);
192
+ }
193
+ i += need + 1;
194
+ }
195
+ }
196
+ /** `<?xml version="1.x" [encoding="UTF-8"] [standalone="yes|no"] ?>`; returns the offset after it. */
197
+ xmlDeclaration(startArg) {
198
+ const doc = this.doc;
199
+ let pos = startArg + XML_DECLARATION_OPEN.length;
200
+ const pseudo = [];
201
+ for (;;) {
202
+ const before = pos;
203
+ while (pos < doc.length && isSpace(doc[pos])) {
204
+ pos += 1;
205
+ }
206
+ if (doc[pos] === QUESTION && doc[pos + 1] === GT) {
207
+ pos += 2;
208
+ break;
209
+ }
210
+ if (pos === before || !isNameStart(doc[pos])) {
211
+ throw this.malformed('a malformed XML declaration', startArg);
212
+ }
213
+ const nameStart = pos;
214
+ while (pos < doc.length && isNameChar(doc[pos])) {
215
+ pos += 1;
216
+ }
217
+ const name = this.decode(nameStart, pos);
218
+ pos = this.skipSpace(pos);
219
+ if (doc[pos] !== EQUALS) {
220
+ throw this.malformed('a malformed XML declaration', startArg);
221
+ }
222
+ pos = this.skipSpace(pos + 1);
223
+ const quote = doc[pos];
224
+ if (quote !== QUOTE && quote !== APOSTROPHE) {
225
+ throw this.malformed('a malformed XML declaration', startArg);
226
+ }
227
+ const valueEnd = doc.indexOf(quote, pos + 1);
228
+ if (valueEnd < 0) {
229
+ throw this.malformed('a malformed XML declaration', startArg);
230
+ }
231
+ pseudo.push([name, this.decode(pos + 1, valueEnd)]);
232
+ pos = valueEnd + 1;
233
+ if (pos - startArg > this.limits.maxHeaderBytes) {
234
+ throw limitExceeded('maxHeaderBytes', this.limits.maxHeaderBytes, 'XML declaration');
235
+ }
236
+ }
237
+ const names = pseudo.map(([name]) => name);
238
+ const expected = ['version', 'encoding', 'standalone'].filter((name) => names.includes(name));
239
+ if (names.length === 0 || names[0] !== 'version' || names.join() !== expected.join()) {
240
+ throw this.malformed('a malformed XML declaration', startArg);
241
+ }
242
+ for (const [name, value] of pseudo) {
243
+ if (name === 'version' && !/^1\.[0-9]+$/.test(value)) {
244
+ throw this.malformed('a malformed XML declaration version', startArg);
245
+ }
246
+ if (name === 'encoding' && value.toLowerCase() !== 'utf-8') {
247
+ throw this.malformed(`the document declares the encoding ${JSON.stringify(value)}, not UTF-8`, startArg);
248
+ }
249
+ if (name === 'standalone' && value !== 'yes' && value !== 'no') {
250
+ throw this.malformed('a malformed XML declaration standalone value', startArg);
251
+ }
252
+ }
253
+ return pos;
254
+ }
255
+ /** Whitespace, comments and processing instructions (prolog and trailer); returns the first other offset. */
256
+ misc(startArg) {
257
+ const doc = this.doc;
258
+ let pos = startArg;
259
+ for (;;) {
260
+ while (pos < doc.length && isSpace(doc[pos])) {
261
+ pos += 1;
262
+ }
263
+ if (pos >= doc.length || doc[pos] !== LT) {
264
+ return pos;
265
+ }
266
+ if (doc[pos + 1] === BANG) {
267
+ if (!this.startsWith(pos, COMMENT_OPEN)) {
268
+ throw this.malformed('a declaration (<!DOCTYPE or another <!) outside the root element', pos);
269
+ }
270
+ pos = this.comment(pos);
271
+ }
272
+ else if (doc[pos + 1] === QUESTION) {
273
+ pos = this.processingInstruction(pos);
274
+ }
275
+ else {
276
+ return pos;
277
+ }
278
+ }
279
+ }
280
+ /** `<!-- ... -->` without `--` inside; returns the offset after it. */
281
+ comment(startArg) {
282
+ const close = this.buffer.indexOf('--', startArg + COMMENT_OPEN.length, 'latin1');
283
+ if (close < 0) {
284
+ throw this.malformed('a comment is not closed', startArg);
285
+ }
286
+ if (this.doc[close + 2] !== GT) {
287
+ throw this.malformed('a comment holds "--"', close);
288
+ }
289
+ return close + 3;
290
+ }
291
+ /** `<?target ...?>` with a target other than `xml`; returns the offset after it. */
292
+ processingInstruction(startArg) {
293
+ const doc = this.doc;
294
+ let pos = startArg + 2;
295
+ if (!isNameStart(doc[pos])) {
296
+ throw this.malformed('a processing instruction without a target', startArg);
297
+ }
298
+ while (pos < doc.length && isNameChar(doc[pos])) {
299
+ pos += 1;
300
+ }
301
+ if (this.decode(startArg + 2, pos).toLowerCase() === 'xml') {
302
+ throw this.malformed('an XML declaration that is not at the start of the document', startArg);
303
+ }
304
+ if (!(doc[pos] === QUESTION && doc[pos + 1] === GT) && !isSpace(doc[pos])) {
305
+ throw this.malformed('a malformed processing instruction target', startArg);
306
+ }
307
+ const close = this.buffer.indexOf('?>', pos, 'latin1');
308
+ if (close < 0) {
309
+ throw this.malformed('a processing instruction is not closed', startArg);
310
+ }
311
+ return close + 2;
312
+ }
313
+ /** `<name attr="value" ...>` or `<name .../>`. */
314
+ startTag(startArg) {
315
+ const doc = this.doc;
316
+ const limit = startArg + this.limits.maxHeaderBytes;
317
+ let pos = startArg + 1;
318
+ const nameStart = pos;
319
+ while (pos < doc.length && isNameChar(doc[pos])) {
320
+ pos += 1;
321
+ }
322
+ const nameEnd = pos;
323
+ if (pos > limit) {
324
+ throw limitExceeded('maxHeaderBytes', this.limits.maxHeaderBytes, 'start tag');
325
+ }
326
+ const name = this.decode(nameStart, nameEnd);
327
+ const attributes = [];
328
+ const seen = new Set();
329
+ for (;;) {
330
+ if (pos > limit) {
331
+ throw limitExceeded('maxHeaderBytes', this.limits.maxHeaderBytes, `<${name}> start tag`);
332
+ }
333
+ const afterName = pos;
334
+ pos = this.skipSpace(pos);
335
+ if (pos >= doc.length) {
336
+ throw this.malformed(`the <${name}> start tag is not closed`, startArg);
337
+ }
338
+ if (doc[pos] === GT) {
339
+ return { name, nameStart, nameEnd, attributes, end: pos + 1, selfClosing: false };
340
+ }
341
+ if (doc[pos] === SLASH && doc[pos + 1] === GT) {
342
+ return { name, nameStart, nameEnd, attributes, end: pos + 2, selfClosing: true };
343
+ }
344
+ if (pos === afterName || !isNameStart(doc[pos])) {
345
+ throw this.malformed(`a malformed <${name}> start tag`, pos);
346
+ }
347
+ const attributeStart = pos;
348
+ while (pos < doc.length && isNameChar(doc[pos])) {
349
+ pos += 1;
350
+ }
351
+ if (pos > limit) {
352
+ throw limitExceeded('maxHeaderBytes', this.limits.maxHeaderBytes, `<${name}> start tag`);
353
+ }
354
+ const attributeName = this.decode(attributeStart, pos);
355
+ if (seen.has(attributeName)) {
356
+ throw this.malformed(`the <${name}> start tag repeats the attribute ${attributeName}`, attributeStart);
357
+ }
358
+ seen.add(attributeName);
359
+ pos = this.skipSpace(pos);
360
+ if (doc[pos] !== EQUALS) {
361
+ throw this.malformed(`the attribute ${attributeName} has no value`, attributeStart);
362
+ }
363
+ pos = this.skipSpace(pos + 1);
364
+ const quote = doc[pos];
365
+ if (quote !== QUOTE && quote !== APOSTROPHE) {
366
+ throw this.malformed(`the attribute ${attributeName} value is not quoted`, pos);
367
+ }
368
+ const valueEnd = doc.indexOf(quote, pos + 1);
369
+ if (valueEnd < 0 || valueEnd > limit) {
370
+ if (valueEnd > limit) {
371
+ throw limitExceeded('maxHeaderBytes', this.limits.maxHeaderBytes, `<${name}> start tag`);
372
+ }
373
+ throw this.malformed(`the attribute ${attributeName} value is not closed`, pos);
374
+ }
375
+ attributes.push({ name: attributeName, value: this.characterData(pos + 1, valueEnd, true, true) });
376
+ pos = valueEnd + 1;
377
+ }
378
+ }
379
+ /** `</name S?>` matching `openArg`; returns the offset after it. */
380
+ endTag(startArg, openArg) {
381
+ const doc = this.doc;
382
+ let pos = startArg + 2;
383
+ const nameStart = pos;
384
+ while (pos < doc.length && isNameChar(doc[pos])) {
385
+ pos += 1;
386
+ }
387
+ const length = openArg.nameEnd - openArg.nameStart;
388
+ if (pos - nameStart !== length || this.buffer.compare(this.buffer, openArg.nameStart, openArg.nameEnd, nameStart, pos) !== 0) {
389
+ throw this.malformed(`an end tag does not match <${openArg.name}>`, startArg);
390
+ }
391
+ pos = this.skipSpace(pos);
392
+ if (doc[pos] !== GT) {
393
+ throw this.malformed(`a malformed </${openArg.name}> end tag`, startArg);
394
+ }
395
+ return pos + 1;
396
+ }
397
+ /** The content of an element through its end tag; returns the offset after the end tag. */
398
+ element(startArg, tagArg, handlerArg) {
399
+ const doc = this.doc;
400
+ const maxEnd = startArg + this.limits.maxMetadataBytes;
401
+ const capture = handlerArg !== null && handlerArg.start(0, tagArg.name, tagArg.attributes);
402
+ if (tagArg.selfClosing) {
403
+ handlerArg?.end(0, tagArg.name, capture ? '' : null);
404
+ return tagArg.end;
405
+ }
406
+ const stack = [{ name: tagArg.name, nameStart: tagArg.nameStart, nameEnd: tagArg.nameEnd, text: capture ? [] : null }];
407
+ let pos = tagArg.end;
408
+ while (stack.length > 0) {
409
+ if (pos > maxEnd) {
410
+ throw limitExceeded('maxMetadataBytes', this.limits.maxMetadataBytes, `<${tagArg.name}> element`);
411
+ }
412
+ if (pos >= doc.length) {
413
+ throw this.malformed(`the <${stack[stack.length - 1].name}> element is not closed`, startArg);
414
+ }
415
+ const top = stack[stack.length - 1];
416
+ if (doc[pos] !== LT) {
417
+ let textEnd = doc.indexOf(LT, pos);
418
+ if (textEnd < 0) {
419
+ textEnd = doc.length;
420
+ }
421
+ const text = this.characterData(pos, textEnd, top.text !== null, false);
422
+ if (text !== null) {
423
+ top.text.push(text);
424
+ }
425
+ pos = textEnd;
426
+ continue;
427
+ }
428
+ const next = doc[pos + 1];
429
+ if (next === SLASH) {
430
+ const end = this.endTag(pos, top);
431
+ stack.pop();
432
+ handlerArg?.end(stack.length, top.name, top.text === null ? null : top.text.join(''));
433
+ pos = end;
434
+ }
435
+ else if (next === BANG) {
436
+ if (this.startsWith(pos, COMMENT_OPEN)) {
437
+ pos = this.comment(pos);
438
+ }
439
+ else if (this.startsWith(pos, CDATA_OPEN)) {
440
+ const close = this.buffer.indexOf(']]>', pos + CDATA_OPEN.length, 'latin1');
441
+ if (close < 0) {
442
+ throw this.malformed('a CDATA section is not closed', pos);
443
+ }
444
+ if (top.text !== null) {
445
+ top.text.push(normalizeLineEnds(this.decode(pos + CDATA_OPEN.length, close)));
446
+ }
447
+ pos = close + 3;
448
+ }
449
+ else {
450
+ throw this.malformed('a declaration inside an element', pos);
451
+ }
452
+ }
453
+ else if (next === QUESTION) {
454
+ pos = this.processingInstruction(pos);
455
+ }
456
+ else if (isNameStart(next)) {
457
+ // the root, the unit's open elements and the new one
458
+ if (stack.length + 2 > this.limits.maxEntries) {
459
+ throw limitExceeded('maxEntries', this.limits.maxEntries, 'open XML elements');
460
+ }
461
+ const tag = this.startTag(pos);
462
+ const depth = stack.length;
463
+ const captureChild = handlerArg !== null && handlerArg.start(depth, tag.name, tag.attributes);
464
+ if (tag.selfClosing) {
465
+ handlerArg?.end(depth, tag.name, captureChild ? '' : null);
466
+ }
467
+ else {
468
+ stack.push({ name: tag.name, nameStart: tag.nameStart, nameEnd: tag.nameEnd, text: captureChild ? [] : null });
469
+ }
470
+ pos = tag.end;
471
+ }
472
+ else {
473
+ throw this.malformed('a "<" that starts no markup', pos);
474
+ }
475
+ }
476
+ if (pos > maxEnd) {
477
+ throw limitExceeded('maxMetadataBytes', this.limits.maxMetadataBytes, `<${tagArg.name}> element`);
478
+ }
479
+ return pos;
480
+ }
481
+ /**
482
+ * Checks character data or an attribute value in `[startArg, endArg)` (no
483
+ * `]]>` in text, no `<` in values, only the accepted references) and, when
484
+ * `decodeArg`, returns its decoded value; otherwise null.
485
+ */
486
+ characterData(startArg, endArg, decodeArg, attributeArg) {
487
+ const doc = this.doc;
488
+ const parts = [];
489
+ let runStart = startArg;
490
+ for (let i = startArg; i < endArg; i++) {
491
+ const b = doc[i];
492
+ if (b === LT) {
493
+ throw this.malformed('an attribute value holds "<"', i);
494
+ }
495
+ if (b === GT && !attributeArg && i - 2 >= startArg && doc[i - 1] === BRACKET_CLOSE && doc[i - 2] === BRACKET_CLOSE) {
496
+ throw this.malformed('character data holds "]]>"', i - 2);
497
+ }
498
+ if (b !== AMP) {
499
+ continue;
500
+ }
501
+ const semicolon = doc.indexOf(SEMICOLON, i + 1);
502
+ if (semicolon < 0 || semicolon >= endArg || semicolon - i > 12) {
503
+ throw this.malformed('a reference is not terminated', i);
504
+ }
505
+ const replacement = this.reference(i, semicolon);
506
+ if (decodeArg) {
507
+ parts.push(this.literal(runStart, i, attributeArg), replacement);
508
+ }
509
+ i = semicolon;
510
+ runStart = semicolon + 1;
511
+ }
512
+ if (!decodeArg) {
513
+ return null;
514
+ }
515
+ parts.push(this.literal(runStart, endArg, attributeArg));
516
+ return parts.join('');
517
+ }
518
+ /** The literal run `[startArg, endArg)`: line ends normalized, and in attribute values whitespace to spaces. */
519
+ literal(startArg, endArg, attributeArg) {
520
+ if (startArg === endArg) {
521
+ return '';
522
+ }
523
+ const text = normalizeLineEnds(this.decode(startArg, endArg));
524
+ return attributeArg ? text.replace(/[\t\n]/g, ' ') : text;
525
+ }
526
+ /** The character a reference `&...;` stands for. */
527
+ reference(startArg, semicolonArg) {
528
+ const doc = this.doc;
529
+ if (doc[startArg + 1] === HASH) {
530
+ const hex = doc[startArg + 2] === 0x78;
531
+ const digits = this.decode(startArg + (hex ? 3 : 2), semicolonArg);
532
+ if (!(hex ? /^[0-9a-fA-F]+$/ : /^[0-9]+$/).test(digits)) {
533
+ throw this.malformed('a malformed character reference', startArg);
534
+ }
535
+ const codePoint = Number.parseInt(digits, hex ? 16 : 10);
536
+ if (!isXmlCharacter(codePoint)) {
537
+ throw this.malformed('a character reference to a character XML does not allow', startArg);
538
+ }
539
+ return String.fromCodePoint(codePoint);
540
+ }
541
+ const replacement = PREDEFINED.get(this.decode(startArg + 1, semicolonArg));
542
+ if (replacement === undefined) {
543
+ throw this.malformed('a reference to an undeclared entity', startArg);
544
+ }
545
+ return replacement;
546
+ }
547
+ skipSpace(posArg) {
548
+ let pos = posArg;
549
+ while (pos < this.doc.length && isSpace(this.doc[pos])) {
550
+ pos += 1;
551
+ }
552
+ return pos;
553
+ }
554
+ startsWith(posArg, bytesArg) {
555
+ if (posArg + bytesArg.length > this.doc.length) {
556
+ return false;
557
+ }
558
+ for (let i = 0; i < bytesArg.length; i++) {
559
+ if (this.doc[posArg + i] !== bytesArg[i]) {
560
+ return false;
561
+ }
562
+ }
563
+ return true;
564
+ }
565
+ decode(startArg, endArg) {
566
+ return utf8.decode(this.doc.subarray(startArg, endArg));
567
+ }
568
+ malformed(messageArg, offsetArg) {
569
+ return new LinuxRepoError('malformed-index', messageArg, { field: `<${this.options.rootName}> document`, value: offsetArg });
570
+ }
571
+ }
572
+ /** XML 1.0 section 2.11: CRLF and lone CR become LF. */
573
+ function normalizeLineEnds(textArg) {
574
+ return textArg.includes('\r') ? textArg.replace(/\r\n?/g, '\n') : textArg;
575
+ }
576
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieG1scmVhZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvcnBtL3htbHJlYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBMkVwRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDaEIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQztBQUNqQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUM7QUFDbkIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ2xCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQztBQUN0QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUM7QUFDcEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQ25CLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQztBQUN4QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUM7QUFDdkIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ2xCLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQztBQUNoQixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDO0FBQ2pCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQztBQUNuQixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUM7QUFFM0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDdEMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxPQUFlLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUcsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFD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