@cronwatch/sdk 0.12.1 → 0.12.3

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.
package/dist/index.cjs CHANGED
@@ -1040,6 +1040,10 @@ function staticAsset(path, base) {
1040
1040
  return Object.hasOwn(ICONS, path) ? ICONS[path]() : null;
1041
1041
  }
1042
1042
 
1043
+ // src/version.ts
1044
+ var VERSION = "0.12.3";
1045
+ var API_VERSION = 1;
1046
+
1043
1047
  // src/routes/timeline.ts
1044
1048
  var HOUR = 36e5;
1045
1049
  var DAY = 24 * HOUR;
@@ -1350,6 +1354,7 @@ function weekRunsLimit(job, now) {
1350
1354
 
1351
1355
  // src/routes/html.ts
1352
1356
  var h = escapeHtml;
1357
+ var VERSION_LINK = `<a class="version" href="https://github.com/phillips-jon/cronwatch/blob/main/CHANGELOG.md">@cronwatch/sdk ${VERSION}</a>`;
1353
1358
  var CSS = `
1354
1359
  :root{color-scheme:light dark;--paper:#f4f4f5;--sheet:#fff;--sunk:#fafafa;--rule:#e4e4e7;--rule-2:#d4d4d8;--tick:#909098;--ink:#000;--body:#18181b;--muted:#71717a;--ok:#15803d;--warn:#a16207;--bad:#b91c1c;--serif:"Newsreader",ui-serif,Georgia,Cambria,"Times New Roman",serif;--mono:"IBM Plex Mono",ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;--who:200px}
1355
1360
  @media(prefers-color-scheme:dark){:root:not([data-theme=light]){--paper:#09090b;--sheet:#111113;--sunk:#18181b;--rule:#27272a;--rule-2:#3f3f46;--tick:#66666f;--ink:#fff;--body:#e4e4e7;--muted:#a1a1aa;--ok:#4ade80;--warn:#fbbf24;--bad:#f87171}}
@@ -1367,14 +1372,14 @@ code,pre,.mono{font-family:var(--mono)}
1367
1372
  .brand .crumb{font:500 15px/1.2 var(--mono);color:var(--body);overflow-wrap:anywhere}.brand .slash{color:var(--rule-2);font-weight:400}
1368
1373
  .actions{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
1369
1374
  .meta{font:400 12px/1.4 var(--mono);color:var(--muted)}
1370
- button,select,details.confirm>summary{font:500 12.5px/1 var(--mono);color:var(--ink);background:var(--sheet);border:1px solid var(--rule-2);border-radius:3px;padding:8px 11px;cursor:pointer}
1371
- select{padding:7px 8px}
1372
- button:hover,select:hover,details.confirm>summary:hover{border-color:var(--muted)}
1373
- button.primary{background:var(--ink);border-color:var(--ink);color:var(--sheet)}button.primary:hover{opacity:.86}
1375
+ button,a.button,details.confirm>summary{font:500 12.5px/1 var(--mono);color:var(--ink);background:var(--sheet);border:1px solid var(--rule-2);border-radius:3px;height:32px;padding:0 11px;cursor:pointer}
1376
+ a.button{display:inline-flex;align-items:center;text-decoration:none}
1377
+ button:hover,a.button:hover,details.confirm>summary:hover{border-color:var(--muted)}
1378
+ button.primary{background:var(--ink);border-color:var(--ink);color:var(--sheet)}button.primary:hover{opacity:.86}button.danger{color:var(--bad)}button.danger:hover{border-color:var(--bad)}
1374
1379
  form.inline{display:inline-flex;align-items:center;gap:6px;margin:0}
1375
- details.confirm{display:inline-flex;align-items:center;gap:8px;margin:0}details.confirm>summary{list-style:none;display:inline-block}
1380
+ details.confirm{display:inline-flex;align-items:center;flex-wrap:wrap;gap:8px;margin:0}details.confirm>summary{list-style:none;display:inline-flex;align-items:center}
1376
1381
  details.confirm>summary::-webkit-details-marker{display:none}details.confirm[open]>summary{border-color:var(--muted)}
1377
- details.confirm form{margin-left:8px;font-size:14px;color:var(--muted)}
1382
+ details.confirm form{flex-wrap:wrap;font-size:14px;color:var(--muted)}.delete details{margin-top:16px}
1378
1383
  .sec{display:grid;grid-template-columns:150px minmax(0,1fr);gap:10px 40px;padding:30px 0;border-top:1px solid var(--rule)}
1379
1384
  .top+main>.sec:first-child{border-top:0}
1380
1385
  .sec>h2{margin:0;font:500 11px/1.5 var(--mono);letter-spacing:.12em;text-transform:uppercase;color:var(--muted);padding-top:5px}
@@ -1423,8 +1428,8 @@ dl.def dd{margin:0;font:400 13.5px/1.7 var(--mono);color:var(--body);overflow-wr
1423
1428
  .message p{margin:14px auto 0;max-width:52ch;color:var(--muted);text-wrap:pretty}
1424
1429
  .signin{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:8px;margin:28px auto 0;max-width:420px}
1425
1430
  .signin label{font:500 11px/1.4 var(--mono);letter-spacing:.08em;text-transform:uppercase;color:var(--muted)}
1426
- .signin input{flex:1 1 180px;min-width:0;font:400 16px/1.2 var(--mono);color:var(--ink);background:var(--sheet);border:1px solid var(--rule-2);border-radius:3px;padding:8px 10px}
1427
- footer{display:flex;flex-wrap:wrap;gap:6px 18px;padding:20px 0 40px;border-top:1px solid var(--rule);font:400 12px/1.5 var(--mono);color:var(--muted)}
1431
+ .signin input{flex:1 1 180px;min-width:0;font:400 16px/1.2 var(--mono);color:var(--ink);background:var(--sheet);border:1px solid var(--rule-2);border-radius:3px;height:32px;padding:0 10px}
1432
+ footer{display:flex;flex-wrap:wrap;gap:6px 18px;padding:20px 0 40px;border-top:1px solid var(--rule);font:400 12px/1.5 var(--mono);color:var(--muted)}footer .version{margin-left:auto}
1428
1433
  .timeline{margin:18px 0 0}
1429
1434
  .timeline .axis,.timeline .under,.timeline .over,.timeline .lane{display:grid;grid-template-columns:var(--who) minmax(0,1fr)}
1430
1435
  .timeline .hours{position:relative;height:22px;font:400 11px/1 var(--mono);color:var(--muted);letter-spacing:.04em}
@@ -1618,13 +1623,13 @@ ${jobs.length ? `<section class="sec" aria-label="Last 24 hours">
1618
1623
  </section>
1619
1624
  <section class="sec" aria-label="Jobs">
1620
1625
  <h2>Jobs</h2>
1621
- <p class="lede">Every job in the store. Open one for its week, its runs and their output.</p>
1626
+ <p class="lede">Every job in the store. Open one for its week, its runs, and their output.</p>
1622
1627
  <div class="wide"><table class="board">
1623
1628
  <thead><tr><th>Job</th><th>Health</th><th class="hide-sm">Schedule</th><th>Last run</th><th class="hide-sm">Next due</th><th class="hide-sm">Recent runs</th></tr></thead>
1624
1629
  <tbody>${rows}</tbody></table></div>
1625
1630
  </section>` : ""}
1626
1631
  </main>
1627
- <footer><span>Refreshes every minute. Times are UTC.</span><a href="${h(base)}/api/jobs">JSON</a></footer>`;
1632
+ <footer><span>Refreshes every minute. Times are UTC.</span><a href="${h(base)}/api/jobs">JSON</a>${VERSION_LINK}</footer>`;
1628
1633
  return layout("CronWatch", body, base, { refresh: 60 });
1629
1634
  }
1630
1635
  function jobPage(job, runs, now, base, complete = true) {
@@ -1662,8 +1667,7 @@ function jobPage(job, runs, now, base, complete = true) {
1662
1667
  ${d.description ? `<p class="desc">${h(d.description)}</p>` : ""}
1663
1668
  <p class="stateline">${healthState(job)}${why ? `<span class="why">${h(why)}</span>` : ""}</p>
1664
1669
  <div class="actions">
1665
- ${silenced ? `<form class="inline" method="post" action="${path}/unsilence"><button type="submit">Unsilence (until ${h(formatRelative(job.silencedUntil, now))})</button></form>` : `<form class="inline" method="post" action="${path}/silence"><select name="for" aria-label="Silence for"><option value="1h">1 hour</option><option value="4h">4 hours</option><option value="1d">1 day</option><option value="7d">1 week</option></select><button type="submit">Silence</button></form>`}
1666
- <details class="confirm"><summary>Forget</summary><form class="inline" method="post" action="${path}/forget"><span>Remove this job and its runs from the store?</span> <button type="submit">Forget</button></form></details>
1670
+ ${silenced ? `<form class="inline" method="post" action="${path}/unsilence"><button type="submit">Unsilence (until ${h(formatRelative(job.silencedUntil, now))})</button></form>` : `<details class="confirm"><summary>Silence</summary><form class="inline" method="post" action="${path}/silence"><span>for</span> <button type="submit" name="for" value="1h">1 hour</button><button type="submit" name="for" value="4h">4 hours</button><button type="submit" name="for" value="1d">1 day</button><button type="submit" name="for" value="7d">1 week</button></form></details>`}
1667
1671
  </div>
1668
1672
  <dl class="figures">
1669
1673
  <div><dt>Last run</dt><dd>${job.lastRun ? h(formatRelative(job.lastRun.startedAt, now)) : "never"}</dd></div>
@@ -1701,8 +1705,15 @@ function jobPage(job, runs, now, base, complete = true) {
1701
1705
  ${job.consecutiveFailures > 0 ? `<dt>Failures in a row</dt><dd>${h(job.consecutiveFailures)}</dd>` : ""}
1702
1706
  </dl>
1703
1707
  </section>
1708
+ <section class="sec delete" aria-label="Delete">
1709
+ <h2>Delete</h2>
1710
+ <div>
1711
+ <p class="lede">Removes this job and all its runs from the store, which cannot be undone. A job still in your code comes back on its next run, with no history.</p>
1712
+ <details class="confirm"><summary>Delete history</summary><form class="inline" method="post" action="${path}/forget"><span>Delete this job and all its runs?</span> <button class="danger" type="submit">Delete</button><a class="button" href="${path}">Cancel</a></form></details>
1713
+ </div>
1714
+ </section>
1704
1715
  </main>
1705
- <footer><span>Refreshes every minute. Times are UTC.</span><a href="${h(base)}/api/jobs/${encodeURIComponent(job.name)}">JSON</a></footer>`;
1716
+ <footer><span>Refreshes every minute. Times are UTC.</span><a href="${h(base)}/api/jobs/${encodeURIComponent(job.name)}">JSON</a>${VERSION_LINK}</footer>`;
1706
1717
  return layout(`${job.name}: CronWatch`, body, base, { refresh: 60 });
1707
1718
  }
1708
1719
  function messagePage(title, message, base, signIn = false) {
@@ -1710,10 +1721,6 @@ function messagePage(title, message, base, signIn = false) {
1710
1721
  return layout(title, `<header class="top">${brand(base)}</header><main class="message"><h1>${h(title)}</h1><p>${h(message)}</p>${form}</main>`, base);
1711
1722
  }
1712
1723
 
1713
- // src/version.ts
1714
- var VERSION = "0.12.1";
1715
- var API_VERSION = 1;
1716
-
1717
1724
  // src/routes/index.ts
1718
1725
  var COOKIE = "cronwatch_token";
1719
1726
  var LIBRARY = "@cronwatch/sdk";