@grove-dev/core 0.17.0 → 0.18.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 (54) hide show
  1. package/dist/build-data.d.ts.map +1 -1
  2. package/dist/build-data.js +2 -0
  3. package/dist/build-data.js.map +1 -1
  4. package/dist/candidate-collector.d.ts +61 -0
  5. package/dist/candidate-collector.d.ts.map +1 -0
  6. package/dist/candidate-collector.js +545 -0
  7. package/dist/candidate-collector.js.map +1 -0
  8. package/dist/candidate-discovery.d.ts +92 -0
  9. package/dist/candidate-discovery.d.ts.map +1 -0
  10. package/dist/candidate-discovery.js +488 -0
  11. package/dist/candidate-discovery.js.map +1 -0
  12. package/dist/candidate-schema.d.ts +209 -0
  13. package/dist/candidate-schema.d.ts.map +1 -0
  14. package/dist/candidate-schema.js +84 -0
  15. package/dist/candidate-schema.js.map +1 -0
  16. package/dist/github-cache.d.ts +87 -1
  17. package/dist/github-cache.d.ts.map +1 -1
  18. package/dist/github-cache.js +19 -1
  19. package/dist/github-cache.js.map +1 -1
  20. package/dist/image-probe.d.ts +27 -0
  21. package/dist/image-probe.d.ts.map +1 -0
  22. package/dist/image-probe.js +124 -0
  23. package/dist/image-probe.js.map +1 -0
  24. package/dist/index-policy.d.ts +48 -0
  25. package/dist/index-policy.d.ts.map +1 -0
  26. package/dist/index-policy.js +58 -0
  27. package/dist/index-policy.js.map +1 -0
  28. package/dist/index.d.ts +16 -4
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +8 -2
  31. package/dist/index.js.map +1 -1
  32. package/dist/page-document.d.ts +48 -0
  33. package/dist/page-document.d.ts.map +1 -1
  34. package/dist/page-document.js +93 -8
  35. package/dist/page-document.js.map +1 -1
  36. package/dist/prepare.d.ts.map +1 -1
  37. package/dist/prepare.js +31 -10
  38. package/dist/prepare.js.map +1 -1
  39. package/dist/record-candidates.d.ts +61 -0
  40. package/dist/record-candidates.d.ts.map +1 -0
  41. package/dist/record-candidates.js +261 -0
  42. package/dist/record-candidates.js.map +1 -0
  43. package/dist/schema.d.ts +78 -18
  44. package/dist/schema.d.ts.map +1 -1
  45. package/dist/schema.js +55 -2
  46. package/dist/schema.js.map +1 -1
  47. package/dist/sitemap.d.ts +3 -0
  48. package/dist/sitemap.d.ts.map +1 -1
  49. package/dist/sitemap.js +2 -0
  50. package/dist/sitemap.js.map +1 -1
  51. package/dist/validate.d.ts.map +1 -1
  52. package/dist/validate.js +14 -2
  53. package/dist/validate.js.map +1 -1
  54. package/package.json +1 -1
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Pure helpers for candidate collection: which repository files are
3
+ * worth reading, and what the files and package indexes say. The
4
+ * network side is in `candidate-collector.ts`; nothing here fetches.
5
+ */
6
+ export interface TreeFile {
7
+ path: string;
8
+ /** Git blob SHA. */
9
+ sha: string;
10
+ /** Size in bytes, as the git tree reports it. */
11
+ size?: number;
12
+ }
13
+ /** True when a path runs through a dependency, docs, test or build directory. */
14
+ export declare function isExcludedPath(path: string): boolean;
15
+ export interface FastlaneFiles {
16
+ /** Directory holding `fastlane/`, e.g. `` or `mobile/android`. */
17
+ root: string;
18
+ locale: string;
19
+ icon?: TreeFile;
20
+ screenshots: TreeFile[];
21
+ }
22
+ /**
23
+ * The fastlane (F-Droid / Play) metadata of the repository: its icon
24
+ * and phone screenshots in one locale (en-US first). The shallowest
25
+ * fastlane directory wins when there are several.
26
+ */
27
+ export declare function findFastlane(files: readonly TreeFile[], maxScreenshots?: number): FastlaneFiles | undefined;
28
+ /**
29
+ * Gradle build files of Android app modules, the ones next to a
30
+ * fastlane directory first. They hold the `applicationId` F-Droid
31
+ * lists the app under.
32
+ */
33
+ export declare function findGradleAppFiles(files: readonly TreeFile[], fastlaneRoot?: string, max?: number): TreeFile[];
34
+ /** Every `applicationId` a Gradle file declares (default config and flavors). */
35
+ export declare function parseGradleApplicationIds(text: string): string[];
36
+ /** AppStream metainfo files, shallowest first. */
37
+ export declare function findMetainfoFiles(files: readonly TreeFile[], max?: number): TreeFile[];
38
+ export interface AppstreamFacts {
39
+ id?: string;
40
+ /** `<icon type="remote">` URLs. */
41
+ icons: string[];
42
+ /** `<screenshot><image>` URLs, source images preferred over thumbnails. */
43
+ screenshots: string[];
44
+ }
45
+ /** The app id, remote icons and screenshots an AppStream metainfo file declares. */
46
+ export declare function parseAppstream(text: string, fileName?: string): AppstreamFacts;
47
+ /** Web app manifests under a web root (`public/`, `static/`, `web/`, …), shallowest first. */
48
+ export declare function findWebManifests(files: readonly TreeFile[], max?: number): TreeFile[];
49
+ /**
50
+ * The best icon a web app manifest declares, resolved to a repository
51
+ * path: `/x.png` against the manifest's directory (the web root), a
52
+ * relative `src` against the same directory. Maskable-only and
53
+ * monochrome icons are skipped; SVG, then the largest size, wins.
54
+ */
55
+ export declare function pickManifestIcon(text: string, manifestPath: string): string | undefined;
56
+ /**
57
+ * Files that look like the app's own logo: `logo*` / `icon*` /
58
+ * `<repo>-logo*` PNG, SVG or WebP inside an asset directory
59
+ * (`assets/`, `public/`, `branding/`, …). Favicon-sized files, banners
60
+ * and anything under a dependency, docs or test directory are skipped.
61
+ * SVG first, then shallower paths.
62
+ */
63
+ export declare function findAssetLogos(files: readonly TreeFile[], repo: string, max?: number): TreeFile[];
64
+ /** Installable release assets grouped by platform, names sorted. */
65
+ export declare function installableAssets(names: readonly string[]): Map<string, string[]>;
66
+ export interface RepologyPackage {
67
+ repo?: string;
68
+ srcname?: string;
69
+ binname?: string;
70
+ visiblename?: string;
71
+ version?: string;
72
+ }
73
+ export interface RepologyChannel {
74
+ type: string;
75
+ platform: string;
76
+ label: string;
77
+ url: string;
78
+ /** Repology repository id. */
79
+ repository: string;
80
+ packageName: string;
81
+ version?: string;
82
+ }
83
+ /**
84
+ * One channel per package repository Grove knows how to link to
85
+ * (Homebrew, AUR, Nixpkgs, Scoop, winget, Chocolatey, Snapcraft,
86
+ * Flathub, F-Droid); every other repository Repology tracks is left
87
+ * out. Sorted by repository id.
88
+ */
89
+ export declare function repologyChannels(packages: readonly RepologyPackage[]): RepologyChannel[];
90
+ /** Compare a release tag with a package version, ignoring a leading `v`. */
91
+ export declare function sameVersion(tag: string | undefined, version: string | undefined): boolean;
92
+ //# sourceMappingURL=candidate-discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"candidate-discovery.d.ts","sourceRoot":"","sources":["../src/candidate-discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,488 @@
1
+ /**
2
+ * Pure helpers for candidate collection: which repository files are
3
+ * worth reading, and what the files and package indexes say. The
4
+ * network side is in `candidate-collector.ts`; nothing here fetches.
5
+ */
6
+ /**
7
+ * Directories never searched: dependencies and vendored code (their
8
+ * icons belong to someone else), docs and `.github` (README images),
9
+ * tests, examples and build output.
10
+ */
11
+ const EXCLUDED_DIRS = new Set([
12
+ 'node_modules',
13
+ 'bower_components',
14
+ 'jspm_packages',
15
+ 'vendor',
16
+ 'vendors',
17
+ 'third_party',
18
+ 'third-party',
19
+ 'thirdparty',
20
+ 'external',
21
+ 'externals',
22
+ 'deps',
23
+ 'pods',
24
+ 'carthage',
25
+ '.github',
26
+ '.gitlab',
27
+ 'docs',
28
+ 'doc',
29
+ 'documentation',
30
+ 'wiki',
31
+ 'test',
32
+ 'tests',
33
+ '__tests__',
34
+ '__mocks__',
35
+ 'spec',
36
+ 'fixtures',
37
+ 'testdata',
38
+ 'example',
39
+ 'examples',
40
+ 'sample',
41
+ 'samples',
42
+ 'demo',
43
+ 'demos',
44
+ 'dist',
45
+ 'build',
46
+ 'out',
47
+ 'target',
48
+ '.dart_tool',
49
+ '.yarn',
50
+ '.git',
51
+ ]);
52
+ /** Words in a file name that mark a banner, card or README image, never a logo. */
53
+ const EXCLUDED_NAME = /banner|screenshot|screen[-_]?shot|readme|social|og[-_]?image|opengraph|preview|cover|header|hero|splash|feature[-_]?graphic|promo|sponsor|badge|wallpaper|mockup|showcase|tv[-_]?banner/i;
54
+ /** Directories an app keeps its own brand assets in. */
55
+ const ASSET_DIRS = new Set([
56
+ 'assets',
57
+ 'asset',
58
+ 'public',
59
+ 'static',
60
+ 'resources',
61
+ 'branding',
62
+ 'brand',
63
+ 'logo',
64
+ 'logos',
65
+ 'icons',
66
+ 'packaging',
67
+ 'art',
68
+ 'artwork',
69
+ 'media',
70
+ ]);
71
+ const IMAGE_EXT = /\.(png|svg|webp)$/i;
72
+ const SCREENSHOT_EXT = /\.(png|jpe?g|webp)$/i;
73
+ function segments(path) {
74
+ return path.split('/');
75
+ }
76
+ /** True when a path runs through a dependency, docs, test or build directory. */
77
+ export function isExcludedPath(path) {
78
+ const parts = segments(path);
79
+ return parts.slice(0, -1).some((part) => EXCLUDED_DIRS.has(part.toLowerCase()));
80
+ }
81
+ function basename(path) {
82
+ return path.slice(path.lastIndexOf('/') + 1);
83
+ }
84
+ function dirname(path) {
85
+ const i = path.lastIndexOf('/');
86
+ return i < 0 ? '' : path.slice(0, i);
87
+ }
88
+ function depth(path) {
89
+ return segments(path).length;
90
+ }
91
+ function escapeRegex(text) {
92
+ return text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
93
+ }
94
+ const LOGO_MODIFIER = '(?:\\d+(?:x\\d+)?|\\d+px|@?\\dx|light|dark|colou?r(?:ed)?|full|square|round(?:ed)?|mark|white|black|transparent|large|mono(?:chrome)?|text|horizontal|vertical|wordmark|primary|default|rounded)';
95
+ function logoNamePattern(repo) {
96
+ const name = escapeRegex(repo.toLowerCase());
97
+ return new RegExp(`^(?:${name}[-_ ]?)?(?:app[-_ ]?)?(?:logo|icon|logomark|logo[-_]mark)(?:[-_.@ ]?${LOGO_MODIFIER})*$`, 'i');
98
+ }
99
+ /** A size encoded in a file name (`icon-32`, `logo_16x16`), when there is one. */
100
+ function namedSize(name) {
101
+ const match = /(?:^|[-_.@x])(\d{2,4})(?:x\d{2,4})?(?:px)?(?:$|[-_.@])/i.exec(name);
102
+ return match ? Number(match[1]) : undefined;
103
+ }
104
+ const FASTLANE = /^(?:(.*)\/)?fastlane\/metadata\/android\/([^/]+)\/images\/(.+)$/;
105
+ const LOCALE_PREFERENCE = ['en-US', 'en-GB', 'en'];
106
+ function pickLocale(locales) {
107
+ for (const preferred of LOCALE_PREFERENCE)
108
+ if (locales.includes(preferred))
109
+ return preferred;
110
+ return [...locales].sort()[0];
111
+ }
112
+ /**
113
+ * The fastlane (F-Droid / Play) metadata of the repository: its icon
114
+ * and phone screenshots in one locale (en-US first). The shallowest
115
+ * fastlane directory wins when there are several.
116
+ */
117
+ export function findFastlane(files, maxScreenshots = 8) {
118
+ const byRoot = new Map();
119
+ for (const file of files) {
120
+ const match = FASTLANE.exec(file.path);
121
+ if (!match || isExcludedPath(file.path))
122
+ continue;
123
+ const root = match[1] ?? '';
124
+ const locale = match[2] ?? '';
125
+ const rest = match[3] ?? '';
126
+ const locales = byRoot.get(root) ?? new Map();
127
+ byRoot.set(root, locales);
128
+ const bucket = locales.get(locale) ?? { screenshots: [] };
129
+ locales.set(locale, bucket);
130
+ if (/^icon\.(png|jpe?g|webp)$/i.test(rest))
131
+ bucket.icon = file;
132
+ else if (/^phoneScreenshots\/[^/]+$/.test(rest) && SCREENSHOT_EXT.test(rest)) {
133
+ bucket.screenshots.push(file);
134
+ }
135
+ }
136
+ const roots = [...byRoot.keys()].sort((a, b) => depth(a) - depth(b) || a.localeCompare(b));
137
+ for (const root of roots) {
138
+ const locales = byRoot.get(root);
139
+ if (!locales)
140
+ continue;
141
+ const withContent = [...locales.entries()].filter(([, bucket]) => bucket.icon || bucket.screenshots.length > 0);
142
+ const locale = pickLocale(withContent.map(([name]) => name));
143
+ const bucket = locale ? locales.get(locale) : undefined;
144
+ if (!locale || !bucket)
145
+ continue;
146
+ const screenshots = [...bucket.screenshots]
147
+ .sort((a, b) => a.path.localeCompare(b.path, 'en', { numeric: true }))
148
+ .slice(0, maxScreenshots);
149
+ return { root, locale, ...(bucket.icon ? { icon: bucket.icon } : {}), screenshots };
150
+ }
151
+ return undefined;
152
+ }
153
+ /**
154
+ * Gradle build files of Android app modules, the ones next to a
155
+ * fastlane directory first. They hold the `applicationId` F-Droid
156
+ * lists the app under.
157
+ */
158
+ export function findGradleAppFiles(files, fastlaneRoot, max = 2) {
159
+ const all = files.filter((file) => {
160
+ if (isExcludedPath(file.path))
161
+ return false;
162
+ if (!/(^|\/)build\.gradle(\.kts)?$/.test(file.path))
163
+ return false;
164
+ const dir = dirname(file.path);
165
+ return basename(dir) === 'app' || /(^|\/)android(\/|$)/.test(dir);
166
+ });
167
+ // `applicationId` lives in the app module; a root build file is
168
+ // only worth reading when there is no `app/` module at all.
169
+ const appModules = all.filter((file) => basename(dirname(file.path)) === 'app');
170
+ const gradle = appModules.length > 0 ? appModules : all;
171
+ const near = (path) => fastlaneRoot !== undefined && (fastlaneRoot === '' || path.startsWith(`${fastlaneRoot}/`))
172
+ ? 0
173
+ : 1;
174
+ const isAppModule = (path) => (basename(dirname(path)) === 'app' ? 0 : 1);
175
+ return gradle
176
+ .sort((a, b) => near(a.path) - near(b.path) ||
177
+ isAppModule(a.path) - isAppModule(b.path) ||
178
+ depth(a.path) - depth(b.path) ||
179
+ a.path.localeCompare(b.path))
180
+ .slice(0, max);
181
+ }
182
+ /** Every `applicationId` a Gradle file declares (default config and flavors). */
183
+ export function parseGradleApplicationIds(text) {
184
+ const ids = new Set();
185
+ const pattern = /\bapplicationId\s*(?:=\s*)?\(?\s*["']([A-Za-z][\w]*(?:\.[A-Za-z_][\w]*)+)["']/g;
186
+ for (const match of text.matchAll(pattern))
187
+ if (match[1])
188
+ ids.add(match[1]);
189
+ return [...ids];
190
+ }
191
+ const METAINFO = /\.(metainfo|appdata)\.xml(\.in)?$/i;
192
+ /** AppStream metainfo files, shallowest first. */
193
+ export function findMetainfoFiles(files, max = 2) {
194
+ return files
195
+ .filter((file) => METAINFO.test(file.path) && !isExcludedPath(file.path))
196
+ .sort((a, b) => depth(a.path) - depth(b.path) || a.path.localeCompare(b.path))
197
+ .slice(0, max);
198
+ }
199
+ function decodeXml(text) {
200
+ return text
201
+ .replace(/<!\[CDATA\[([\s\S]*?)\]\]>/g, '$1')
202
+ .replace(/&amp;/g, '&')
203
+ .replace(/&lt;/g, '<')
204
+ .replace(/&gt;/g, '>')
205
+ .replace(/&quot;/g, '"')
206
+ .replace(/&apos;/g, "'")
207
+ .trim();
208
+ }
209
+ /** The app id, remote icons and screenshots an AppStream metainfo file declares. */
210
+ export function parseAppstream(text, fileName = '') {
211
+ const withoutComments = text.replace(/<!--[\s\S]*?-->/g, '');
212
+ const rawId = /<id(?:\s[^>]*)?>([^<]+)<\/id>/.exec(withoutComments)?.[1];
213
+ const fromFile = basename(fileName).replace(METAINFO, '');
214
+ const id = (rawId ? decodeXml(rawId) : fromFile).replace(/\.desktop$/, '') || undefined;
215
+ const icons = [];
216
+ for (const match of withoutComments.matchAll(/<icon\b([^>]*)>([^<]+)<\/icon>/g)) {
217
+ if (/type\s*=\s*["']remote["']/.test(match[1] ?? '') && match[2])
218
+ icons.push(decodeXml(match[2]));
219
+ }
220
+ const screenshots = [];
221
+ for (const shot of withoutComments.matchAll(/<screenshot\b[^>]*>([\s\S]*?)<\/screenshot>/g)) {
222
+ const images = [...(shot[1] ?? '').matchAll(/<image\b([^>]*)>([^<]+)<\/image>/g)];
223
+ const source = images.find((m) => !/type\s*=\s*["']thumbnail["']/.test(m[1] ?? ''));
224
+ const url = source?.[2] ?? images[0]?.[2];
225
+ if (url)
226
+ screenshots.push(decodeXml(url));
227
+ }
228
+ return {
229
+ ...(id && /^[\w.-]+$/.test(id) ? { id } : {}),
230
+ icons: [...new Set(icons)].filter((u) => /^https?:\/\//.test(u)),
231
+ screenshots: [...new Set(screenshots)].filter((u) => /^https?:\/\//.test(u)),
232
+ };
233
+ }
234
+ const MANIFEST = /(^|\/)(manifest\.json|manifest\.webmanifest|site\.webmanifest|[\w.-]+\.webmanifest)$/i;
235
+ /** Web app manifests under a web root (`public/`, `static/`, `web/`, …), shallowest first. */
236
+ export function findWebManifests(files, max = 2) {
237
+ return files
238
+ .filter((file) => {
239
+ if (!MANIFEST.test(file.path) || isExcludedPath(file.path))
240
+ return false;
241
+ if (/\.webmanifest$/i.test(file.path))
242
+ return true;
243
+ // `manifest.json` is also a browser-extension and tooling file
244
+ // name; only look at the ones in a web root.
245
+ return segments(file.path)
246
+ .slice(0, -1)
247
+ .some((part) => ['public', 'static', 'web', 'www', 'app'].includes(part.toLowerCase()));
248
+ })
249
+ .sort((a, b) => depth(a.path) - depth(b.path) || a.path.localeCompare(b.path))
250
+ .slice(0, max);
251
+ }
252
+ /**
253
+ * The best icon a web app manifest declares, resolved to a repository
254
+ * path: `/x.png` against the manifest's directory (the web root), a
255
+ * relative `src` against the same directory. Maskable-only and
256
+ * monochrome icons are skipped; SVG, then the largest size, wins.
257
+ */
258
+ export function pickManifestIcon(text, manifestPath) {
259
+ let json;
260
+ try {
261
+ json = JSON.parse(text);
262
+ }
263
+ catch {
264
+ return undefined;
265
+ }
266
+ const manifest = json;
267
+ if (!manifest || typeof manifest !== 'object' || 'manifest_version' in manifest)
268
+ return undefined;
269
+ if (!Array.isArray(manifest.icons))
270
+ return undefined;
271
+ const root = dirname(manifestPath);
272
+ let best;
273
+ for (const raw of manifest.icons) {
274
+ const icon = raw;
275
+ const src = typeof icon?.src === 'string' ? icon.src.split(/[?#]/)[0] : undefined;
276
+ if (!src || /^[a-z]+:/i.test(src) || src.startsWith('//'))
277
+ continue;
278
+ // Splash screens and tiles ride along in generated manifests.
279
+ if (!IMAGE_EXT.test(src) || EXCLUDED_NAME.test(basename(src)))
280
+ continue;
281
+ const purpose = typeof icon.purpose === 'string' ? icon.purpose.split(/\s+/) : ['any'];
282
+ if (!purpose.includes('any'))
283
+ continue;
284
+ const sizes = typeof icon.sizes === 'string' ? icon.sizes : '';
285
+ const largest = Math.max(0, ...sizes.split(/\s+/).map((s) => Number(/^(\d+)x\d+$/i.exec(s)?.[1] ?? 0)));
286
+ const score = /\.svg$/i.test(src) || sizes === 'any' ? 100_000 : largest;
287
+ const joined = src.startsWith('/') ? `${root}${src}` : `${root}/${src}`;
288
+ const path = normalizePath(joined);
289
+ if (!best || score > best.score)
290
+ best = { path, score };
291
+ }
292
+ return best?.path;
293
+ }
294
+ /** The path up to the first asset directory: the package a file belongs to. */
295
+ function packageRoot(path) {
296
+ const parts = segments(path).slice(0, -1);
297
+ const i = parts.findIndex((part) => ASSET_DIRS.has(part.toLowerCase()));
298
+ return parts.slice(0, i < 0 ? parts.length : i).join('/');
299
+ }
300
+ function normalizePath(path) {
301
+ const out = [];
302
+ for (const part of path.split('/')) {
303
+ if (part === '' || part === '.')
304
+ continue;
305
+ if (part === '..')
306
+ out.pop();
307
+ else
308
+ out.push(part);
309
+ }
310
+ return out.join('/');
311
+ }
312
+ /**
313
+ * Files that look like the app's own logo: `logo*` / `icon*` /
314
+ * `<repo>-logo*` PNG, SVG or WebP inside an asset directory
315
+ * (`assets/`, `public/`, `branding/`, …). Favicon-sized files, banners
316
+ * and anything under a dependency, docs or test directory are skipped.
317
+ * SVG first, then shallower paths.
318
+ */
319
+ export function findAssetLogos(files, repo, max = 3) {
320
+ const pattern = logoNamePattern(repo);
321
+ const matches = files.filter((file) => {
322
+ if (!IMAGE_EXT.test(file.path) || isExcludedPath(file.path))
323
+ return false;
324
+ const name = basename(file.path).replace(IMAGE_EXT, '');
325
+ if (EXCLUDED_NAME.test(name) || !pattern.test(name))
326
+ return false;
327
+ const size = namedSize(name);
328
+ if (size !== undefined && size < 128)
329
+ return false;
330
+ const dirs = segments(file.path).slice(0, -1);
331
+ return dirs.some((part) => ASSET_DIRS.has(part.toLowerCase()));
332
+ });
333
+ // The same file name in three or more sibling packages
334
+ // (`addons/*/resources/icon.png`, `apps/*/public/logo.svg`) is a
335
+ // plugin or package convention, not the app's logo.
336
+ const parents = new Map();
337
+ for (const file of matches) {
338
+ const name = basename(file.path).toLowerCase();
339
+ const set = parents.get(name) ?? new Set();
340
+ set.add(packageRoot(file.path));
341
+ parents.set(name, set);
342
+ }
343
+ return matches
344
+ .filter((file) => (parents.get(basename(file.path).toLowerCase())?.size ?? 0) < 3)
345
+ .sort((a, b) => {
346
+ const svg = (path) => (/\.svg$/i.test(path) ? 0 : 1);
347
+ return (svg(a.path) - svg(b.path) || depth(a.path) - depth(b.path) || a.path.localeCompare(b.path));
348
+ })
349
+ .slice(0, max);
350
+ }
351
+ // ── Release assets ─────────────────────────────────────────────────
352
+ const INSTALLABLE = [
353
+ [/\.apk$/i, 'android'],
354
+ [/\.ipa$/i, 'ios'],
355
+ [/\.(dmg|pkg)$/i, 'macos'],
356
+ [/\.(msi|msix|exe)$/i, 'windows'],
357
+ [/\.(appimage|deb|rpm|flatpak|snap)$/i, 'linux'],
358
+ ];
359
+ /** Assets that are not for end users even with an installable extension. */
360
+ const NOT_FOR_USERS = /debug|symbols|unsigned|uninstall|\.blockmap$/i;
361
+ /** Installable release assets grouped by platform, names sorted. */
362
+ export function installableAssets(names) {
363
+ const byPlatform = new Map();
364
+ for (const name of names) {
365
+ if (NOT_FOR_USERS.test(name))
366
+ continue;
367
+ const platform = INSTALLABLE.find(([pattern]) => pattern.test(name))?.[1];
368
+ if (!platform)
369
+ continue;
370
+ const list = byPlatform.get(platform) ?? [];
371
+ list.push(name);
372
+ byPlatform.set(platform, list);
373
+ }
374
+ for (const list of byPlatform.values())
375
+ list.sort();
376
+ return byPlatform;
377
+ }
378
+ const REPOLOGY_REPOS = {
379
+ homebrew: {
380
+ type: 'package-manager',
381
+ platform: 'macos',
382
+ label: 'Homebrew',
383
+ url: (n) => `https://formulae.brew.sh/formula/${n}`,
384
+ },
385
+ homebrew_casks: {
386
+ type: 'package-manager',
387
+ platform: 'macos',
388
+ label: 'Homebrew Cask',
389
+ url: (n) => `https://formulae.brew.sh/cask/${n}`,
390
+ },
391
+ aur: {
392
+ type: 'package-manager',
393
+ platform: 'linux',
394
+ label: 'AUR',
395
+ url: (n) => `https://aur.archlinux.org/packages/${n}`,
396
+ },
397
+ arch: {
398
+ type: 'package-manager',
399
+ platform: 'linux',
400
+ label: 'Arch Linux',
401
+ url: (n) => `https://archlinux.org/packages/?q=${n}`,
402
+ },
403
+ nix_unstable: {
404
+ type: 'package-manager',
405
+ platform: 'linux',
406
+ label: 'Nixpkgs',
407
+ url: (n) => `https://search.nixos.org/packages?channel=unstable&query=${n}`,
408
+ },
409
+ scoop: {
410
+ type: 'package-manager',
411
+ platform: 'windows',
412
+ label: 'Scoop',
413
+ url: (n) => `https://scoop.sh/#/apps?q=${n}`,
414
+ },
415
+ chocolatey: {
416
+ type: 'package-manager',
417
+ platform: 'windows',
418
+ label: 'Chocolatey',
419
+ url: (n) => `https://community.chocolatey.org/packages/${n}`,
420
+ },
421
+ winget: {
422
+ type: 'package-manager',
423
+ platform: 'windows',
424
+ label: 'winget',
425
+ url: (n) => `https://github.com/microsoft/winget-pkgs/tree/master/manifests/${n.charAt(0).toLowerCase()}/${n.replace(/\./g, '/')}`,
426
+ },
427
+ snapcraft: {
428
+ type: 'snapcraft',
429
+ platform: 'linux',
430
+ label: 'Snapcraft',
431
+ url: (n) => `https://snapcraft.io/${n}`,
432
+ },
433
+ flathub: {
434
+ type: 'flathub',
435
+ platform: 'linux',
436
+ label: 'Flathub',
437
+ url: (n) => `https://flathub.org/apps/${n}`,
438
+ },
439
+ fdroid: {
440
+ type: 'fdroid',
441
+ platform: 'android',
442
+ label: 'F-Droid',
443
+ url: (n) => `https://f-droid.org/packages/${n}/`,
444
+ },
445
+ };
446
+ /**
447
+ * One channel per package repository Grove knows how to link to
448
+ * (Homebrew, AUR, Nixpkgs, Scoop, winget, Chocolatey, Snapcraft,
449
+ * Flathub, F-Droid); every other repository Repology tracks is left
450
+ * out. Sorted by repository id.
451
+ */
452
+ export function repologyChannels(packages) {
453
+ const byRepo = new Map();
454
+ const sorted = [...packages].sort((a, b) => (a.repo ?? '').localeCompare(b.repo ?? '') ||
455
+ (a.srcname ?? a.binname ?? '').localeCompare(b.srcname ?? b.binname ?? ''));
456
+ for (const pkg of sorted) {
457
+ const repo = pkg.repo ?? '';
458
+ const known = REPOLOGY_REPOS[repo];
459
+ if (!known || byRepo.has(repo))
460
+ continue;
461
+ // AUR, Arch and Nixpkgs are searched by binary name; the others by source name.
462
+ const byBinary = repo === 'aur' || repo === 'arch' || repo === 'nix_unstable';
463
+ const name = byBinary ? (pkg.binname ?? pkg.srcname) : (pkg.srcname ?? pkg.binname);
464
+ if (!name || !/^[\w@.+-]+$/.test(name))
465
+ continue;
466
+ byRepo.set(repo, {
467
+ type: known.type,
468
+ platform: known.platform,
469
+ label: known.label,
470
+ url: known.url(name),
471
+ repository: repo,
472
+ packageName: name,
473
+ ...(pkg.version ? { version: pkg.version } : {}),
474
+ });
475
+ }
476
+ return [...byRepo.values()];
477
+ }
478
+ /** Compare a release tag with a package version, ignoring a leading `v`. */
479
+ export function sameVersion(tag, version) {
480
+ if (!tag || !version)
481
+ return false;
482
+ const clean = (v) => v
483
+ .trim()
484
+ .replace(/^v(?=\d)/i, '')
485
+ .toLowerCase();
486
+ return clean(tag) === clean(version) || clean(tag).endsWith(`-${clean(version)}`);
487
+ }
488
+ //# sourceMappingURL=candidate-discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"candidate-discovery.js","sourceRoot":"","sources":["../src/candidate-discovery.ts"],"names":[],"mappings":"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"}