(file, why)
| 205 | }; |
| 206 | |
| 207 | const rebuildFile = async (file, why) => { |
| 208 | if (!(await exists(file))) { |
| 209 | return { upserts: [], removals: removeFile(file), reports: [] }; |
| 210 | } |
| 211 | |
| 212 | const source = await readFile(file, "utf8"); |
| 213 | const sourceHash = hashSource(source); |
| 214 | if (fileHashes.get(file) === sourceHash) { |
| 215 | return { upserts: [], removals: [], reports: [] }; |
| 216 | } |
| 217 | |
| 218 | const realm = realmForFile(file); |
| 219 | const override = realm ? null : targetForOverride(file, targets); |
| 220 | if (!realm && !override) { |
| 221 | return { upserts: [], removals: [], reports: [] }; |
| 222 | } |
| 223 | if (override?.error) { |
| 224 | process.stderr.write(`FAIL ${why}: ${file}\n${override.error}\n\n`); |
| 225 | return { upserts: [], removals: [], reports: [] }; |
| 226 | } |
| 227 | |
| 228 | const loaded = await loadModule(file, source); |
| 229 | const upserts = []; |
| 230 | const reports = []; |
| 231 | const removals = []; |
| 232 | |
| 233 | if (loaded.error) { |
| 234 | const message = String(loaded.error.message || loaded.error).split( |
| 235 | "\n" |
| 236 | )[0]; |
| 237 | const owned = [...builders.values()].filter( |
| 238 | (builder) => builder.file === file |
| 239 | ); |
| 240 | /* A file that has never built still gets a failure report — a broken |
| 241 | file that reports nothing reads as "waiting" everywhere. Its exports |
| 242 | are unknowable before it evaluates, so the failure is pinned to one |
| 243 | well-known family. */ |
| 244 | const failed = owned.length |
| 245 | ? owned.map((builder) => builder.target) |
| 246 | : [ |
| 247 | override ?? { |
| 248 | scope: "realm", |
| 249 | realm, |
| 250 | niche: null, |
| 251 | family: "house", |
| 252 | level: null, |
| 253 | }, |
| 254 | ]; |
| 255 | for (const target of failed) { |
| 256 | const result = install(file, target, { |
| 257 | ok: false, |
| 258 | sourceHash, |
| 259 | realm: target.realm, |
| 260 | niche: target.niche ?? null, |
| 261 | family: target.family, |
| 262 | level: target.level ?? null, |
| 263 | errors: [message], |
| 264 | warnings: [], |
no test coverage detected