(contents: string, values: Env)
| 313 | } |
| 314 | |
| 315 | const upsertEnv = (contents: string, values: Env) => { |
| 316 | const names = Object.keys(values) |
| 317 | const seen = new Set<string>() |
| 318 | const lines = contents.split(/\r?\n/).map((line) => { |
| 319 | const match = line.match(/^\s*(?:export\s+)?([A-Za-z_][A-Za-z0-9_]*)\s*=/) |
| 320 | if (!match || !names.includes(match[1])) return line |
| 321 | seen.add(match[1]) |
| 322 | return `${match[1]}=${quote(values[match[1]])}` |
| 323 | }) |
| 324 | const missing = names.filter((name) => !seen.has(name)) |
| 325 | if (missing.length === 0) return lines.join("\n").replace(/\n*$/, "\n") |
| 326 | const prefix = lines.join("\n").trimEnd() |
| 327 | const block = [ |
| 328 | "", |
| 329 | "# Added by bun run setup:recording-env", |
| 330 | ...missing.map((name) => `${name}=${quote(values[name])}`), |
| 331 | ].join("\n") |
| 332 | return `${prefix}${block}\n` |
| 333 | } |
| 334 | |
| 335 | const providerRequiredStatus = (provider: Provider, fileEnv: Env) => { |
| 336 | const required = requiredVars(provider) |
no test coverage detected