quotacap 0.0.13 → 0.0.15
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/format/table.js +4 -4
- package/dist/src/format/table.js +4 -4
- package/dist/src/version.js +1 -1
- package/dist/tests/format/table.test.js +10 -12
- package/dist/version.js +1 -1
- package/package.json +1 -1
package/dist/format/table.js
CHANGED
|
@@ -18,10 +18,10 @@ export function renderQuotasTable(quotas, advisories = []) {
|
|
|
18
18
|
const daysLeft = a?.daysLeft != null ? a.daysLeft.toFixed(1) : "—";
|
|
19
19
|
const ideal = a?.idealRate != null ? `${Math.round(a.idealRate)}%/day` : "—";
|
|
20
20
|
const burn = a?.burnMeasured ? `${a.burnRate.toFixed(1)}%/day` : "—";
|
|
21
|
-
//
|
|
22
|
-
//
|
|
23
|
-
//
|
|
24
|
-
const icon = a?.status === "at risk" ? "
|
|
21
|
+
// Renderers that count emoji as one cell but paint two (Kimi, Claude
|
|
22
|
+
// Code) shift the pipes after a wide glyph by +1; the status glyphs
|
|
23
|
+
// live in the last column so the shift touches only the right border.
|
|
24
|
+
const icon = a?.status === "at risk" ? "⚠️" : a != null ? "✅" : "—";
|
|
25
25
|
const waste = a?.wastePct != null ? `${Math.round(a.wastePct)}%` : "—";
|
|
26
26
|
return `| ${q.provider} | ${used}% | ${100 - used}% | ${resets} | ${daysLeft} | ${ideal} | ${burn} | ${waste} | ${icon} |`;
|
|
27
27
|
});
|
package/dist/src/format/table.js
CHANGED
|
@@ -18,10 +18,10 @@ export function renderQuotasTable(quotas, advisories = []) {
|
|
|
18
18
|
const daysLeft = a?.daysLeft != null ? a.daysLeft.toFixed(1) : "—";
|
|
19
19
|
const ideal = a?.idealRate != null ? `${Math.round(a.idealRate)}%/day` : "—";
|
|
20
20
|
const burn = a?.burnMeasured ? `${a.burnRate.toFixed(1)}%/day` : "—";
|
|
21
|
-
//
|
|
22
|
-
//
|
|
23
|
-
//
|
|
24
|
-
const icon = a?.status === "at risk" ? "
|
|
21
|
+
// Renderers that count emoji as one cell but paint two (Kimi, Claude
|
|
22
|
+
// Code) shift the pipes after a wide glyph by +1; the status glyphs
|
|
23
|
+
// live in the last column so the shift touches only the right border.
|
|
24
|
+
const icon = a?.status === "at risk" ? "⚠️" : a != null ? "✅" : "—";
|
|
25
25
|
const waste = a?.wastePct != null ? `${Math.round(a.wastePct)}%` : "—";
|
|
26
26
|
return `| ${q.provider} | ${used}% | ${100 - used}% | ${resets} | ${daysLeft} | ${ideal} | ${burn} | ${waste} | ${icon} |`;
|
|
27
27
|
});
|
package/dist/src/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// generated by scripts/build-embed.mjs — do not edit
|
|
2
|
-
export const VERSION = "0.0.
|
|
2
|
+
export const VERSION = "0.0.15";
|
|
@@ -12,8 +12,8 @@ describe("format table", () => {
|
|
|
12
12
|
];
|
|
13
13
|
const table = renderQuotasTable(quotas, advisories);
|
|
14
14
|
expect(table).toMatch(/\| Provider \| Used \| Remaining \| Resets \| Days left \| Ideal daily burn \| Burn rate \| Waste if unused \| Status \|/);
|
|
15
|
-
expect(table).toMatch(/\| kimi \| 16% \| 84% \|.*\| 3.0 \| 28%\/day \| 40.0%\/day \| 78% \|
|
|
16
|
-
expect(table).toMatch(/\| claude \| 37% \| 63% \|.*\| 5.5 \| 12%\/day \| — \| 53% \|
|
|
15
|
+
expect(table).toMatch(/\| kimi \| 16% \| 84% \|.*\| 3.0 \| 28%\/day \| 40.0%\/day \| 78% \| ⚠️ \|/);
|
|
16
|
+
expect(table).toMatch(/\| claude \| 37% \| 63% \|.*\| 5.5 \| 12%\/day \| — \| 53% \| ✅ \|/);
|
|
17
17
|
});
|
|
18
18
|
it("renders quota-only rows with placeholders when no advisories exist", () => {
|
|
19
19
|
const quotas = [{ provider: "kimi", usedPct: 16, resetsAt: "2026-09-01T09:02:00+10:00" }];
|
|
@@ -27,7 +27,7 @@ describe("format table", () => {
|
|
|
27
27
|
expect(table).toMatch(/Sept?[^|]*2026/);
|
|
28
28
|
expect(table).not.toMatch(/9\/1\/2026/);
|
|
29
29
|
});
|
|
30
|
-
it("keeps every pipe aligned
|
|
30
|
+
it("keeps every internal pipe aligned — no wide glyphs outside the Status column", () => {
|
|
31
31
|
const quotas = [
|
|
32
32
|
{ provider: "kimi", usedPct: 16, resetsAt: "2026-09-01T09:02:00+10:00" },
|
|
33
33
|
{ provider: "claude", usedPct: 37, resetsAt: "2026-09-03T21:00:00+10:00" },
|
|
@@ -38,19 +38,17 @@ describe("format table", () => {
|
|
|
38
38
|
];
|
|
39
39
|
const table = renderQuotasTable(quotas, advisories);
|
|
40
40
|
const lines = table.split("\n");
|
|
41
|
-
|
|
42
|
-
// count. Any cell where paint > naive-count shifts that row's pipes.
|
|
43
|
-
const paintWidth = (ch) => {
|
|
41
|
+
const emoji = (ch) => {
|
|
44
42
|
const c = ch.codePointAt(0);
|
|
45
|
-
return
|
|
43
|
+
return (c >= 0x2600 && c <= 0x27BF) || c >= 0x1F000;
|
|
46
44
|
};
|
|
47
|
-
|
|
45
|
+
// Renderers that count emoji as one cell but paint two shift every pipe
|
|
46
|
+
// after the glyph. The status glyphs are confined to the last column, so
|
|
47
|
+
// the shift can only ever touch the right border, never an internal pipe.
|
|
48
48
|
for (const line of lines) {
|
|
49
49
|
const cells = line.split("|").slice(1, -1);
|
|
50
|
-
for (const cell of cells) {
|
|
51
|
-
|
|
52
|
-
const counted = [...cell].reduce((w, ch) => w + naiveWidth(ch), 0);
|
|
53
|
-
expect(painted).toBe(counted);
|
|
50
|
+
for (const cell of cells.slice(0, -1)) {
|
|
51
|
+
expect([...cell].some(emoji)).toBe(false);
|
|
54
52
|
}
|
|
55
53
|
}
|
|
56
54
|
});
|
package/dist/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// generated by scripts/build-embed.mjs — do not edit
|
|
2
|
-
export const VERSION = "0.0.
|
|
2
|
+
export const VERSION = "0.0.15";
|