@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,107 @@
1
+ import { type ILinuxPackageLimits } from '../shared/limits.js';
2
+ import type { TLinuxCompression } from '../shared/types.js';
3
+ /** One stanza of a `Packages` index. */
4
+ export interface IDebianPackagesStanza {
5
+ /** The stanza's lines, first line through the last LF, without a separating empty line (a view into `decoded`). */
6
+ readonly bytes: Uint8Array;
7
+ /** The stanza's offset in `decoded`. */
8
+ readonly offset: number;
9
+ /** The first-line value of the stanza's last `Filename` field: the unit key. */
10
+ readonly filename: string;
11
+ /** The first-line values of the last `Package`, `Version` and `Architecture` fields; `''` when absent. */
12
+ readonly package: string;
13
+ readonly version: string;
14
+ readonly architecture: string;
15
+ }
16
+ /** A `Packages` index read into its stanzas. */
17
+ export interface IDebianPackagesIndex {
18
+ /** The decompressed document (a copy for `'none'`); every `offset` indexes into it. */
19
+ readonly decoded: Uint8Array;
20
+ /** Every stanza in document order, duplicates included. */
21
+ readonly stanzas: readonly IDebianPackagesStanza[];
22
+ }
23
+ /** One field of a `Release` file. */
24
+ export interface IDebianReleaseField {
25
+ /** The field name as written. */
26
+ readonly name: string;
27
+ /**
28
+ * The first-line value without surrounding spaces and tabs, then `"\n"`
29
+ * plus each continuation line verbatim.
30
+ */
31
+ readonly value: string;
32
+ /** The field's line(s), each with its LF. */
33
+ readonly bytes: Uint8Array;
34
+ }
35
+ /** One file of a `Release` checksum list. */
36
+ export interface IDebianReleaseFile {
37
+ readonly path: string;
38
+ readonly size: number;
39
+ /** As written: hex of the algorithm's length. */
40
+ readonly digest: string;
41
+ }
42
+ /** A `Release` file read into its fields and checksum lists. */
43
+ export interface IDebianRelease {
44
+ /** Every field in order, the checksum fields included. */
45
+ readonly fields: readonly IDebianReleaseField[];
46
+ /** The `MD5Sum`, `SHA1`, `SHA256` and `SHA512` lists; `[]` when the field is absent. */
47
+ readonly files: {
48
+ readonly md5Sum: readonly IDebianReleaseFile[];
49
+ readonly sha1: readonly IDebianReleaseFile[];
50
+ readonly sha256: readonly IDebianReleaseFile[];
51
+ readonly sha512: readonly IDebianReleaseFile[];
52
+ };
53
+ }
54
+ /**
55
+ * Reads a `Packages` index (`dists/<d>/<c>/binary-<a>/Packages`, `.gz`,
56
+ * `.xz`; the caller names `compression` from the file name) into its stanzas.
57
+ *
58
+ * - Lines end in LF, the last one too; a line longer than `maxHeaderBytes`
59
+ * is `limit-exceeded`.
60
+ * - A stanza is a maximal run of non-empty lines; one or more empty lines
61
+ * separate stanzas, and leading or trailing empty lines are accepted.
62
+ * - A line holding only spaces or tabs is `malformed-index` (Gitea and the
63
+ * codec cannot write one; Debian Policy and the strip rule would read it
64
+ * differently). A stanza starting with a continuation line is
65
+ * `malformed-index`. A line without `:` is accepted (Gitea can write one).
66
+ * - Field names are the Go `TrimSpace` of the bytes before the first `:`,
67
+ * matched ASCII case-insensitively; values are the Go `TrimSpace` of the
68
+ * rest of the field's first line, decoded as Go does (U+FFFD for invalid
69
+ * UTF-8), from the field's last occurrence.
70
+ * - A stanza without `Filename` is `missing-field` (`Filename`, `value` the
71
+ * stanza offset).
72
+ *
73
+ * Bounds: the decoded document by `maxIndexBytes`, stanzas by `maxEntries`,
74
+ * one stanza by `maxMetadataBytes`. Every stanza is returned in document
75
+ * order, duplicates included; `bytes` are views into `decoded`.
76
+ */
77
+ export declare function readDebianPackagesIndex(inputArg: {
78
+ bytes: Uint8Array;
79
+ compression: TLinuxCompression;
80
+ limits?: Partial<ILinuxPackageLimits>;
81
+ }): Promise<IDebianPackagesIndex>;
82
+ /**
83
+ * Reads a `Release` file (the plain `dists/<d>/Release`) into its fields and
84
+ * checksum lists. For an `InRelease`, verify it with `createOpenPgpVerifier`
85
+ * and pass the verified `signedText` here (plus a final LF when it lacks one).
86
+ *
87
+ * - Lines end in LF, the last one too; a line longer than `maxHeaderBytes`
88
+ * is `limit-exceeded`.
89
+ * - Exactly one stanza: an empty line, a line holding only spaces or tabs, a
90
+ * continuation line before the first field, a field line without `:`, a
91
+ * field name that is empty or holds a space or tab, a second checksum field
92
+ * of one algorithm, or an empty document is `malformed-index`.
93
+ * - `MD5Sum`, `SHA1`, `SHA256` and `SHA512` (ASCII case-insensitive) hold an
94
+ * empty first-line value and continuation lines of leading whitespace, then
95
+ * exactly three tokens separated by one or more spaces or tabs: the digest
96
+ * (hex of the algorithm's length), the size (decimal digits within a safe
97
+ * integer) and the path. Anything else is `invalid-field` (`field` the field
98
+ * name as written, `value` the line's offset).
99
+ *
100
+ * Bounds: the document by `maxIndexBytes`, fields and the files per list by
101
+ * `maxEntries`. Field names and values are decoded as Go does (U+FFFD for
102
+ * invalid UTF-8); `bytes` are views into a copy of the input.
103
+ */
104
+ export declare function readDebianRelease(inputArg: {
105
+ bytes: Uint8Array;
106
+ limits?: Partial<ILinuxPackageLimits>;
107
+ }): Promise<IDebianRelease>;
@@ -0,0 +1,274 @@
1
+ import { LinuxRepoError } from '../shared/errors.js';
2
+ import { resolveLinuxPackageLimits } from '../shared/limits.js';
3
+ import { assertLinuxCompression, assertReaderBytes, assertReaderInput, checkUnitBytes, countUnit, isBlankLine, lines, readIndexDocument, } from '../readers/document.js';
4
+ import { decodeGoUtf8, decodeLatin1 } from '../readers/text.js';
5
+ import { fromByteString, goTrimSpace } from './gostring.js';
6
+ const SPACE = 0x20;
7
+ const TAB = 0x09;
8
+ const COLON = 0x3a;
9
+ /** The four checksum fields of a Release, lower-cased, with their list key and hex length. */
10
+ const RELEASE_CHECKSUM_FIELDS = new Map([
11
+ ['md5sum', { key: 'md5Sum', hexLength: 32 }],
12
+ ['sha1', { key: 'sha1', hexLength: 40 }],
13
+ ['sha256', { key: 'sha256', hexLength: 64 }],
14
+ ['sha512', { key: 'sha512', hexLength: 128 }],
15
+ ]);
16
+ /**
17
+ * Reads a `Packages` index (`dists/<d>/<c>/binary-<a>/Packages`, `.gz`,
18
+ * `.xz`; the caller names `compression` from the file name) into its stanzas.
19
+ *
20
+ * - Lines end in LF, the last one too; a line longer than `maxHeaderBytes`
21
+ * is `limit-exceeded`.
22
+ * - A stanza is a maximal run of non-empty lines; one or more empty lines
23
+ * separate stanzas, and leading or trailing empty lines are accepted.
24
+ * - A line holding only spaces or tabs is `malformed-index` (Gitea and the
25
+ * codec cannot write one; Debian Policy and the strip rule would read it
26
+ * differently). A stanza starting with a continuation line is
27
+ * `malformed-index`. A line without `:` is accepted (Gitea can write one).
28
+ * - Field names are the Go `TrimSpace` of the bytes before the first `:`,
29
+ * matched ASCII case-insensitively; values are the Go `TrimSpace` of the
30
+ * rest of the field's first line, decoded as Go does (U+FFFD for invalid
31
+ * UTF-8), from the field's last occurrence.
32
+ * - A stanza without `Filename` is `missing-field` (`Filename`, `value` the
33
+ * stanza offset).
34
+ *
35
+ * Bounds: the decoded document by `maxIndexBytes`, stanzas by `maxEntries`,
36
+ * one stanza by `maxMetadataBytes`. Every stanza is returned in document
37
+ * order, duplicates included; `bytes` are views into `decoded`.
38
+ */
39
+ export async function readDebianPackagesIndex(inputArg) {
40
+ assertReaderInput(inputArg);
41
+ assertReaderBytes(inputArg.bytes);
42
+ assertLinuxCompression(inputArg.compression);
43
+ const limits = resolveLinuxPackageLimits(inputArg.limits);
44
+ const decoded = await readIndexDocument(inputArg.bytes, inputArg.compression, limits);
45
+ const stanzas = [];
46
+ let stanza = null;
47
+ const finish = (endArg) => {
48
+ if (stanza === null) {
49
+ return;
50
+ }
51
+ const current = stanza;
52
+ stanza = null;
53
+ if (current.filename === null) {
54
+ throw new LinuxRepoError('missing-field', 'a Packages stanza has no Filename field', {
55
+ field: 'Filename',
56
+ value: current.start,
57
+ });
58
+ }
59
+ stanzas.push({
60
+ bytes: decoded.subarray(current.start, endArg),
61
+ offset: current.start,
62
+ filename: current.filename,
63
+ package: current.package,
64
+ version: current.version,
65
+ architecture: current.architecture,
66
+ });
67
+ };
68
+ for (const line of lines(decoded, limits.maxHeaderBytes, 'Packages')) {
69
+ if (line.end === line.start) {
70
+ finish(line.start);
71
+ continue;
72
+ }
73
+ if (isBlankLine(decoded, line)) {
74
+ throw new LinuxRepoError('malformed-index', 'a Packages line holds only spaces or tabs', {
75
+ field: 'Packages',
76
+ value: line.start,
77
+ });
78
+ }
79
+ const first = decoded[line.start];
80
+ if (stanza === null) {
81
+ if (first === SPACE || first === TAB) {
82
+ throw new LinuxRepoError('malformed-index', 'a Packages stanza starts with a continuation line', {
83
+ field: 'Packages',
84
+ value: line.start,
85
+ });
86
+ }
87
+ countUnit(stanzas.length + 1, limits, 'Packages stanza');
88
+ stanza = { start: line.start, filename: null, package: '', version: '', architecture: '' };
89
+ }
90
+ checkUnitBytes(line.end + 1 - stanza.start, limits, 'Packages stanza');
91
+ if (first === SPACE || first === TAB) {
92
+ continue;
93
+ }
94
+ readPackagesField(decoded, line, stanza);
95
+ }
96
+ finish(decoded.length);
97
+ return { decoded, stanzas };
98
+ }
99
+ /** Takes the key fields' first-line values; a later occurrence replaces an earlier one. */
100
+ function readPackagesField(bytesArg, lineArg, stanzaArg) {
101
+ const line = bytesArg.subarray(lineArg.start, lineArg.end);
102
+ const colon = line.indexOf(COLON);
103
+ if (colon < 0) {
104
+ return;
105
+ }
106
+ const name = asciiLower(goTrimSpace(decodeLatin1(line.subarray(0, colon))));
107
+ if (name !== 'filename' && name !== 'package' && name !== 'version' && name !== 'architecture') {
108
+ return;
109
+ }
110
+ const value = fromByteString(goTrimSpace(decodeLatin1(line.subarray(colon + 1))));
111
+ if (name === 'filename') {
112
+ stanzaArg.filename = value;
113
+ }
114
+ else if (name === 'package') {
115
+ stanzaArg.package = value;
116
+ }
117
+ else if (name === 'version') {
118
+ stanzaArg.version = value;
119
+ }
120
+ else {
121
+ stanzaArg.architecture = value;
122
+ }
123
+ }
124
+ /**
125
+ * Reads a `Release` file (the plain `dists/<d>/Release`) into its fields and
126
+ * checksum lists. For an `InRelease`, verify it with `createOpenPgpVerifier`
127
+ * and pass the verified `signedText` here (plus a final LF when it lacks one).
128
+ *
129
+ * - Lines end in LF, the last one too; a line longer than `maxHeaderBytes`
130
+ * is `limit-exceeded`.
131
+ * - Exactly one stanza: an empty line, a line holding only spaces or tabs, a
132
+ * continuation line before the first field, a field line without `:`, a
133
+ * field name that is empty or holds a space or tab, a second checksum field
134
+ * of one algorithm, or an empty document is `malformed-index`.
135
+ * - `MD5Sum`, `SHA1`, `SHA256` and `SHA512` (ASCII case-insensitive) hold an
136
+ * empty first-line value and continuation lines of leading whitespace, then
137
+ * exactly three tokens separated by one or more spaces or tabs: the digest
138
+ * (hex of the algorithm's length), the size (decimal digits within a safe
139
+ * integer) and the path. Anything else is `invalid-field` (`field` the field
140
+ * name as written, `value` the line's offset).
141
+ *
142
+ * Bounds: the document by `maxIndexBytes`, fields and the files per list by
143
+ * `maxEntries`. Field names and values are decoded as Go does (U+FFFD for
144
+ * invalid UTF-8); `bytes` are views into a copy of the input.
145
+ */
146
+ export async function readDebianRelease(inputArg) {
147
+ assertReaderInput(inputArg);
148
+ assertReaderBytes(inputArg.bytes);
149
+ const limits = resolveLinuxPackageLimits(inputArg.limits);
150
+ const decoded = await readIndexDocument(inputArg.bytes, 'none', limits);
151
+ const malformed = (messageArg, offsetArg) => new LinuxRepoError('malformed-index', messageArg, { field: 'Release', value: offsetArg });
152
+ const fields = [];
153
+ const files = {
154
+ md5Sum: [],
155
+ sha1: [],
156
+ sha256: [],
157
+ sha512: [],
158
+ };
159
+ const seenChecksumFields = new Set();
160
+ let field = null;
161
+ const finishField = (endArg) => {
162
+ if (field !== null) {
163
+ const value = [field.firstValue, ...field.continuations].join('\n');
164
+ fields.push({ name: field.name, value, bytes: decoded.subarray(field.start, endArg) });
165
+ field = null;
166
+ }
167
+ };
168
+ for (const line of lines(decoded, limits.maxHeaderBytes, 'Release')) {
169
+ if (line.end === line.start) {
170
+ throw malformed('a Release file holds an empty line', line.start);
171
+ }
172
+ if (isBlankLine(decoded, line)) {
173
+ throw malformed('a Release line holds only spaces or tabs', line.start);
174
+ }
175
+ const first = decoded[line.start];
176
+ if (first === SPACE || first === TAB) {
177
+ if (field === null) {
178
+ throw malformed('a Release file starts with a continuation line', line.start);
179
+ }
180
+ const current = field;
181
+ if (current.checksum !== null) {
182
+ const list = files[current.checksum.key];
183
+ countUnit(list.length + 1, limits, `Release ${current.name} file`);
184
+ list.push(readChecksumLine(decoded, line, current.name, current.checksum.hexLength));
185
+ }
186
+ current.continuations.push(decodeGoUtf8(decoded.subarray(line.start, line.end)));
187
+ continue;
188
+ }
189
+ finishField(line.start);
190
+ const colon = decoded.subarray(line.start, line.end).indexOf(COLON);
191
+ if (colon < 0) {
192
+ throw malformed('a Release field line has no ":"', line.start);
193
+ }
194
+ const nameBytes = decoded.subarray(line.start, line.start + colon);
195
+ if (nameBytes.length === 0 || nameBytes.includes(SPACE) || nameBytes.includes(TAB)) {
196
+ throw malformed('a Release field name is empty or holds a space or tab', line.start);
197
+ }
198
+ const name = decodeGoUtf8(nameBytes);
199
+ const lower = asciiLower(decodeLatin1(nameBytes));
200
+ const checksum = RELEASE_CHECKSUM_FIELDS.get(lower) ?? null;
201
+ const firstValue = decodeGoUtf8(trimSpaceTab(decoded.subarray(line.start + colon + 1, line.end)));
202
+ if (checksum !== null) {
203
+ if (seenChecksumFields.has(lower)) {
204
+ throw malformed(`a Release file holds a second ${name} field`, line.start);
205
+ }
206
+ seenChecksumFields.add(lower);
207
+ if (firstValue !== '') {
208
+ throw new LinuxRepoError('invalid-field', `the ${name} field has a value on its first line`, {
209
+ field: name,
210
+ value: line.start,
211
+ });
212
+ }
213
+ }
214
+ countUnit(fields.length + 1, limits, 'Release field');
215
+ field = { name, start: line.start, firstValue, continuations: [], checksum };
216
+ }
217
+ finishField(decoded.length);
218
+ if (fields.length === 0) {
219
+ throw malformed('a Release file holds no field', 0);
220
+ }
221
+ return { fields, files };
222
+ }
223
+ /** One checksum line: leading whitespace, then digest, size and path separated by spaces or tabs. */
224
+ function readChecksumLine(bytesArg, lineArg, fieldArg, hexLengthArg) {
225
+ const tokens = [];
226
+ let i = lineArg.start;
227
+ while (i < lineArg.end) {
228
+ while (i < lineArg.end && (bytesArg[i] === SPACE || bytesArg[i] === TAB)) {
229
+ i += 1;
230
+ }
231
+ if (i === lineArg.end) {
232
+ break;
233
+ }
234
+ const start = i;
235
+ while (i < lineArg.end && bytesArg[i] !== SPACE && bytesArg[i] !== TAB) {
236
+ i += 1;
237
+ }
238
+ tokens.push([start, i]);
239
+ if (tokens.length > 3) {
240
+ break;
241
+ }
242
+ }
243
+ const last = bytesArg[lineArg.end - 1];
244
+ const invalid = (whatArg) => new LinuxRepoError('invalid-field', `a ${fieldArg} line ${whatArg}`, { field: fieldArg, value: lineArg.start });
245
+ if (tokens.length !== 3 || last === SPACE || last === TAB) {
246
+ throw invalid('is not "<digest> <size> <path>"');
247
+ }
248
+ const digest = decodeLatin1(bytesArg.subarray(tokens[0][0], tokens[0][1]));
249
+ if (digest.length !== hexLengthArg || !/^[0-9a-fA-F]+$/.test(digest)) {
250
+ throw invalid(`has a digest that is not ${hexLengthArg} hex digits`);
251
+ }
252
+ const sizeText = decodeLatin1(bytesArg.subarray(tokens[1][0], tokens[1][1]));
253
+ const size = /^[0-9]+$/.test(sizeText) ? Number(sizeText) : Number.NaN;
254
+ if (!Number.isSafeInteger(size)) {
255
+ throw invalid('has a size that is not decimal digits within a safe integer');
256
+ }
257
+ return { path: decodeGoUtf8(bytesArg.subarray(tokens[2][0], tokens[2][1])), size, digest };
258
+ }
259
+ function trimSpaceTab(bytesArg) {
260
+ let start = 0;
261
+ let end = bytesArg.length;
262
+ while (start < end && (bytesArg[start] === SPACE || bytesArg[start] === TAB)) {
263
+ start += 1;
264
+ }
265
+ while (end > start && (bytesArg[end - 1] === SPACE || bytesArg[end - 1] === TAB)) {
266
+ end -= 1;
267
+ }
268
+ return bytesArg.subarray(start, end);
269
+ }
270
+ /** ASCII-only lowercasing of a byte string. */
271
+ function asciiLower(valueArg) {
272
+ return valueArg.replace(/[A-Z]+/g, (matchArg) => matchArg.toLowerCase());
273
+ }
274
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXhyZWFkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kZWJpYW4vaW5kZXhyZWFkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSx5QkFBeUIsRUFBNEIsTUFBTSxxQkFBcUIsQ0FBQztBQUUxRixPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLGlCQUFpQixFQUNqQixpQkFBaUIsRUFDakIsY0FBYyxFQUNkLFNBQVMsRUFDVCxXQUFXLEVBQ1gsS0FBSyxFQUNMLGlCQUFpQixHQUVsQixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDaEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUEwRDVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQztBQUNuQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUM7QUFDakIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBRW5CLDhGQUE4RjtBQUM5RixNQUFNLHVCQUF1QixHQUFtRixJQUFJLEdBQUcsQ0FBQztJQUN0SCxDQUFDLFFBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQzVDLENBQUMsTUFBTSxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDeEMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUM1QyxDQUFDLFFBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ3JDLENBQUMsQ0FBQztBQUVaOzs7Ozs7Ozs7Ozs7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
@@ -111,4 +111,4 @@ async function readControl(inputArg, limitsArg) {
111
111
  }
112
112
  }
113
113
  }
114
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvZGViaWFuL3JlYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSx5QkFBeUIsRUFBNEIsTUFBTSxxQkFBcUIsQ0FBQztBQUMxRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFakQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsdUJBQXVCLEVBQTBCLE1BQU0sMEJBQTBCLENBQUM7QUFDM0YsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxzQkFBc0IsRUFBdUIsTUFBTSxjQUFjLENBQUM7QUFFM0UsTUFBTSxXQUFXLEdBQUcsYUFBYSxDQUFDO0FBRWxDLDRFQUE0RTtBQUM1RSxNQUFNLG9CQUFvQixHQUFzQztJQUM5RCxFQUFFLEVBQUUsTUFBTTtJQUNWLEtBQUssRUFBRSxNQUFNO0lBQ2IsS0FBSyxFQUFFLElBQUk7SUFDWCxNQUFNLEVBQUUsTUFBTTtDQUNmLENBQUM7QUFFRjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQkc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGlCQUFpQixDQUNyQyxNQUFpQyxFQUNqQyxNQUFxQztJQUVyQyxNQUFNLFFBQVEsR0FBRyx5QkFBeUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNuRCxNQUFNLEtBQUssR0FBRyxJQUFJLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUM7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
114
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvZGViaWFuL3JlYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSx5QkFBeUIsRUFBNEIsTUFBTSxxQkFBcUIsQ0FBQztBQUMxRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFakQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUVuRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDaEUsT0FBTyxFQUFFLHNCQUFzQixFQUF1QixNQUFNLGNBQWMsQ0FBQztBQUUzRSxNQUFNLFdBQVcsR0FBRyxhQUFhLENBQUM7QUFFbEMsNEVBQTRFO0FBQzVFLE1BQU0sb0JBQW9CLEdBQXNDO0lBQzlELEVBQUUsRUFBRSxNQUFNO0lBQ1YsS0FBSyxFQUFFLE1BQU07SUFDYixLQUFLLEVBQUUsSUFBSTtJQUNYLE1BQU0sRUFBRSxNQUFNO0NBQ2YsQ0FBQztBQUVGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsaUJBQWlCLENBQ3JDLE1BQWlDLEVBQ2pDLE1BQXFDO0lBRXJDLE1BQU0sUUFBUSxHQUFHLHlCQUF5QixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25ELE1BQU0sS0FBSyxHQUFHLElBQUksaUJBQWlCLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQztJ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
@@ -20,3 +20,21 @@ export declare function isDebianReleaseValue(valueArg: string): boolean;
20
20
  * returns a record the builder refuses for its file name.
21
21
  */
22
22
  export declare function hasPoolFileNameRefusedCharacter(textArg: string): boolean;
23
+ /**
24
+ * The stanza without its index-owned fields: `Filename`, `Size`, `MD5sum`,
25
+ * `SHA1`, `SHA256` and `SHA512`, matched ASCII case-insensitively on the Go
26
+ * `TrimSpace` of the bytes before the line's first `:`, each with its
27
+ * continuation lines. The one line walk `renderDebianPackagesStanza` applies
28
+ * to a record's control text, on bytes:
29
+ * - a line starting with a space or tab follows the dropping state of its field;
30
+ * - otherwise the field is dropped exactly when its name is one of the six;
31
+ * - a line without a `:` is kept and ends dropping.
32
+ *
33
+ * Lines end at LF and keep it; a final line without LF is a line too. The
34
+ * result is a new array, the kept lines in order. Applied to a stanza that
35
+ * `readDebianPackagesIndex` returns, from Gitea or from the codec for the same
36
+ * control file, it yields the same bytes: the trimmed control text without
37
+ * the index-owned fields, plus a final LF. A non-`Uint8Array` is
38
+ * `invalid-input`.
39
+ */
40
+ export declare function stripDebianIndexOwnedFields(stanzaArg: Uint8Array): Uint8Array;
@@ -1,4 +1,6 @@
1
- import { hasControlCharacter } from '../shared/validation.js';
1
+ import { decodeLatin1 } from '../readers/text.js';
2
+ import { assertBytes, hasControlCharacter } from '../shared/validation.js';
3
+ import { goTrimSpace } from './gostring.js';
2
4
  /** Gitea's distribution and component rule (`modules/packages/debian/metadata.go:67`, applied at upload). */
3
5
  export const DEBIAN_SYMBOL_PATTERN = /^[a-zA-Z0-9][a-zA-Z0-9.~+_-]*$/;
4
6
  /**
@@ -37,4 +39,81 @@ const POOL_FILE_NAME_REFUSED_PATTERN = /[/#?\s\p{Cc}]/u;
37
39
  export function hasPoolFileNameRefusedCharacter(textArg) {
38
40
  return POOL_FILE_NAME_REFUSED_PATTERN.test(textArg);
39
41
  }
40
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVsZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kZWJpYW4vcnVsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFOUQsNkdBQTZHO0FBQzdHLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLGdDQUFnQyxDQUFDO0FBRXRFOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLFFBQWdCO0lBQzdDLE9BQU8sT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLHFCQUFxQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUM5RSxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsUUFBZ0I7SUFDbkQsT0FBTyxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksUUFBUSxLQUFLLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxJQUFJLFFBQVEsS0FBSyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDM0gsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSw4QkFBOEIsR0FBRyxnQkFBZ0IsQ0FBQztBQUV4RDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSwrQkFBK0IsQ0FBQyxPQUFlO0lBQzdELE9BQU8sOEJBQThCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3RELENBQUMifQ==
42
+ /**
43
+ * The fields a `Packages` stanza writes itself (`renderDebianPackagesStanza`;
44
+ * Gitea `services/packages/debian/repository.go:202-209`): `Filename`,
45
+ * `Size`, `MD5sum`, `SHA1`, `SHA256`, `SHA512`.
46
+ */
47
+ const INDEX_OWNED_FIELDS = new Set(['filename', 'size', 'md5sum', 'sha1', 'sha256', 'sha512']);
48
+ const LF = 0x0a;
49
+ /**
50
+ * Whether the bytes before a line's first `:` name an index-owned field: Go
51
+ * `strings.TrimSpace` of them, matched ASCII case-insensitively. Every other
52
+ * byte is compared as is, so no non-ASCII text matches (for these six names
53
+ * this equals `toLowerCase()` on the decoded name, the renderer's former rule).
54
+ */
55
+ function isIndexOwnedFieldName(nameArg) {
56
+ const name = goTrimSpace(decodeLatin1(nameArg));
57
+ if (name.length < 4 || name.length > 8) {
58
+ return false;
59
+ }
60
+ let lower = '';
61
+ for (let i = 0; i < name.length; i++) {
62
+ const code = name.charCodeAt(i);
63
+ lower += String.fromCharCode(code >= 0x41 && code <= 0x5a ? code + 0x20 : code);
64
+ }
65
+ return INDEX_OWNED_FIELDS.has(lower);
66
+ }
67
+ /**
68
+ * The stanza without its index-owned fields: `Filename`, `Size`, `MD5sum`,
69
+ * `SHA1`, `SHA256` and `SHA512`, matched ASCII case-insensitively on the Go
70
+ * `TrimSpace` of the bytes before the line's first `:`, each with its
71
+ * continuation lines. The one line walk `renderDebianPackagesStanza` applies
72
+ * to a record's control text, on bytes:
73
+ * - a line starting with a space or tab follows the dropping state of its field;
74
+ * - otherwise the field is dropped exactly when its name is one of the six;
75
+ * - a line without a `:` is kept and ends dropping.
76
+ *
77
+ * Lines end at LF and keep it; a final line without LF is a line too. The
78
+ * result is a new array, the kept lines in order. Applied to a stanza that
79
+ * `readDebianPackagesIndex` returns, from Gitea or from the codec for the same
80
+ * control file, it yields the same bytes: the trimmed control text without
81
+ * the index-owned fields, plus a final LF. A non-`Uint8Array` is
82
+ * `invalid-input`.
83
+ */
84
+ export function stripDebianIndexOwnedFields(stanzaArg) {
85
+ assertBytes(stanzaArg, 'stanza');
86
+ const kept = [];
87
+ let total = 0;
88
+ let dropping = false;
89
+ let start = 0;
90
+ while (start < stanzaArg.length) {
91
+ const lineFeed = stanzaArg.indexOf(LF, start);
92
+ const end = lineFeed < 0 ? stanzaArg.length : lineFeed + 1;
93
+ const first = stanzaArg[start];
94
+ if (first === 0x20 || first === 0x09) {
95
+ if (!dropping) {
96
+ kept.push(stanzaArg.subarray(start, end));
97
+ total += end - start;
98
+ }
99
+ }
100
+ else {
101
+ const lineEnd = lineFeed < 0 ? stanzaArg.length : lineFeed;
102
+ const colon = stanzaArg.subarray(start, lineEnd).indexOf(0x3a);
103
+ dropping = colon >= 0 && isIndexOwnedFieldName(stanzaArg.subarray(start, start + colon));
104
+ if (!dropping) {
105
+ kept.push(stanzaArg.subarray(start, end));
106
+ total += end - start;
107
+ }
108
+ }
109
+ start = end;
110
+ }
111
+ const result = new Uint8Array(total);
112
+ let offset = 0;
113
+ for (const line of kept) {
114
+ result.set(line, offset);
115
+ offset += line.length;
116
+ }
117
+ return result;
118
+ }
119
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVsZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kZWJpYW4vcnVsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMzRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTVDLDZHQUE2RztBQUM3RyxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxnQ0FBZ0MsQ0FBQztBQUV0RTs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxRQUFnQjtJQUM3QyxPQUFPLE9BQU8sUUFBUSxLQUFLLFFBQVEsSUFBSSxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDOUUsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFDLFFBQWdCO0lBQ25ELE9BQU8sT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLFFBQVEsS0FBSyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxRQUFRLEtBQUssUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO0FBQzNILENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sOEJBQThCLEdBQUcsZ0JBQWdCLENBQUM7QUFFeEQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsK0JBQStCLENBQUMsT0FBZTtJQUM3RCxPQUFPLDhCQUE4QixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN0RCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sa0JBQWtCLEdBQXdCLElBQUksR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO0FB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
@@ -1,4 +1,4 @@
1
- export type { TLinuxPackageFormat, ILinuxPackageDigests, IAlpinePackageDigests, ILinuxPackageRecordBase, IAlpinePackageMetadata, IAlpinePackageRecord, IDebianPackageMetadata, IDebianPackageRecord, IRpmDependency, IRpmFile, IRpmChangelog, IRpmPackageMetadata, IRpmPackageRecord, IRpmUpdate, IRpmUpdateReference, IRpmUpdateCollection, IRpmUpdatePackage, IArchPackageMetadata, IArchPackageRecord, TLinuxPackageRecord, TLinuxIndexFileStage, ILinuxIndexFile, } from './shared/types.js';
1
+ export type { TLinuxPackageFormat, ILinuxPackageDigests, IAlpinePackageDigests, ILinuxPackageRecordBase, IAlpinePackageMetadata, IAlpinePackageRecord, IDebianPackageMetadata, IDebianPackageRecord, IRpmDependency, IRpmFile, IRpmChangelog, IRpmPackageMetadata, IRpmPackageRecord, IRpmUpdate, IRpmUpdateReference, IRpmUpdateCollection, IRpmUpdatePackage, IArchPackageMetadata, IArchPackageRecord, TLinuxPackageRecord, TLinuxIndexFileStage, ILinuxIndexFile, TLinuxCompression, } from './shared/types.js';
2
2
  export { DEFAULT_LINUX_PACKAGE_LIMITS } from './shared/limits.js';
3
3
  export type { ILinuxPackageLimits } from './shared/limits.js';
4
4
  export { LinuxRepoError } from './shared/errors.js';
@@ -6,22 +6,32 @@ export type { TLinuxRepoErrorCode, ILinuxRepoErrorDetail } from './shared/errors
6
6
  export { isIndexableArchitecture } from './shared/architecture.js';
7
7
  export { createAlpineSigner, createOpenPgpSigner } from './signing/signers.js';
8
8
  export type { IAlpineSigner, IOpenPgpSigner } from './signing/signers.js';
9
- export { createOpenPgpVerifier } from './signing/verifiers.js';
10
- export type { IOpenPgpCleartextVerification, IOpenPgpSignatureVerification, IOpenPgpVerifier, TOpenPgpHashAlgorithm, } from './signing/verifiers.js';
9
+ export { createAlpineVerifier, createOpenPgpVerifier } from './signing/verifiers.js';
10
+ export type { IAlpineSignatureVerification, IAlpineVerifier, IOpenPgpCleartextVerification, IOpenPgpSignatureVerification, IOpenPgpVerifier, TOpenPgpHashAlgorithm, } from './signing/verifiers.js';
11
11
  export { generateAlpineKeyPair, generateOpenPgpKeyPair, giteaAlpineKeyName } from './signing/keys.js';
12
12
  export type { IAlpineKeyPair, IOpenPgpKeyPair } from './signing/keys.js';
13
13
  export { readDebianPackage } from './debian/reader.js';
14
14
  export { buildDebianIndex } from './debian/indexbuilder.js';
15
15
  export type { IDebianIndexEntry } from './debian/indexbuilder.js';
16
- export { isDebianReleaseValue, isDebianSymbol } from './debian/rules.js';
16
+ export { isDebianReleaseValue, isDebianSymbol, stripDebianIndexOwnedFields } from './debian/rules.js';
17
+ export { readDebianPackagesIndex, readDebianRelease } from './debian/indexreader.js';
18
+ export type { IDebianPackagesIndex, IDebianPackagesStanza, IDebianRelease, IDebianReleaseField, IDebianReleaseFile, } from './debian/indexreader.js';
17
19
  export { readRpmPackage } from './rpm/reader.js';
18
20
  export { signRpmPackage } from './rpm/sign.js';
19
21
  export { buildRpmIndex } from './rpm/builder.js';
20
22
  export { mergeRpmUpdates } from './rpm/updates.js';
21
23
  export { renderRpmRepoConfig } from './rpm/repoconfig.js';
24
+ export { isRpmPrimaryPath } from './rpm/repodata.js';
25
+ export { readRpmRepodata, readRpmRepomd, readRpmUpdateInfo } from './rpm/repodatareader.js';
26
+ export type { IRpmRepodata, IRpmRepodataFile, IRpmRepodataPackage, IRpmRepomd, IRpmRepomdChecksum, IRpmRepomdData, IRpmRepomdElement, IRpmUpdateInfo, IRpmUpdateInfoPackage, IRpmUpdateInfoUpdate, IRpmXmlAttribute, IRpmXmlFrame, TRpmRepodataDocument, } from './rpm/repodatareader.js';
22
27
  export { readArchPackage } from './arch/reader.js';
23
28
  export { buildArchIndex } from './arch/builder.js';
24
29
  export type { IArchIndexEntry } from './arch/builder.js';
25
30
  export { signArchPackage } from './arch/signer.js';
31
+ export { compareArchVersions } from './arch/vercmp.js';
32
+ export { readArchIndex } from './arch/indexreader.js';
33
+ export type { IArchIndex, IArchIndexMember } from './arch/indexreader.js';
26
34
  export { readAlpinePackage } from './alpine/reader.js';
27
35
  export { buildAlpineIndex } from './alpine/apkindex.js';
36
+ export { readAlpineIndex } from './alpine/apkindexreader.js';
37
+ export type { IAlpineIndex, IAlpineIndexBlock, IAlpineIndexMember, IAlpineIndexSignatureEntry, } from './alpine/apkindexreader.js';
package/dist_ts/index.js CHANGED
@@ -2,19 +2,25 @@ export { DEFAULT_LINUX_PACKAGE_LIMITS } from './shared/limits.js';
2
2
  export { LinuxRepoError } from './shared/errors.js';
3
3
  export { isIndexableArchitecture } from './shared/architecture.js';
4
4
  export { createAlpineSigner, createOpenPgpSigner } from './signing/signers.js';
5
- export { createOpenPgpVerifier } from './signing/verifiers.js';
5
+ export { createAlpineVerifier, createOpenPgpVerifier } from './signing/verifiers.js';
6
6
  export { generateAlpineKeyPair, generateOpenPgpKeyPair, giteaAlpineKeyName } from './signing/keys.js';
7
7
  export { readDebianPackage } from './debian/reader.js';
8
8
  export { buildDebianIndex } from './debian/indexbuilder.js';
9
- export { isDebianReleaseValue, isDebianSymbol } from './debian/rules.js';
9
+ export { isDebianReleaseValue, isDebianSymbol, stripDebianIndexOwnedFields } from './debian/rules.js';
10
+ export { readDebianPackagesIndex, readDebianRelease } from './debian/indexreader.js';
10
11
  export { readRpmPackage } from './rpm/reader.js';
11
12
  export { signRpmPackage } from './rpm/sign.js';
12
13
  export { buildRpmIndex } from './rpm/builder.js';
13
14
  export { mergeRpmUpdates } from './rpm/updates.js';
14
15
  export { renderRpmRepoConfig } from './rpm/repoconfig.js';
16
+ export { isRpmPrimaryPath } from './rpm/repodata.js';
17
+ export { readRpmRepodata, readRpmRepomd, readRpmUpdateInfo } from './rpm/repodatareader.js';
15
18
  export { readArchPackage } from './arch/reader.js';
16
19
  export { buildArchIndex } from './arch/builder.js';
17
20
  export { signArchPackage } from './arch/signer.js';
21
+ export { compareArchVersions } from './arch/vercmp.js';
22
+ export { readArchIndex } from './arch/indexreader.js';
18
23
  export { readAlpinePackage } from './alpine/reader.js';
19
24
  export { buildAlpineIndex } from './alpine/apkindex.js';
20
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUF3QkEsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFbEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXBELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRS9FLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBTy9ELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxzQkFBc0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXRHLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTVELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDakQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzFELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFbkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDIn0=
25
+ export { readAlpineIndex } from './alpine/apkindexreader.js';
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUF5QkEsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFbEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXBELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRS9FLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBU3JGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxzQkFBc0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXRHLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTVELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxjQUFjLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN0RyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQVFyRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDakQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzFELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFnQjVGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFbkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUV0RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUMifQ==
@@ -1,7 +1,6 @@
1
1
  import type { ILinuxPackageLimits } from '../shared/limits.js';
2
+ import type { TLinuxCompression } from '../shared/types.js';
2
3
  import { type IByteReader } from './bytes.js';
3
- /** The stream compressions the readers decode. */
4
- export type TLinuxCompression = 'none' | 'gzip' | 'xz' | 'zstd';
5
4
  export interface IDecompressOptions {
6
5
  /** Bound on the decompressed bytes delivered. */
7
6
  maxOutputBytes: number;