@push.rocks/smartlinuxrepo 0.0.0-stage → 1.0.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 (131) hide show
  1. package/.smartconfig.json +65 -0
  2. package/dist_ts/00_commitinfo_data.d.ts +8 -0
  3. package/dist_ts/00_commitinfo_data.js +9 -0
  4. package/dist_ts/alpine/apkindex.d.ts +39 -0
  5. package/dist_ts/alpine/apkindex.js +211 -0
  6. package/dist_ts/alpine/pkginfo.d.ts +45 -0
  7. package/dist_ts/alpine/pkginfo.js +159 -0
  8. package/dist_ts/alpine/reader.d.ts +20 -0
  9. package/dist_ts/alpine/reader.js +89 -0
  10. package/dist_ts/arch/builder.d.ts +41 -0
  11. package/dist_ts/arch/builder.js +234 -0
  12. package/dist_ts/arch/reader.d.ts +16 -0
  13. package/dist_ts/arch/reader.js +271 -0
  14. package/dist_ts/arch/signer.d.ts +21 -0
  15. package/dist_ts/arch/signer.js +66 -0
  16. package/dist_ts/arch/vercmp.d.ts +12 -0
  17. package/dist_ts/arch/vercmp.js +170 -0
  18. package/dist_ts/debian/control.d.ts +22 -0
  19. package/dist_ts/debian/control.js +137 -0
  20. package/dist_ts/debian/gostring.d.ts +26 -0
  21. package/dist_ts/debian/gostring.js +145 -0
  22. package/dist_ts/debian/indexbuilder.d.ts +47 -0
  23. package/dist_ts/debian/indexbuilder.js +299 -0
  24. package/dist_ts/debian/mailaddress.d.ts +12 -0
  25. package/dist_ts/debian/mailaddress.js +736 -0
  26. package/dist_ts/debian/reader.d.ts +30 -0
  27. package/dist_ts/debian/reader.js +110 -0
  28. package/dist_ts/index.d.ts +23 -0
  29. package/dist_ts/index.js +18 -0
  30. package/dist_ts/plugins.d.ts +8 -0
  31. package/dist_ts/plugins.js +11 -0
  32. package/dist_ts/readers/ar.d.ts +31 -0
  33. package/dist_ts/readers/ar.js +87 -0
  34. package/dist_ts/readers/bytes.d.ts +58 -0
  35. package/dist_ts/readers/bytes.js +147 -0
  36. package/dist_ts/readers/bytesource.d.ts +40 -0
  37. package/dist_ts/readers/bytesource.js +154 -0
  38. package/dist_ts/readers/decompress.d.ts +43 -0
  39. package/dist_ts/readers/decompress.js +269 -0
  40. package/dist_ts/readers/gzipmember.d.ts +32 -0
  41. package/dist_ts/readers/gzipmember.js +176 -0
  42. package/dist_ts/readers/tar.d.ts +85 -0
  43. package/dist_ts/readers/tar.js +731 -0
  44. package/dist_ts/readers/text.d.ts +16 -0
  45. package/dist_ts/readers/text.js +96 -0
  46. package/dist_ts/rpm/builder.d.ts +28 -0
  47. package/dist_ts/rpm/builder.js +208 -0
  48. package/dist_ts/rpm/header.d.ts +138 -0
  49. package/dist_ts/rpm/header.js +546 -0
  50. package/dist_ts/rpm/reader.d.ts +20 -0
  51. package/dist_ts/rpm/reader.js +306 -0
  52. package/dist_ts/rpm/repoconfig.d.ts +15 -0
  53. package/dist_ts/rpm/repoconfig.js +38 -0
  54. package/dist_ts/rpm/repodata.d.ts +44 -0
  55. package/dist_ts/rpm/repodata.js +148 -0
  56. package/dist_ts/rpm/sign.d.ts +30 -0
  57. package/dist_ts/rpm/sign.js +183 -0
  58. package/dist_ts/rpm/updates.d.ts +38 -0
  59. package/dist_ts/rpm/updates.js +265 -0
  60. package/dist_ts/rpm/xml.d.ts +18 -0
  61. package/dist_ts/rpm/xml.js +90 -0
  62. package/dist_ts/shared/architecture.d.ts +8 -0
  63. package/dist_ts/shared/architecture.js +17 -0
  64. package/dist_ts/shared/errors.d.ts +38 -0
  65. package/dist_ts/shared/errors.js +22 -0
  66. package/dist_ts/shared/gopath.d.ts +13 -0
  67. package/dist_ts/shared/gopath.js +53 -0
  68. package/dist_ts/shared/gostrings.d.ts +14 -0
  69. package/dist_ts/shared/gostrings.js +29 -0
  70. package/dist_ts/shared/limits.d.ts +47 -0
  71. package/dist_ts/shared/limits.js +57 -0
  72. package/dist_ts/shared/types.d.ts +213 -0
  73. package/dist_ts/shared/types.js +13 -0
  74. package/dist_ts/shared/url.d.ts +18 -0
  75. package/dist_ts/shared/url.js +371 -0
  76. package/dist_ts/shared/validation.d.ts +21 -0
  77. package/dist_ts/shared/validation.js +58 -0
  78. package/dist_ts/signing/keys.d.ts +36 -0
  79. package/dist_ts/signing/keys.js +89 -0
  80. package/dist_ts/signing/openpgpframing.d.ts +33 -0
  81. package/dist_ts/signing/openpgpframing.js +93 -0
  82. package/dist_ts/signing/signers.d.ts +63 -0
  83. package/dist_ts/signing/signers.js +248 -0
  84. package/dist_ts/writers/gotar.d.ts +43 -0
  85. package/dist_ts/writers/gotar.js +218 -0
  86. package/license.md +19 -0
  87. package/package.json +56 -3
  88. package/readme.md +176 -0
  89. package/ts/00_commitinfo_data.ts +8 -0
  90. package/ts/alpine/apkindex.ts +241 -0
  91. package/ts/alpine/pkginfo.ts +183 -0
  92. package/ts/alpine/reader.ts +96 -0
  93. package/ts/arch/builder.ts +283 -0
  94. package/ts/arch/reader.ts +307 -0
  95. package/ts/arch/signer.ts +70 -0
  96. package/ts/arch/vercmp.ts +188 -0
  97. package/ts/debian/control.ts +150 -0
  98. package/ts/debian/gostring.ts +150 -0
  99. package/ts/debian/indexbuilder.ts +355 -0
  100. package/ts/debian/mailaddress.ts +754 -0
  101. package/ts/debian/reader.ts +126 -0
  102. package/ts/index.ts +46 -0
  103. package/ts/plugins.ts +13 -0
  104. package/ts/readers/ar.ts +102 -0
  105. package/ts/readers/bytes.ts +182 -0
  106. package/ts/readers/bytesource.ts +164 -0
  107. package/ts/readers/decompress.ts +332 -0
  108. package/ts/readers/gzipmember.ts +209 -0
  109. package/ts/readers/tar.ts +835 -0
  110. package/ts/readers/text.ts +91 -0
  111. package/ts/rpm/builder.ts +253 -0
  112. package/ts/rpm/header.ts +628 -0
  113. package/ts/rpm/reader.ts +317 -0
  114. package/ts/rpm/repoconfig.ts +45 -0
  115. package/ts/rpm/repodata.ts +219 -0
  116. package/ts/rpm/sign.ts +200 -0
  117. package/ts/rpm/updates.ts +314 -0
  118. package/ts/rpm/xml.ts +101 -0
  119. package/ts/shared/architecture.ts +16 -0
  120. package/ts/shared/errors.ts +78 -0
  121. package/ts/shared/gopath.ts +54 -0
  122. package/ts/shared/gostrings.ts +31 -0
  123. package/ts/shared/limits.ts +93 -0
  124. package/ts/shared/types.ts +251 -0
  125. package/ts/shared/url.ts +387 -0
  126. package/ts/shared/validation.ts +71 -0
  127. package/ts/signing/keys.ts +110 -0
  128. package/ts/signing/openpgpframing.ts +115 -0
  129. package/ts/signing/signers.ts +315 -0
  130. package/ts/writers/gotar.ts +256 -0
  131. package/README.md +0 -3
@@ -0,0 +1,299 @@
1
+ import * as plugins from '../plugins.js';
2
+ import { isIndexableArchitecture } from '../shared/architecture.js';
3
+ import { LinuxRepoError } from '../shared/errors.js';
4
+ import { assertSegmentName, assertString, assertTimestamp, hasControlCharacter } from '../shared/validation.js';
5
+ import { createCleartextSignedMessage, createDetachedArmoredSignature } from '../signing/openpgpframing.js';
6
+ import { DEBIAN_SYMBOL_PATTERN } from './control.js';
7
+ import { compareUtf8, goTrimSpace, utf8ByteString } from './gostring.js';
8
+ /** The fields the `Packages` stanza writes itself; a control file's own copies are dropped. */
9
+ const INDEX_OWNED_FIELDS = new Set(['filename', 'size', 'md5sum', 'sha1', 'sha256', 'sha512']);
10
+ const PACKAGES_FILES = ['Packages', 'Packages.gz', 'Packages.xz'];
11
+ const MEDIA_TYPES = {
12
+ Packages: 'text/plain; charset=utf-8',
13
+ 'Packages.gz': 'application/gzip',
14
+ 'Packages.xz': 'application/x-xz',
15
+ Release: 'text/plain; charset=utf-8',
16
+ 'Release.gpg': 'application/pgp-signature',
17
+ InRelease: 'text/plain; charset=utf-8',
18
+ };
19
+ const HASH_PATTERNS = {
20
+ md5: /^[0-9a-f]{32}$/,
21
+ sha1: /^[0-9a-f]{40}$/,
22
+ sha256: /^[0-9a-f]{64}$/,
23
+ sha512: /^[0-9a-f]{128}$/,
24
+ };
25
+ /**
26
+ * Builds the index files of one Debian distribution as Gitea 28.2.0 does
27
+ * (`services/packages/debian/repository.go:147-397`):
28
+ *
29
+ * - per component and architecture with packages:
30
+ * `dists/<dist>/<component>/binary-<arch>/Packages`, `.gz` and `.xz`,
31
+ * each with `by-hash/{MD5Sum,SHA1,SHA256,SHA512}/<hex>` aliases;
32
+ * - `dists/<dist>/Release`, `Release.gpg` (armored detached signature) and
33
+ * `InRelease` (cleartext-signed `Release`), all signed at `timestamp`.
34
+ *
35
+ * An `all` package is listed only under `binary-all`, as in Gitea. Stanzas are
36
+ * sorted by name, version, architecture and file name (bytewise; Gitea uses
37
+ * database order), and the Release file lists follow component, architecture
38
+ * and file order. The output is the complete set of files for the
39
+ * distribution; an empty entry set returns `[]`.
40
+ */
41
+ export async function buildDebianIndex(input) {
42
+ if (input === null || typeof input !== 'object') {
43
+ throw new LinuxRepoError('invalid-input', 'input must be an object', { field: 'input' });
44
+ }
45
+ assertSymbol(input.distribution, 'distribution');
46
+ assertReleaseValue(input.origin, 'origin');
47
+ assertReleaseValue(input.label, 'label');
48
+ assertTimestamp(input.timestamp);
49
+ if (input.signer === null || typeof input.signer !== 'object') {
50
+ throw new LinuxRepoError('invalid-input', 'signer must be an IOpenPgpSigner', { field: 'signer' });
51
+ }
52
+ if (!Array.isArray(input.entries)) {
53
+ throw new LinuxRepoError('invalid-input', 'entries must be an array', { field: 'entries' });
54
+ }
55
+ if (input.entries.length === 0) {
56
+ return [];
57
+ }
58
+ const groups = new Map();
59
+ const poolPaths = new Set();
60
+ for (const entry of input.entries) {
61
+ if (entry === null || typeof entry !== 'object') {
62
+ throw new LinuxRepoError('invalid-input', 'each entry must be an object', { field: 'entries' });
63
+ }
64
+ assertSymbol(entry.component, 'component');
65
+ assertRecord(entry.record);
66
+ const poolPath = `${entry.component}/${entry.record.fileName}`;
67
+ if (poolPaths.has(poolPath)) {
68
+ throw new LinuxRepoError('invalid-input', `duplicate package file pool/${input.distribution}/${poolPath}`, {
69
+ field: 'entries',
70
+ value: entry.record.fileName,
71
+ });
72
+ }
73
+ poolPaths.add(poolPath);
74
+ const groupKey = `${entry.component}\n${entry.record.architecture}`;
75
+ let group = groups.get(groupKey);
76
+ if (group === undefined) {
77
+ group = { component: entry.component, architecture: entry.record.architecture, entries: [] };
78
+ groups.set(groupKey, group);
79
+ }
80
+ group.entries.push(entry);
81
+ }
82
+ const sortedGroups = [...groups.values()].sort((a, b) => compareUtf8(a.component, b.component) || compareUtf8(a.architecture, b.architecture));
83
+ const contentFiles = [];
84
+ const releaseLines = { md5: [], sha1: [], sha256: [], sha512: [] };
85
+ for (const group of sortedGroups) {
86
+ const stanzas = group.entries
87
+ .slice()
88
+ .sort((a, b) => compareRecords(a.record, b.record))
89
+ .map((entry) => renderDebianPackagesStanza({ distribution: input.distribution, component: entry.component, record: entry.record }));
90
+ // one blank line between stanzas (repository.go:197-199)
91
+ const packages = new TextEncoder().encode(stanzas.join('\n'));
92
+ const directory = `dists/${input.distribution}/${group.component}/binary-${group.architecture}`;
93
+ const encoded = {
94
+ Packages: packages,
95
+ 'Packages.gz': await gzip(packages),
96
+ 'Packages.xz': new Uint8Array(await plugins.lzma.xz.compress(packages)),
97
+ };
98
+ for (const fileName of PACKAGES_FILES) {
99
+ const bytes = encoded[fileName];
100
+ const hashes = digestsOf(bytes);
101
+ const releasePath = `${group.component}/binary-${group.architecture}/${fileName}`;
102
+ for (const algorithm of ['md5', 'sha1', 'sha256', 'sha512']) {
103
+ releaseLines[algorithm].push(` ${hashes[algorithm]} ${bytes.length} ${releasePath}`);
104
+ }
105
+ contentFiles.push({
106
+ path: `${directory}/${fileName}`,
107
+ bytes,
108
+ sha256: hashes.sha256,
109
+ mediaType: MEDIA_TYPES[fileName],
110
+ stage: 'content',
111
+ aliases: [
112
+ `${directory}/by-hash/MD5Sum/${hashes.md5}`,
113
+ `${directory}/by-hash/SHA1/${hashes.sha1}`,
114
+ `${directory}/by-hash/SHA256/${hashes.sha256}`,
115
+ `${directory}/by-hash/SHA512/${hashes.sha512}`,
116
+ ],
117
+ });
118
+ }
119
+ }
120
+ const components = distinctSorted(sortedGroups.map((group) => group.component));
121
+ const architectures = distinctSorted(sortedGroups.map((group) => group.architecture));
122
+ // repository.go:322-352
123
+ const release = `Origin: ${input.origin}\n` +
124
+ `Label: ${input.label}\n` +
125
+ `Suite: ${input.distribution}\n` +
126
+ `Codename: ${input.distribution}\n` +
127
+ `Components: ${components.join(' ')}\n` +
128
+ `Architectures: ${architectures.join(' ')}\n` +
129
+ `Date: ${formatRfc1123Utc(input.timestamp)}\n` +
130
+ 'Acquire-By-Hash: yes\n' +
131
+ `MD5Sum:\n${releaseLines.md5.map((line) => `${line}\n`).join('')}` +
132
+ `SHA1:\n${releaseLines.sha1.map((line) => `${line}\n`).join('')}` +
133
+ `SHA256:\n${releaseLines.sha256.map((line) => `${line}\n`).join('')}` +
134
+ `SHA512:\n${releaseLines.sha512.map((line) => `${line}\n`).join('')}`;
135
+ const releaseBytes = new TextEncoder().encode(release);
136
+ const releaseGpg = new TextEncoder().encode(await createDetachedArmoredSignature({ data: releaseBytes, signer: input.signer, timestamp: input.timestamp }));
137
+ const inRelease = new TextEncoder().encode(await createCleartextSignedMessage({ text: release, signer: input.signer, timestamp: input.timestamp }));
138
+ const pointerFiles = [
139
+ ['Release', releaseBytes],
140
+ ['Release.gpg', releaseGpg],
141
+ ['InRelease', inRelease],
142
+ ].map(([fileName, bytes]) => ({
143
+ path: `dists/${input.distribution}/${fileName}`,
144
+ bytes: bytes,
145
+ sha256: plugins.crypto.createHash('sha256').update(bytes).digest('hex'),
146
+ mediaType: MEDIA_TYPES[fileName],
147
+ stage: 'pointer',
148
+ aliases: [],
149
+ }));
150
+ return [...contentFiles, ...pointerFiles];
151
+ }
152
+ /**
153
+ * One `Packages` stanza, without the separating blank line: Gitea's trimmed
154
+ * control stanza without the six index-owned fields (`Filename`, `Size`,
155
+ * `MD5sum`, `SHA1`, `SHA256`, `SHA512`, matched case-insensitively, with their
156
+ * continuation lines), then those fields from the record
157
+ * (`repository.go:202-209`). A control file that sets them would point apt at
158
+ * other bytes; Gitea would write them twice. Internal: 1.0.0 exports no
159
+ * per-entry renderer.
160
+ */
161
+ export function renderDebianPackagesStanza(input) {
162
+ assertSymbol(input.distribution, 'distribution');
163
+ assertSymbol(input.component, 'component');
164
+ assertRecord(input.record);
165
+ const kept = [];
166
+ let dropping = false;
167
+ // Gitea trims the stored stanza again when it writes it (repository.go:202)
168
+ for (const line of goTrimSpaceText(input.record.metadata.control).split('\n')) {
169
+ if (line[0] === ' ' || line[0] === '\t') {
170
+ if (!dropping) {
171
+ kept.push(line);
172
+ }
173
+ continue;
174
+ }
175
+ const colon = line.indexOf(':');
176
+ const field = colon < 0 ? null : goTrimSpaceText(line.slice(0, colon)).toLowerCase();
177
+ dropping = field !== null && INDEX_OWNED_FIELDS.has(field);
178
+ if (!dropping) {
179
+ kept.push(line);
180
+ }
181
+ }
182
+ const control = kept.join('\n');
183
+ if (control === '') {
184
+ throw new LinuxRepoError('invalid-input', 'the record control stanza has no fields besides the index-owned ones', {
185
+ field: 'record.metadata.control',
186
+ });
187
+ }
188
+ const { digests } = input.record;
189
+ return (`${control}\n` +
190
+ `Filename: pool/${input.distribution}/${input.component}/${input.record.fileName}\n` +
191
+ `Size: ${digests.size}\n` +
192
+ `MD5sum: ${digests.md5}\n` +
193
+ `SHA1: ${digests.sha1}\n` +
194
+ `SHA256: ${digests.sha256}\n` +
195
+ `SHA512: ${digests.sha512}\n`);
196
+ }
197
+ /**
198
+ * Refuses a record the index cannot list: wrong format, an architecture that
199
+ * is not a path segment, a file name that is not one, digests that are not
200
+ * hex of the right length, or a control text that is not one stanza (empty,
201
+ * or holding a blank line that would start another stanza).
202
+ */
203
+ function assertRecord(recordArg) {
204
+ if (recordArg === null || typeof recordArg !== 'object' || recordArg.format !== 'debian') {
205
+ throw new LinuxRepoError('invalid-input', 'record must be a Debian package record', { field: 'record' });
206
+ }
207
+ if (!isIndexableArchitecture(recordArg.architecture)) {
208
+ throw new LinuxRepoError('invalid-input', `${String(recordArg.fileName)}: architecture "${String(recordArg.architecture)}" cannot name an index path`, { field: 'record.architecture', value: String(recordArg.fileName) });
209
+ }
210
+ assertSegmentName(recordArg.fileName, 'record.fileName');
211
+ if (/\s/.test(recordArg.fileName)) {
212
+ throw new LinuxRepoError('invalid-input', 'record.fileName must not contain whitespace', {
213
+ field: 'record.fileName',
214
+ value: recordArg.fileName,
215
+ });
216
+ }
217
+ const digests = recordArg.digests;
218
+ if (digests === null || typeof digests !== 'object' || !Number.isSafeInteger(digests.size) || digests.size < 0) {
219
+ throw new LinuxRepoError('invalid-input', 'record.digests.size must be a non-negative safe integer', {
220
+ field: 'record.digests',
221
+ });
222
+ }
223
+ for (const algorithm of ['md5', 'sha1', 'sha256', 'sha512']) {
224
+ if (typeof digests[algorithm] !== 'string' || !HASH_PATTERNS[algorithm].test(digests[algorithm])) {
225
+ throw new LinuxRepoError('invalid-input', `record.digests.${algorithm} must be lowercase hex`, {
226
+ field: `record.digests.${algorithm}`,
227
+ });
228
+ }
229
+ }
230
+ const metadata = recordArg.metadata;
231
+ if (metadata === null || typeof metadata !== 'object') {
232
+ throw new LinuxRepoError('invalid-input', 'record.metadata must be an object', { field: 'record.metadata' });
233
+ }
234
+ assertString(metadata.control, 'record.metadata.control');
235
+ if (goTrimSpaceText(metadata.control).split('\n').some((line) => goTrimSpaceText(line) === '')) {
236
+ throw new LinuxRepoError('invalid-input', 'record.metadata.control must be one stanza without blank lines', {
237
+ field: 'record.metadata.control',
238
+ });
239
+ }
240
+ }
241
+ function assertSymbol(valueArg, fieldArg) {
242
+ assertString(valueArg, fieldArg);
243
+ if (!DEBIAN_SYMBOL_PATTERN.test(valueArg)) {
244
+ throw new LinuxRepoError('invalid-input', `${fieldArg} must match ${DEBIAN_SYMBOL_PATTERN.source}`, {
245
+ field: fieldArg,
246
+ value: valueArg,
247
+ });
248
+ }
249
+ }
250
+ /** A Release header value: one line, non-empty, no leading or trailing whitespace (canonical cleartext). */
251
+ function assertReleaseValue(valueArg, fieldArg) {
252
+ assertString(valueArg, fieldArg);
253
+ if (valueArg === '' || hasControlCharacter(valueArg) || valueArg !== valueArg.trim()) {
254
+ throw new LinuxRepoError('invalid-input', `${fieldArg} must be non-empty, without control characters or surrounding whitespace`, { field: fieldArg });
255
+ }
256
+ }
257
+ /** Go `strings.TrimSpace` on a Unicode string. */
258
+ function goTrimSpaceText(valueArg) {
259
+ return Buffer.from(goTrimSpace(utf8ByteString(valueArg)), 'latin1').toString('utf8');
260
+ }
261
+ function compareRecords(aArg, bArg) {
262
+ return (compareUtf8(aArg.name, bArg.name) ||
263
+ compareUtf8(aArg.version, bArg.version) ||
264
+ compareUtf8(aArg.architecture, bArg.architecture) ||
265
+ compareUtf8(aArg.fileName, bArg.fileName));
266
+ }
267
+ function distinctSorted(valuesArg) {
268
+ return [...new Set(valuesArg)].sort(compareUtf8);
269
+ }
270
+ function digestsOf(bytesArg) {
271
+ return {
272
+ md5: plugins.crypto.createHash('md5').update(bytesArg).digest('hex'),
273
+ sha1: plugins.crypto.createHash('sha1').update(bytesArg).digest('hex'),
274
+ sha256: plugins.crypto.createHash('sha256').update(bytesArg).digest('hex'),
275
+ sha512: plugins.crypto.createHash('sha512').update(bytesArg).digest('hex'),
276
+ };
277
+ }
278
+ function gzip(bytesArg) {
279
+ return new Promise((resolve, reject) => {
280
+ plugins.zlib.gzip(bytesArg, (error, result) => {
281
+ if (error !== null) {
282
+ reject(error);
283
+ }
284
+ else {
285
+ resolve(new Uint8Array(result.buffer, result.byteOffset, result.byteLength));
286
+ }
287
+ });
288
+ });
289
+ }
290
+ const WEEKDAYS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
291
+ const MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
292
+ /** Go `time.Time.UTC().Format(time.RFC1123)`: `Mon, 02 Jan 2006 15:04:05 UTC`. */
293
+ function formatRfc1123Utc(timestampArg) {
294
+ const pad = (valueArg) => String(valueArg).padStart(2, '0');
295
+ return (`${WEEKDAYS[timestampArg.getUTCDay()]}, ${pad(timestampArg.getUTCDate())} ${MONTHS[timestampArg.getUTCMonth()]} ` +
296
+ `${timestampArg.getUTCFullYear()} ${pad(timestampArg.getUTCHours())}:${pad(timestampArg.getUTCMinutes())}:` +
297
+ `${pad(timestampArg.getUTCSeconds())} UTC`);
298
+ }
299
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXhidWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvZGViaWFuL2luZGV4YnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFckQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVoSCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsOEJBQThCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM1RyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDckQsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXpFLCtGQUErRjtBQUMvRixNQUFNLGtCQUFrQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO0FBRS9GLE1BQU0sY0FBYyxHQUFHLENBQUMsVUFBVSxFQUFFLGFBQWEsRUFBRSxhQUFhLENBQVUsQ0FBQztBQUUzRSxNQUFNLFdBQVcsR0FBMkI7SUFDMUMsUUFBUSxFQUFFLDJCQUEyQjtJQUNyQyxhQUFhLEVBQUUsa0JBQWtCO0lBQ2pDLGFBQWEsRUFBRSxrQkFBa0I7SUFDakMsT0FBTyxFQUFFLDJCQUEyQjtJQUNwQyxhQUFhLEVBQUUsMkJBQTJCO0lBQzFDLFNBQVMsRUFBRSwyQkFBMkI7Q0FDdkMsQ0FBQztBQUVGLE1BQU0sYUFBYSxHQUFHO0lBQ3BCLEdBQUcsRUFBRSxnQkFBZ0I7SUFDckIsSUFBSSxFQUFF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
@@ -0,0 +1,12 @@
1
+ /**
2
+ * A port of Go 1.27.2 `net/mail.ParseAddress` (Gitea 28.2.0's toolchain,
3
+ * `go.mod`), used for the Debian `Maintainer` name. Inputs and outputs are
4
+ * byte strings (see `gostring.ts`). Only success and the parsed name matter
5
+ * to the caller, so error texts are not ported.
6
+ */
7
+ export interface IMailAddress {
8
+ name: string;
9
+ address: string;
10
+ }
11
+ /** Go `mail.ParseAddress`; `null` where Go returns an error. */
12
+ export declare function parseMailAddress(addressArg: string): IMailAddress | null;