@juangadm/pre-post 0.3.0 → 1.1.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 (153) hide show
  1. package/README.md +174 -233
  2. package/dist/baseline.d.ts +119 -0
  3. package/dist/baseline.d.ts.map +1 -0
  4. package/dist/baseline.js +316 -0
  5. package/dist/baseline.js.map +1 -0
  6. package/dist/bin/cli.js +243 -458
  7. package/dist/bin/cli.js.map +1 -1
  8. package/dist/browser.d.ts +68 -25
  9. package/dist/browser.d.ts.map +1 -1
  10. package/dist/browser.js +500 -105
  11. package/dist/browser.js.map +1 -1
  12. package/dist/capture.d.ts +1 -6
  13. package/dist/capture.d.ts.map +1 -1
  14. package/dist/capture.js +12 -36
  15. package/dist/capture.js.map +1 -1
  16. package/dist/commands/compare.d.ts +18 -0
  17. package/dist/commands/compare.d.ts.map +1 -0
  18. package/dist/commands/compare.js +82 -0
  19. package/dist/commands/compare.js.map +1 -0
  20. package/dist/commands/detect.d.ts +25 -0
  21. package/dist/commands/detect.d.ts.map +1 -0
  22. package/dist/commands/detect.js +22 -0
  23. package/dist/commands/detect.js.map +1 -0
  24. package/dist/commands/doctor.d.ts +42 -0
  25. package/dist/commands/doctor.d.ts.map +1 -0
  26. package/dist/commands/doctor.js +119 -0
  27. package/dist/commands/doctor.js.map +1 -0
  28. package/dist/commands/login.d.ts +6 -0
  29. package/dist/commands/login.d.ts.map +1 -0
  30. package/dist/commands/login.js +34 -0
  31. package/dist/commands/login.js.map +1 -0
  32. package/dist/commands/pr.d.ts +32 -0
  33. package/dist/commands/pr.d.ts.map +1 -0
  34. package/dist/commands/pr.js +259 -0
  35. package/dist/commands/pr.js.map +1 -0
  36. package/dist/commands/prune.d.ts +10 -0
  37. package/dist/commands/prune.d.ts.map +1 -0
  38. package/dist/commands/prune.js +13 -0
  39. package/dist/commands/prune.js.map +1 -0
  40. package/dist/comparison.d.ts +104 -0
  41. package/dist/comparison.d.ts.map +1 -0
  42. package/dist/comparison.js +236 -0
  43. package/dist/comparison.js.map +1 -0
  44. package/dist/config.d.ts +46 -0
  45. package/dist/config.d.ts.map +1 -0
  46. package/dist/config.js +82 -0
  47. package/dist/config.js.map +1 -0
  48. package/dist/deployments.d.ts +71 -0
  49. package/dist/deployments.d.ts.map +1 -0
  50. package/dist/deployments.js +204 -0
  51. package/dist/deployments.js.map +1 -0
  52. package/dist/diff-pool.d.ts +17 -0
  53. package/dist/diff-pool.d.ts.map +1 -0
  54. package/dist/diff-pool.js +92 -0
  55. package/dist/diff-pool.js.map +1 -0
  56. package/dist/diff-worker.d.ts +32 -0
  57. package/dist/diff-worker.d.ts.map +1 -0
  58. package/dist/diff-worker.js +39 -0
  59. package/dist/diff-worker.js.map +1 -0
  60. package/dist/diff.d.ts +47 -0
  61. package/dist/diff.d.ts.map +1 -0
  62. package/dist/diff.js +281 -0
  63. package/dist/diff.js.map +1 -0
  64. package/dist/doctor.d.ts +79 -0
  65. package/dist/doctor.d.ts.map +1 -0
  66. package/dist/doctor.js +138 -0
  67. package/dist/doctor.js.map +1 -0
  68. package/dist/errors.d.ts +38 -0
  69. package/dist/errors.d.ts.map +1 -0
  70. package/dist/errors.js +59 -0
  71. package/dist/errors.js.map +1 -0
  72. package/dist/git.d.ts +61 -0
  73. package/dist/git.d.ts.map +1 -0
  74. package/dist/git.js +182 -0
  75. package/dist/git.js.map +1 -0
  76. package/dist/github.d.ts +163 -0
  77. package/dist/github.d.ts.map +1 -0
  78. package/dist/github.js +411 -0
  79. package/dist/github.js.map +1 -0
  80. package/dist/index.d.ts +22 -23
  81. package/dist/index.d.ts.map +1 -1
  82. package/dist/index.js +17 -67
  83. package/dist/index.js.map +1 -1
  84. package/dist/landing.d.ts +48 -0
  85. package/dist/landing.d.ts.map +1 -0
  86. package/dist/landing.js +93 -0
  87. package/dist/landing.js.map +1 -0
  88. package/dist/pkg.d.ts +17 -0
  89. package/dist/pkg.d.ts.map +1 -0
  90. package/dist/pkg.js +49 -0
  91. package/dist/pkg.js.map +1 -0
  92. package/dist/report.d.ts +20 -0
  93. package/dist/report.d.ts.map +1 -0
  94. package/dist/report.js +130 -0
  95. package/dist/report.js.map +1 -0
  96. package/dist/routes/imports.d.ts +46 -0
  97. package/dist/routes/imports.d.ts.map +1 -0
  98. package/dist/routes/imports.js +208 -0
  99. package/dist/routes/imports.js.map +1 -0
  100. package/dist/routes/vite.d.ts +15 -0
  101. package/dist/routes/vite.d.ts.map +1 -0
  102. package/dist/routes/vite.js +130 -0
  103. package/dist/routes/vite.js.map +1 -0
  104. package/dist/routes.d.ts +65 -11
  105. package/dist/routes.d.ts.map +1 -1
  106. package/dist/routes.js +346 -141
  107. package/dist/routes.js.map +1 -1
  108. package/dist/run.d.ts +116 -0
  109. package/dist/run.d.ts.map +1 -0
  110. package/dist/run.js +316 -0
  111. package/dist/run.js.map +1 -0
  112. package/dist/sameness.d.ts +91 -0
  113. package/dist/sameness.d.ts.map +1 -0
  114. package/dist/sameness.js +157 -0
  115. package/dist/sameness.js.map +1 -0
  116. package/dist/sessions.d.ts +50 -0
  117. package/dist/sessions.d.ts.map +1 -0
  118. package/dist/sessions.js +80 -0
  119. package/dist/sessions.js.map +1 -0
  120. package/dist/shift.d.ts +67 -0
  121. package/dist/shift.d.ts.map +1 -0
  122. package/dist/shift.js +184 -0
  123. package/dist/shift.js.map +1 -0
  124. package/dist/types.d.ts +179 -68
  125. package/dist/types.d.ts.map +1 -1
  126. package/dist/types.js +1 -0
  127. package/dist/types.js.map +1 -1
  128. package/dist/url.d.ts +12 -0
  129. package/dist/url.d.ts.map +1 -0
  130. package/dist/url.js +30 -0
  131. package/dist/url.js.map +1 -0
  132. package/dist/viewport.d.ts +6 -1
  133. package/dist/viewport.d.ts.map +1 -1
  134. package/dist/viewport.js +13 -7
  135. package/dist/viewport.js.map +1 -1
  136. package/package.json +21 -14
  137. package/skill/SKILL.md +56 -221
  138. package/dist/clipboard.d.ts +0 -9
  139. package/dist/clipboard.d.ts.map +0 -1
  140. package/dist/clipboard.js +0 -26
  141. package/dist/clipboard.js.map +0 -1
  142. package/dist/upload.d.ts +0 -39
  143. package/dist/upload.d.ts.map +0 -1
  144. package/dist/upload.js +0 -159
  145. package/dist/upload.js.map +0 -1
  146. package/dist/video.d.ts +0 -19
  147. package/dist/video.d.ts.map +0 -1
  148. package/dist/video.js +0 -263
  149. package/dist/video.js.map +0 -1
  150. package/skill/scripts/adapters/0x0st.sh +0 -36
  151. package/skill/scripts/adapters/blob.sh +0 -55
  152. package/skill/scripts/adapters/git-native.sh +0 -51
  153. package/skill/scripts/upload-and-copy.sh +0 -230
package/dist/routes.js CHANGED
@@ -1,174 +1,379 @@
1
1
  /**
2
- * Route detection from git diff output.
3
- * Maps changed files to affected UI routes.
2
+ * Route detection: which pages does this branch visually affect?
3
+ *
4
+ * 1. Changed files = diff against the merge base with the default branch,
5
+ * plus staged, unstaged, and untracked files.
6
+ * 2. Pick the app root that owns most of those files (monorepo aware).
7
+ * 3. Framework adapter: direct file → route rules, plus the route entry files.
8
+ * 4. Import graph: any changed file that a page imports, directly or
9
+ * transitively, marks that page.
10
+ * 5. Dedupe, rank by confidence, cap, and substitute samples for dynamic routes.
4
11
  */
5
- import { execSync } from 'child_process';
6
12
  import fs from 'fs';
7
13
  import path from 'path';
8
14
  import { detectAppRouterRoutes, detectPagesRouterRoutes } from './routes/nextjs.js';
9
15
  import { detectGenericRoutes } from './routes/generic.js';
10
- const FRAMEWORK_SCAN_DEPTH = 2;
11
- const SKIP_SCAN_DIRS = new Set([
12
- '.git',
13
- '.next',
14
- '.turbo',
15
- 'node_modules',
16
- 'dist',
17
- 'build',
18
- 'coverage',
19
- ]);
20
- /**
21
- * Get changed files from git diff.
22
- * Returns paths relative to the repo root.
23
- */
24
- export function getChangedFiles(diffTarget, cwd = process.cwd()) {
25
- const target = diffTarget || 'HEAD';
26
- const files = new Set();
27
- runGitNameOnly(`diff --name-only ${target}`, cwd).forEach((file) => files.add(file));
28
- runGitNameOnly('diff --name-only --cached', cwd).forEach((file) => files.add(file));
29
- runGitNameOnly('diff --name-only', cwd).forEach((file) => files.add(file));
30
- runGitNameOnly('ls-files --others --exclude-standard', cwd).forEach((file) => files.add(file));
31
- return Array.from(files);
16
+ import { buildImportGraph, findAffectedEntries, readAliases, walkSourceFiles, toPosix, SKIP_DIRS } from './routes/imports.js';
17
+ import { viteRouteEntries, isViteApp } from './routes/vite.js';
18
+ import { changedFiles as gitChangedFiles, repoRoot as gitRepoRoot, requireBase } from './git.js';
19
+ import { devScript, hasDependency, readPackage } from './pkg.js';
20
+ import { CONFIG_DEFAULTS, CONFIG_FILENAME } from './config.js';
21
+ const NEXT_APP_PAGE = /^app\/(.+\/)?page\.(tsx|ts|jsx|js|mdx|md)$/;
22
+ const NEXT_PAGES_HIGH = /^pages\/(?!api\/|_)(.+)\.(tsx|ts|jsx|js|mdx|md)$/;
23
+ const NEXT_PAGE_FILE = /^(page|layout)\.(tsx|ts|jsx|js|mdx)$/;
24
+ const PAGES_INDEX_FILE = /^(index|_app|_document)\.(tsx|ts|jsx|js|mdx)$/;
25
+ function stripSrc(rel) {
26
+ return rel.replace(/^src\//, '');
32
27
  }
33
- /**
34
- * Auto-detect the framework used in the project.
35
- */
36
- export function detectFramework(rootDir) {
37
- const dir = rootDir || process.cwd();
38
- const candidateRoots = collectCandidateRoots(dir, FRAMEWORK_SCAN_DEPTH);
39
- for (const root of candidateRoots) {
40
- if (hasNextAppRouter(root))
41
- return 'nextjs-app';
28
+ function hasNextConfig(root) {
29
+ return ['next.config.js', 'next.config.mjs', 'next.config.ts', 'next-env.d.ts'].some(f => fs.existsSync(path.join(root, f)));
30
+ }
31
+ /** Does `dir` contain a file matching `pattern` within `depth` levels? */
32
+ function containsFile(dir, pattern, depth) {
33
+ let entries;
34
+ try {
35
+ entries = fs.readdirSync(dir, { withFileTypes: true });
42
36
  }
43
- for (const root of candidateRoots) {
44
- if (hasNextPagesRouter(root))
45
- return 'nextjs-pages';
37
+ catch {
38
+ return false;
39
+ }
40
+ if (entries.some(e => e.isFile() && pattern.test(e.name)))
41
+ return true;
42
+ if (depth === 0)
43
+ return false;
44
+ return entries.some(e => e.isDirectory() && !SKIP_DIRS.has(e.name) && containsFile(path.join(dir, e.name), pattern, depth - 1));
45
+ }
46
+ function appDir(root) {
47
+ for (const d of [path.join(root, 'app'), path.join(root, 'src', 'app')])
48
+ if (fs.existsSync(d))
49
+ return d;
50
+ return null;
51
+ }
52
+ function pagesDir(root) {
53
+ for (const d of [path.join(root, 'pages'), path.join(root, 'src', 'pages')])
54
+ if (fs.existsSync(d))
55
+ return d;
56
+ return null;
57
+ }
58
+ /** Entry files under a Next.js router directory, mapped by a regex-first filter. */
59
+ function nextEntries(appRoot, files, dirName, pattern, rule) {
60
+ const entries = new Map();
61
+ const base = fs.existsSync(path.join(appRoot, 'src', dirName)) ? path.join(appRoot, 'src') : appRoot;
62
+ const prefix = path.join(base, dirName) + path.sep;
63
+ for (const file of files) {
64
+ if (!file.startsWith(prefix))
65
+ continue;
66
+ const rel = toPosix(path.relative(base, file));
67
+ if (!pattern.test(rel))
68
+ continue;
69
+ const route = rule([rel])[0];
70
+ if (route)
71
+ entries.set(file, route.path);
46
72
  }
47
- return 'generic';
73
+ return entries;
74
+ }
75
+ const FRAMEWORKS = [
76
+ {
77
+ name: 'nextjs-app',
78
+ matches: root => {
79
+ const dir = appDir(root);
80
+ if (!dir)
81
+ return false;
82
+ return hasDependency(root, 'next') || hasNextConfig(root) || containsFile(dir, NEXT_PAGE_FILE, 4);
83
+ },
84
+ normalize: stripSrc,
85
+ directRoutes: detectAppRouterRoutes,
86
+ routeEntries: (appRoot, files) => nextEntries(appRoot, files, 'app', NEXT_APP_PAGE, detectAppRouterRoutes),
87
+ },
88
+ {
89
+ name: 'nextjs-pages',
90
+ matches: root => {
91
+ const dir = pagesDir(root);
92
+ if (!dir || hasDependency(root, 'vite'))
93
+ return false;
94
+ return hasDependency(root, 'next') || hasNextConfig(root) || containsFile(dir, PAGES_INDEX_FILE, 1);
95
+ },
96
+ normalize: stripSrc,
97
+ directRoutes: detectPagesRouterRoutes,
98
+ routeEntries: (appRoot, files) => nextEntries(appRoot, files, 'pages', NEXT_PAGES_HIGH, detectPagesRouterRoutes),
99
+ },
100
+ {
101
+ name: 'vite',
102
+ matches: isViteApp,
103
+ normalize: rel => rel,
104
+ directRoutes: detectGenericRoutes,
105
+ routeEntries: viteRouteEntries,
106
+ },
107
+ {
108
+ name: 'generic',
109
+ matches: () => true,
110
+ normalize: rel => rel,
111
+ directRoutes: detectGenericRoutes,
112
+ routeEntries: () => new Map(),
113
+ },
114
+ ];
115
+ function adapterFor(name) {
116
+ return FRAMEWORKS.find(f => f.name === name) ?? FRAMEWORKS[FRAMEWORKS.length - 1];
48
117
  }
49
118
  /**
50
- * Detect routes affected by changed files.
51
- * Main entry point for route detection.
119
+ * Does this directory hold an app whose routes are worth detecting?
120
+ *
121
+ * A dev script is the test baseline.ts applies before serving a base commit; a
122
+ * recognised framework counts too, since an app can be captured from a
123
+ * deployment without ever being served here. Both are stricter than "owns some
124
+ * changed files", which is the point: counting alone once picked this repo's
125
+ * tests/fixtures over its marketing site by a single file and then reported
126
+ * routes for a directory nothing can serve.
52
127
  */
53
- export function detectRoutes(changedFiles, options = {}) {
54
- if (changedFiles.length === 0)
55
- return [];
56
- const framework = options.framework || detectFramework();
57
- let routes;
58
- switch (framework) {
59
- case 'nextjs-app':
60
- routes = detectAppRouterRoutes(changedFiles);
61
- break;
62
- case 'nextjs-pages':
63
- routes = detectPagesRouterRoutes(changedFiles);
64
- break;
65
- case 'generic':
66
- default:
67
- routes = detectGenericRoutes(changedFiles);
68
- break;
69
- }
70
- // Deduplicate by path — keep highest confidence
71
- routes = deduplicateRoutes(routes);
72
- // Sort by confidence (high → medium → low)
73
- const confidenceOrder = { high: 0, medium: 1, low: 2 };
74
- routes.sort((a, b) => confidenceOrder[a.confidence] - confidenceOrder[b.confidence]);
75
- // Cap at maxRoutes
76
- const maxRoutes = options.maxRoutes ?? 5;
77
- if (routes.length > maxRoutes) {
78
- const originalCount = routes.length;
79
- routes = routes.slice(0, maxRoutes);
80
- // Add a note about truncation by keeping only the top N
81
- console.warn(`Detected ${originalCount} routes, capping at ${maxRoutes}. Use --max-routes to increase.`);
82
- }
83
- return routes;
128
+ export function isServableApp(root) {
129
+ return devScript(root) !== null || frameworkForRoot(root) !== 'generic';
84
130
  }
85
131
  /**
86
- * Deduplicate routes by path, keeping the highest confidence entry.
132
+ * Is this directory a package at all, rather than a folder that merely looks
133
+ * like one?
134
+ *
135
+ * findAppRoots accepts any directory holding `app/` or `pages/`, which is how
136
+ * this repo's own tests/fixtures — a pile of static HTML under pages/ with no
137
+ * package.json — became a candidate and, on a diff dominated by fixture files,
138
+ * the winner. Declaring a package (or matching a real framework) is the line
139
+ * between an app and a directory shaped like one.
87
140
  */
88
- function deduplicateRoutes(routes) {
141
+ export function isAppLike(root) {
142
+ return readPackage(root) !== null || frameworkForRoot(root) !== 'generic';
143
+ }
144
+ export function frameworkForRoot(root) {
145
+ return FRAMEWORKS.find(f => f.matches(root)).name;
146
+ }
147
+ // ============================================================
148
+ // App roots
149
+ // ============================================================
150
+ const APP_SCAN_DEPTH = 3;
151
+ /** Directories (depth ≤ 3) that look like an app: package.json, or app/ pages/ route folders. */
152
+ export function findAppRoots(baseDir) {
153
+ const roots = [];
154
+ const walk = (dir, depth) => {
155
+ // A package.json marks an app; so do app/ or pages/ route folders, except inside src/
156
+ // (src/app belongs to the package one level up).
157
+ const isSrc = path.basename(dir) === 'src';
158
+ if (fs.existsSync(path.join(dir, 'package.json')) || (!isSrc && (appDir(dir) || pagesDir(dir))))
159
+ roots.push(dir);
160
+ if (depth === 0)
161
+ return;
162
+ let entries;
163
+ try {
164
+ entries = fs.readdirSync(dir, { withFileTypes: true });
165
+ }
166
+ catch {
167
+ return;
168
+ }
169
+ for (const entry of entries) {
170
+ if (entry.isDirectory() && !SKIP_DIRS.has(entry.name) && !entry.name.startsWith('.')) {
171
+ walk(path.join(dir, entry.name), depth - 1);
172
+ }
173
+ }
174
+ };
175
+ walk(baseDir, APP_SCAN_DEPTH);
176
+ return roots;
177
+ }
178
+ /**
179
+ * Auto-detect the framework used in the project: the most specific framework
180
+ * any app root matches, in adapter order.
181
+ */
182
+ export function detectFramework(rootDir) {
183
+ const found = findAppRoots(rootDir || process.cwd()).map(frameworkForRoot);
184
+ return FRAMEWORKS.find(f => found.includes(f.name))?.name ?? 'generic';
185
+ }
186
+ // ============================================================
187
+ // Ranking
188
+ // ============================================================
189
+ const CONFIDENCE_ORDER = { high: 0, medium: 1, low: 2 };
190
+ export function deduplicateRoutes(routes) {
89
191
  const byPath = new Map();
90
- const confidenceOrder = { high: 0, medium: 1, low: 2 };
91
192
  for (const route of routes) {
92
193
  const existing = byPath.get(route.path);
93
- if (!existing || confidenceOrder[route.confidence] < confidenceOrder[existing.confidence]) {
194
+ if (!existing || CONFIDENCE_ORDER[route.confidence] < CONFIDENCE_ORDER[existing.confidence]) {
94
195
  byPath.set(route.path, route);
95
196
  }
96
197
  }
97
198
  return Array.from(byPath.values());
98
199
  }
99
- function runGitNameOnly(command, cwd) {
200
+ function rankAndCap(routes, maxRoutes, warn) {
201
+ let out = deduplicateRoutes(routes);
202
+ out.sort((a, b) => CONFIDENCE_ORDER[a.confidence] - CONFIDENCE_ORDER[b.confidence] || a.path.localeCompare(b.path));
203
+ if (out.length > maxRoutes) {
204
+ const original = out.length;
205
+ out = out.slice(0, maxRoutes);
206
+ warn?.(`Detected ${original} routes, capping at ${maxRoutes}. Use --max-routes to increase.`);
207
+ }
208
+ return out;
209
+ }
210
+ export function isDynamicRoute(route) {
211
+ return /[[\]:*]/.test(route);
212
+ }
213
+ /** Apply a sample URL for a dynamic route; returns the route unchanged when static. */
214
+ export function resolveSample(route, samples = {}) {
215
+ return samples[route] ?? route;
216
+ }
217
+ // ============================================================
218
+ // File-list API (framework rules only, no import graph)
219
+ // ============================================================
220
+ export function getChangedFiles(diffTarget, cwd = process.cwd()) {
221
+ // requireBase throws NeedsHumanError when the base cannot be established;
222
+ // that has to travel, because the alternative is an empty list that reads
223
+ // as "nothing changed".
224
+ const target = diffTarget ?? requireBase(cwd).sha;
100
225
  try {
101
- const output = execSync(`git ${command}`, {
102
- encoding: 'utf-8',
103
- stdio: ['pipe', 'pipe', 'pipe'],
104
- cwd,
105
- }).trim();
106
- return output ? output.split('\n').filter(Boolean) : [];
226
+ return gitChangedFiles(cwd, target);
107
227
  }
108
228
  catch {
109
229
  return [];
110
230
  }
111
231
  }
112
- function collectCandidateRoots(baseDir, maxDepth) {
113
- const roots = [baseDir];
114
- function walk(dir, depth) {
115
- if (depth === 0)
116
- return;
117
- let entries;
118
- try {
119
- entries = fs.readdirSync(dir, { withFileTypes: true });
120
- }
121
- catch {
122
- return;
123
- }
124
- for (const entry of entries) {
125
- if (!entry.isDirectory())
126
- continue;
127
- if (SKIP_SCAN_DIRS.has(entry.name))
128
- continue;
129
- const child = path.join(dir, entry.name);
130
- roots.push(child);
131
- walk(child, depth - 1);
232
+ export function detectRoutes(changedFiles, options = {}) {
233
+ if (changedFiles.length === 0)
234
+ return [];
235
+ const adapter = adapterFor(options.framework || detectFramework());
236
+ return rankAndCap(adapter.directRoutes(changedFiles.map(adapter.normalize)), options.maxRoutes ?? CONFIG_DEFAULTS.maxRoutes, options.log);
237
+ }
238
+ /** For a layout-only route (no page of its own), the closest static page beneath it. */
239
+ function nearestPageRoute(route, knownRoutes) {
240
+ if (knownRoutes.includes(route))
241
+ return route;
242
+ const prefix = route === '/' ? '/' : route + '/';
243
+ return knownRoutes.find(r => r.startsWith(prefix) && !isDynamicRoute(r)) ?? null;
244
+ }
245
+ export function detectRoutesForRepo(options = {}) {
246
+ const started = Date.now();
247
+ const root = gitRepoRoot(options.cwd || process.cwd());
248
+ const config = options.config || {};
249
+ const maxRoutes = options.maxRoutes ?? config.maxRoutes ?? CONFIG_DEFAULTS.maxRoutes;
250
+ const ignore = (config.ignore || []).map(p => p.replace(/^\.?\//, ''));
251
+ // Establish the base before reading the diff. Getting this wrong is silent:
252
+ // diffing HEAD reports only uncommitted work, so a branch whose changes are
253
+ // committed — every branch in a shallow CI or sandbox checkout — comes back
254
+ // empty and the run reports no visual changes.
255
+ const base = options.changedFiles
256
+ ? null
257
+ : requireBase(root, { explicit: options.diffTarget, log: options.log });
258
+ const allChanged = (options.changedFiles ?? gitChangedFiles(root, base.sha))
259
+ // Our own config file is written mid-run; it never affects which routes changed.
260
+ .filter(f => f !== CONFIG_FILENAME)
261
+ .filter(f => !ignore.some(prefix => f === prefix || f.startsWith(prefix.replace(/\/?$/, '/'))));
262
+ // Choose the app root the PR is about. The repo root contains every changed
263
+ // file, so it would always match at least as many as any app nested inside
264
+ // it; score the nested app roots only, and fall back to the repo root when
265
+ // none of them owns a changed file.
266
+ //
267
+ // Servability outranks file count. Counting alone once picked this repo's
268
+ // own tests/fixtures over its marketing site by a single file, and then
269
+ // reported routes for a directory nothing can serve. A directory that cannot
270
+ // be served is not the app a branch changed, however much of the diff lands
271
+ // in it; among candidates that can be served, the diff decides, deepest
272
+ // first on a tie.
273
+ const owners = findAppRoots(root)
274
+ .map(dir => {
275
+ const rel = toPosix(path.relative(root, dir));
276
+ return { dir, count: rel ? allChanged.filter(f => f.startsWith(rel + '/')).length : 0 };
277
+ })
278
+ // Probing the filesystem is the expensive part, so only candidates that own
279
+ // some of the diff pay for it.
280
+ .filter(c => c.count > 0)
281
+ .map(c => {
282
+ const framework = frameworkForRoot(c.dir);
283
+ return {
284
+ ...c,
285
+ framework,
286
+ appLike: readPackage(c.dir) !== null || framework !== 'generic',
287
+ servable: devScript(c.dir) !== null || framework !== 'generic',
288
+ };
289
+ })
290
+ // A folder shaped like an app is not one; see isAppLike.
291
+ .filter(c => c.appLike)
292
+ .sort((a, b) => b.count - a.count || b.dir.length - a.dir.length);
293
+ // Among roots that own a comparable share of the diff, prefer one that can be
294
+ // served; outside that band the diff wins outright.
295
+ //
296
+ // Servability breaks near-ties, which is the case it was added for: this
297
+ // repo's tests/fixtures beat site/ by a single file and produced routes for a
298
+ // directory nothing can serve. It must not override a clear majority, though
299
+ // — a deployed or --before/--after comparison never serves anything locally,
300
+ // so a static app owning most of the diff still has the routes that changed,
301
+ // and handing detection to an incidental package with a start script would
302
+ // discard them.
303
+ const CONTENDER_SHARE = 0.5;
304
+ const leader = owners[0]?.count ?? 0;
305
+ const contenders = owners.filter(c => c.count >= leader * CONTENDER_SHARE);
306
+ const winner = contenders.find(c => c.servable) ?? owners[0];
307
+ const appRoot = winner?.dir ?? root;
308
+ // The winner's framework was already resolved while scoring; frameworkForRoot
309
+ // walks directories, so don't ask twice.
310
+ const adapter = adapterFor(options.framework || winner?.framework || frameworkForRoot(appRoot));
311
+ const appPrefix = toPosix(path.relative(root, appRoot));
312
+ const appRel = allChanged
313
+ .filter(f => !appPrefix || f.startsWith(appPrefix + '/'))
314
+ .map(f => (appPrefix ? f.slice(appPrefix.length + 1) : f));
315
+ const routes = [];
316
+ // Always-on routes from config.
317
+ for (const r of config.routes || []) {
318
+ routes.push({ path: r, sourceFile: '.pre-post.json', confidence: 'high', reason: 'Configured route' });
319
+ }
320
+ // Direct framework rules.
321
+ routes.push(...adapter.directRoutes(appRel.map(adapter.normalize)));
322
+ // Import graph: changed files → pages that import them. One walk serves both.
323
+ if (appRel.length) {
324
+ const files = walkSourceFiles(appRoot);
325
+ const aliases = readAliases(appRoot);
326
+ const entries = adapter.routeEntries(appRoot, files, aliases);
327
+ if (entries.size) {
328
+ const graph = buildImportGraph(appRoot, { files, aliases });
329
+ const changedAbs = appRel.map(f => path.join(appRoot, f)).filter(f => graph.files.has(f));
330
+ const affected = findAffectedEntries(graph, changedAbs, f => entries.has(f));
331
+ for (const [entry, { via, depth }] of affected) {
332
+ const viaRel = toPosix(path.relative(appRoot, via));
333
+ const entryRel = toPosix(path.relative(appRoot, entry));
334
+ routes.push({
335
+ path: entries.get(entry),
336
+ sourceFile: viaRel,
337
+ confidence: depth === 0 ? 'high' : depth <= 2 ? 'medium' : 'low',
338
+ reason: depth === 0 ? 'Page file changed' : `${entryRel} imports ${viaRel}${depth > 1 ? ` (${depth} hops)` : ''}`,
339
+ });
340
+ }
341
+ // Layout/special-file routes may not have a page of their own; snap them to the nearest page.
342
+ const known = Array.from(new Set(entries.values())).sort((a, b) => a.length - b.length);
343
+ const knownSet = new Set(known);
344
+ for (const r of routes) {
345
+ if (!knownSet.has(r.path)) {
346
+ const snapped = nearestPageRoute(r.path, known);
347
+ if (snapped)
348
+ r.path = snapped;
349
+ }
350
+ }
132
351
  }
133
352
  }
134
- walk(baseDir, maxDepth);
135
- return roots;
136
- }
137
- function hasNextAppRouter(rootDir) {
138
- const appDir = path.join(rootDir, 'app');
139
- if (!fs.existsSync(appDir))
140
- return false;
141
- return hasAnyFile(appDir, [
142
- 'page.tsx',
143
- 'page.ts',
144
- 'page.jsx',
145
- 'page.js',
146
- 'layout.tsx',
147
- 'layout.ts',
148
- 'layout.jsx',
149
- 'layout.js',
150
- ]);
151
- }
152
- function hasNextPagesRouter(rootDir) {
153
- const pagesDir = path.join(rootDir, 'pages');
154
- if (!fs.existsSync(pagesDir))
155
- return false;
156
- return hasAnyFile(pagesDir, [
157
- 'index.tsx',
158
- 'index.ts',
159
- 'index.jsx',
160
- 'index.js',
161
- '_app.tsx',
162
- '_app.ts',
163
- '_app.jsx',
164
- '_app.js',
165
- '_document.tsx',
166
- '_document.ts',
167
- '_document.jsx',
168
- '_document.js',
169
- ]);
170
- }
171
- function hasAnyFile(dir, filenames) {
172
- return filenames.some((filename) => fs.existsSync(path.join(dir, filename)));
353
+ // Fallback: something changed in the app but nothing mapped → home page, low confidence.
354
+ if (routes.length === 0 && appRel.length > 0) {
355
+ routes.push({ path: '/', sourceFile: appRel[0], confidence: 'low', reason: 'No route mapping found; defaulting to /' });
356
+ }
357
+ // Dynamic routes: use samples or skip.
358
+ const samples = config.samples || {};
359
+ const skippedDynamic = new Set();
360
+ const resolved = [];
361
+ for (const r of deduplicateRoutes(routes)) {
362
+ if (!isDynamicRoute(r.path))
363
+ resolved.push(r);
364
+ else if (samples[r.path])
365
+ resolved.push({ ...r, reason: `${r.reason} (sample: ${samples[r.path]})` });
366
+ else
367
+ skippedDynamic.add(r.path);
368
+ }
369
+ return {
370
+ framework: adapter.name,
371
+ appRoot,
372
+ changedFiles: allChanged,
373
+ routes: rankAndCap(resolved, maxRoutes, options.log),
374
+ skippedDynamic: Array.from(skippedDynamic),
375
+ base,
376
+ durationMs: Date.now() - started,
377
+ };
173
378
  }
174
379
  //# sourceMappingURL=routes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"routes.js","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"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"}