(rawUrl)
| 509 | } |
| 510 | |
| 511 | function scriptNameFromUrl(rawUrl) { |
| 512 | try { |
| 513 | const url = new URL(rawUrl) |
| 514 | const name = url.pathname.split('/').pop() ?? '' |
| 515 | return name.endsWith('.js') ? name : null |
| 516 | } catch { |
| 517 | const name = String(rawUrl).split('?')[0].split('/').pop() ?? '' |
| 518 | return name.endsWith('.js') ? name : null |
| 519 | } |
| 520 | } |
| 521 | |
| 522 | function budgetStatus(label, actual, budget) { |
| 523 | return { |