estela 0.1.0
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/README.md +138 -0
- package/dist/billing/amortize.d.ts +44 -0
- package/dist/billing/amortize.d.ts.map +1 -0
- package/dist/billing/amortize.js +83 -0
- package/dist/billing/amortize.js.map +1 -0
- package/dist/billing/amortize.test.d.ts +2 -0
- package/dist/billing/amortize.test.d.ts.map +1 -0
- package/dist/billing/amortize.test.js +121 -0
- package/dist/billing/amortize.test.js.map +1 -0
- package/dist/billing/format.test.d.ts +2 -0
- package/dist/billing/format.test.d.ts.map +1 -0
- package/dist/billing/format.test.js +110 -0
- package/dist/billing/format.test.js.map +1 -0
- package/dist/billing/invoice.d.ts +52 -0
- package/dist/billing/invoice.d.ts.map +1 -0
- package/dist/billing/invoice.js +148 -0
- package/dist/billing/invoice.js.map +1 -0
- package/dist/billing/invoice.test.d.ts +2 -0
- package/dist/billing/invoice.test.d.ts.map +1 -0
- package/dist/billing/invoice.test.js +200 -0
- package/dist/billing/invoice.test.js.map +1 -0
- package/dist/billing/sessionize.d.ts +104 -0
- package/dist/billing/sessionize.d.ts.map +1 -0
- package/dist/billing/sessionize.js +0 -0
- package/dist/billing/sessionize.js.map +1 -0
- package/dist/billing/sessionize.test.d.ts +2 -0
- package/dist/billing/sessionize.test.d.ts.map +1 -0
- package/dist/billing/sessionize.test.js +67 -0
- package/dist/billing/sessionize.test.js.map +1 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +1091 -0
- package/dist/cli.js.map +1 -0
- package/dist/cloud/auth.d.ts +4 -0
- package/dist/cloud/auth.d.ts.map +1 -0
- package/dist/cloud/auth.js +98 -0
- package/dist/cloud/auth.js.map +1 -0
- package/dist/cloud/client.d.ts +12 -0
- package/dist/cloud/client.d.ts.map +1 -0
- package/dist/cloud/client.js +34 -0
- package/dist/cloud/client.js.map +1 -0
- package/dist/db/schema.d.ts +11 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +424 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/db/schema.test.d.ts +2 -0
- package/dist/db/schema.test.d.ts.map +1 -0
- package/dist/db/schema.test.js +335 -0
- package/dist/db/schema.test.js.map +1 -0
- package/dist/db/store.d.ts +113 -0
- package/dist/db/store.d.ts.map +1 -0
- package/dist/db/store.js +550 -0
- package/dist/db/store.js.map +1 -0
- package/dist/doctor.d.ts +24 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +229 -0
- package/dist/doctor.js.map +1 -0
- package/dist/export/csv.d.ts +9 -0
- package/dist/export/csv.d.ts.map +1 -0
- package/dist/export/csv.js +81 -0
- package/dist/export/csv.js.map +1 -0
- package/dist/export/invoice-pdf.d.ts +21 -0
- package/dist/export/invoice-pdf.d.ts.map +1 -0
- package/dist/export/invoice-pdf.js +135 -0
- package/dist/export/invoice-pdf.js.map +1 -0
- package/dist/export/panel.d.ts +78 -0
- package/dist/export/panel.d.ts.map +1 -0
- package/dist/export/panel.js +693 -0
- package/dist/export/panel.js.map +1 -0
- package/dist/export/panel.test.d.ts +2 -0
- package/dist/export/panel.test.d.ts.map +1 -0
- package/dist/export/panel.test.js +273 -0
- package/dist/export/panel.test.js.map +1 -0
- package/dist/export/pdf.d.ts +32 -0
- package/dist/export/pdf.d.ts.map +1 -0
- package/dist/export/pdf.js +229 -0
- package/dist/export/pdf.js.map +1 -0
- package/dist/export/pdf.test.d.ts +2 -0
- package/dist/export/pdf.test.d.ts.map +1 -0
- package/dist/export/pdf.test.js +151 -0
- package/dist/export/pdf.test.js.map +1 -0
- package/dist/export/share.d.ts +42 -0
- package/dist/export/share.d.ts.map +1 -0
- package/dist/export/share.js +181 -0
- package/dist/export/share.js.map +1 -0
- package/dist/export/share.test.d.ts +2 -0
- package/dist/export/share.test.d.ts.map +1 -0
- package/dist/export/share.test.js +116 -0
- package/dist/export/share.test.js.map +1 -0
- package/dist/metrics/index.d.ts +101 -0
- package/dist/metrics/index.d.ts.map +1 -0
- package/dist/metrics/index.js +221 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/metrics/metrics.test.d.ts +2 -0
- package/dist/metrics/metrics.test.d.ts.map +1 -0
- package/dist/metrics/metrics.test.js +162 -0
- package/dist/metrics/metrics.test.js.map +1 -0
- package/dist/metrics/people.d.ts +46 -0
- package/dist/metrics/people.d.ts.map +1 -0
- package/dist/metrics/people.js +126 -0
- package/dist/metrics/people.js.map +1 -0
- package/dist/metrics/people.test.d.ts +2 -0
- package/dist/metrics/people.test.d.ts.map +1 -0
- package/dist/metrics/people.test.js +84 -0
- package/dist/metrics/people.test.js.map +1 -0
- package/dist/metrics/team.d.ts +41 -0
- package/dist/metrics/team.d.ts.map +1 -0
- package/dist/metrics/team.js +0 -0
- package/dist/metrics/team.js.map +1 -0
- package/dist/metrics/team.test.d.ts +2 -0
- package/dist/metrics/team.test.d.ts.map +1 -0
- package/dist/metrics/team.test.js +90 -0
- package/dist/metrics/team.test.js.map +1 -0
- package/dist/pricing/catalog.d.ts +39 -0
- package/dist/pricing/catalog.d.ts.map +1 -0
- package/dist/pricing/catalog.js +59 -0
- package/dist/pricing/catalog.js.map +1 -0
- package/dist/pricing/cost.d.ts +25 -0
- package/dist/pricing/cost.d.ts.map +1 -0
- package/dist/pricing/cost.js +50 -0
- package/dist/pricing/cost.js.map +1 -0
- package/dist/pricing/cost.test.d.ts +2 -0
- package/dist/pricing/cost.test.d.ts.map +1 -0
- package/dist/pricing/cost.test.js +74 -0
- package/dist/pricing/cost.test.js.map +1 -0
- package/dist/server.d.ts +15 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +1141 -0
- package/dist/server.js.map +1 -0
- package/dist/setup.d.ts +70 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +223 -0
- package/dist/setup.js.map +1 -0
- package/dist/setup.test.d.ts +2 -0
- package/dist/setup.test.d.ts.map +1 -0
- package/dist/setup.test.js +131 -0
- package/dist/setup.test.js.map +1 -0
- package/dist/watchers/claude.d.ts +34 -0
- package/dist/watchers/claude.d.ts.map +1 -0
- package/dist/watchers/claude.js +235 -0
- package/dist/watchers/claude.js.map +1 -0
- package/dist/watchers/claude.test.d.ts +2 -0
- package/dist/watchers/claude.test.d.ts.map +1 -0
- package/dist/watchers/claude.test.js +180 -0
- package/dist/watchers/claude.test.js.map +1 -0
- package/dist/watchers/git.d.ts +42 -0
- package/dist/watchers/git.d.ts.map +1 -0
- package/dist/watchers/git.js +218 -0
- package/dist/watchers/git.js.map +1 -0
- package/dist/watchers/git.test.d.ts +2 -0
- package/dist/watchers/git.test.d.ts.map +1 -0
- package/dist/watchers/git.test.js +73 -0
- package/dist/watchers/git.test.js.map +1 -0
- package/dist/watchers/identity.d.ts +34 -0
- package/dist/watchers/identity.d.ts.map +1 -0
- package/dist/watchers/identity.js +85 -0
- package/dist/watchers/identity.js.map +1 -0
- package/dist/watchers/identity.test.d.ts +2 -0
- package/dist/watchers/identity.test.d.ts.map +1 -0
- package/dist/watchers/identity.test.js +48 -0
- package/dist/watchers/identity.test.js.map +1 -0
- package/dist/web-ui.test.d.ts +2 -0
- package/dist/web-ui.test.d.ts.map +1 -0
- package/dist/web-ui.test.js +312 -0
- package/dist/web-ui.test.js.map +1 -0
- package/node_modules/@estela/shared/dist/index.d.ts +3 -0
- package/node_modules/@estela/shared/dist/index.d.ts.map +1 -0
- package/node_modules/@estela/shared/dist/index.js +19 -0
- package/node_modules/@estela/shared/dist/index.js.map +1 -0
- package/node_modules/@estela/shared/dist/money.d.ts +71 -0
- package/node_modules/@estela/shared/dist/money.d.ts.map +1 -0
- package/node_modules/@estela/shared/dist/money.js +171 -0
- package/node_modules/@estela/shared/dist/money.js.map +1 -0
- package/node_modules/@estela/shared/dist/types.d.ts +365 -0
- package/node_modules/@estela/shared/dist/types.d.ts.map +1 -0
- package/node_modules/@estela/shared/dist/types.js +24 -0
- package/node_modules/@estela/shared/dist/types.js.map +1 -0
- package/node_modules/@estela/shared/package.json +5 -0
- package/package.json +41 -0
- package/web/app.css +749 -0
- package/web/app.js +1257 -0
- package/web/apple-touch-icon.png +0 -0
- package/web/favicon.png +0 -0
- package/web/index.html +132 -0
- package/web/lib.js +94 -0
- package/web/logo-mark.png +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"panel.js","sourceRoot":"","sources":["../../src/export/panel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"panel.test.d.ts","sourceRoot":"","sources":["../../src/export/panel.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const strict_1 = __importDefault(require("node:assert/strict"));
|
|
7
|
+
const node_test_1 = require("node:test");
|
|
8
|
+
const shared_1 = require("@estela/shared");
|
|
9
|
+
const panel_js_1 = require("./panel.js");
|
|
10
|
+
const CLIENT = { id: "euro", name: "Eurosistema", currency: "EUR" };
|
|
11
|
+
const PROJECT = {
|
|
12
|
+
id: "euro-blazor", clientId: "euro", name: "Eurosistema Blazor", repoPaths: [],
|
|
13
|
+
billable: true, roundingMinutes: 0, aiCostPolicy: "absorbed", kind: "client",
|
|
14
|
+
};
|
|
15
|
+
function entry(day, seconds, over = {}) {
|
|
16
|
+
const startedAt = new Date(`${day}T10:00:00Z`);
|
|
17
|
+
return {
|
|
18
|
+
id: `e-${day}`, projectId: "euro-blazor", startedAt,
|
|
19
|
+
endedAt: new Date(startedAt.getTime() + seconds * 1000),
|
|
20
|
+
seconds, description: `Trabajo del ${day}`, billable: true, invoiceId: null,
|
|
21
|
+
aiCost: { microUsd: 250_000_000 }, agentSeconds: seconds,
|
|
22
|
+
commitHashes: ["abc1234def"], agents: ["claude-code"],
|
|
23
|
+
source: "agent", kind: "development", branch: "main",
|
|
24
|
+
...over,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
const BASE = {
|
|
28
|
+
project: PROJECT, client: CLIENT,
|
|
29
|
+
commitsOf: () => [{ hash: "abc1234def", subject: "feat: validación de cédula" }],
|
|
30
|
+
generatedAt: new Date("2026-08-27T09:00:00Z"),
|
|
31
|
+
};
|
|
32
|
+
// ── Token de acceso ────────────────────────────────────────────────────
|
|
33
|
+
(0, node_test_1.test)("el token tiene 128 bits de entropía", () => {
|
|
34
|
+
// Es lo único que protege la página: una URL publicada es pública para quien
|
|
35
|
+
// la tenga, así que tiene que ser inadivinable.
|
|
36
|
+
const token = (0, panel_js_1.newPanelToken)();
|
|
37
|
+
strict_1.default.match(token, /^[0-9a-f]{32}$/);
|
|
38
|
+
const many = new Set(Array.from({ length: 500 }, () => (0, panel_js_1.newPanelToken)()));
|
|
39
|
+
strict_1.default.equal(many.size, 500, "no se repiten");
|
|
40
|
+
});
|
|
41
|
+
// ── Lo que nunca sale ──────────────────────────────────────────────────
|
|
42
|
+
(0, node_test_1.test)("el consumo de IA NUNCA llega al panel publicado", () => {
|
|
43
|
+
const html = (0, panel_js_1.buildPanel)({
|
|
44
|
+
...BASE,
|
|
45
|
+
entries: [entry("2026-08-10", 7200, { aiCost: { microUsd: 999_000_000 } })],
|
|
46
|
+
aiPayer: "self",
|
|
47
|
+
});
|
|
48
|
+
for (const leak of ["microUsd", "aiCost", "tarifa API", "consumo de IA",
|
|
49
|
+
"tokens", "Claude", "USD"]) {
|
|
50
|
+
strict_1.default.ok(!html.includes(leak), `el panel no debe contener "${leak}"`);
|
|
51
|
+
}
|
|
52
|
+
// La comprobación que de verdad importa: el dato no viaja en el payload.
|
|
53
|
+
// Buscar la cifra en el HTML entero da falsos positivos (un "999" casa con
|
|
54
|
+
// `border-radius:999px` del CSS), así que se mira donde vive el dato.
|
|
55
|
+
const payload = /<script id="data"[^>]*>(.*?)<\/script>/s.exec(html)[1];
|
|
56
|
+
strict_1.default.ok(!payload.includes("999"), "la cifra de coste no está en los datos");
|
|
57
|
+
strict_1.default.ok(!/\bcost|\bai/i.test(payload), "ni ningún campo relacionado");
|
|
58
|
+
});
|
|
59
|
+
(0, node_test_1.test)("los importes solo aparecen si se piden", () => {
|
|
60
|
+
const entries = [entry("2026-08-10", 3600)];
|
|
61
|
+
const rateAt = () => (0, shared_1.money)(1300, "EUR");
|
|
62
|
+
const sin = (0, panel_js_1.buildPanel)({ ...BASE, entries, rateAt });
|
|
63
|
+
strict_1.default.ok(!sin.includes("€13,00"), "sin --with-amounts no hay importes");
|
|
64
|
+
const con = (0, panel_js_1.buildPanel)({ ...BASE, entries, rateAt, withAmounts: true });
|
|
65
|
+
strict_1.default.ok(con.includes("€13,00"));
|
|
66
|
+
strict_1.default.ok(con.includes("valor del trabajo"));
|
|
67
|
+
});
|
|
68
|
+
(0, node_test_1.test)("pide a los buscadores que no lo indexen", () => {
|
|
69
|
+
const html = (0, panel_js_1.buildPanel)({ ...BASE, entries: [entry("2026-08-10", 3600)] });
|
|
70
|
+
strict_1.default.ok(html.includes('name="robots"'));
|
|
71
|
+
strict_1.default.ok(html.includes("noindex"));
|
|
72
|
+
strict_1.default.ok(html.includes('name="referrer" content="no-referrer"'), "sin referrer: la URL no debe filtrarse al pulsar un enlace saliente");
|
|
73
|
+
});
|
|
74
|
+
// ── Autonomía ──────────────────────────────────────────────────────────
|
|
75
|
+
(0, node_test_1.test)("no hace ni una sola petición de red", () => {
|
|
76
|
+
// Se sirve como estático desde cualquier sitio y no depende de ninguna
|
|
77
|
+
// máquina encendida. Un src= o un link rel=stylesheet lo rompería.
|
|
78
|
+
const html = (0, panel_js_1.buildPanel)({ ...BASE, entries: [entry("2026-08-10", 3600)] });
|
|
79
|
+
strict_1.default.ok(!/\bsrc\s*=/.test(html), "sin recursos externos");
|
|
80
|
+
strict_1.default.ok(!/<link\b/.test(html), "sin hojas enlazadas");
|
|
81
|
+
strict_1.default.ok(!/fetch\(|XMLHttpRequest/.test(html), "sin llamadas en JavaScript");
|
|
82
|
+
// La invariante es que no se contacte con ningún host ajeno. Los enlaces al
|
|
83
|
+
// sitio del producto se fijan por JavaScript desde D.site en vez de quedar
|
|
84
|
+
// escritos en el HTML — un enlace de salida no debe depender de un dominio
|
|
85
|
+
// fijo que puede no existir todavía. Por eso el HTML no debe llevar ningún
|
|
86
|
+
// href estático: ver "los enlaces del panel nunca apuntan a un dominio fijo".
|
|
87
|
+
const hosts = new Set([...html.matchAll(/href="(https?:\/\/[^/"]+)/g)].map((m) => m[1]));
|
|
88
|
+
strict_1.default.deepEqual([...hosts], [], "ningún host debe quedar escrito a fuego en el HTML estático");
|
|
89
|
+
});
|
|
90
|
+
(0, node_test_1.test)("un commit con </script> no rompe la página", () => {
|
|
91
|
+
// El JSON viaja dentro de un <script>: cualquier '</script>' literal en un
|
|
92
|
+
// mensaje de commit cerraría la etiqueta y dejaría el resto como texto suelto.
|
|
93
|
+
const html = (0, panel_js_1.buildPanel)({
|
|
94
|
+
...BASE,
|
|
95
|
+
entries: [entry("2026-08-10", 3600, { description: "fix: cierre de </script> en la plantilla" })],
|
|
96
|
+
commitsOf: () => [{ hash: "abc1234", subject: "</script><img onerror=alert(1)>" }],
|
|
97
|
+
});
|
|
98
|
+
const scripts = html.match(/<\/script>/g) ?? [];
|
|
99
|
+
strict_1.default.equal(scripts.length, 2, "solo los dos cierres legítimos");
|
|
100
|
+
strict_1.default.ok(!html.includes("<img onerror"), "el HTML del commit va neutralizado");
|
|
101
|
+
});
|
|
102
|
+
// ── Contenido ──────────────────────────────────────────────────────────
|
|
103
|
+
(0, node_test_1.test)("agrupa por día y suma el total", () => {
|
|
104
|
+
const html = (0, panel_js_1.buildPanel)({
|
|
105
|
+
...BASE,
|
|
106
|
+
entries: [
|
|
107
|
+
entry("2026-08-10", 3600),
|
|
108
|
+
entry("2026-08-10", 1800, { id: "b" }),
|
|
109
|
+
entry("2026-08-12", 7200),
|
|
110
|
+
],
|
|
111
|
+
});
|
|
112
|
+
const data = JSON.parse(/<script id="data"[^>]*>(.*?)<\/script>/s.exec(html)[1]);
|
|
113
|
+
strict_1.default.equal(data.totalSeconds, 12600);
|
|
114
|
+
strict_1.default.equal(data.days.length, 2);
|
|
115
|
+
strict_1.default.equal(data.days[0].items.length, 2, "los dos bloques del día 10");
|
|
116
|
+
});
|
|
117
|
+
(0, node_test_1.test)("las horas sin código llevan su etiqueta", () => {
|
|
118
|
+
const html = (0, panel_js_1.buildPanel)({
|
|
119
|
+
...BASE,
|
|
120
|
+
entries: [entry("2026-08-10", 5400, { kind: "meeting", description: "Seguimiento" })],
|
|
121
|
+
commitsOf: () => [],
|
|
122
|
+
});
|
|
123
|
+
const data = JSON.parse(/<script id="data"[^>]*>(.*?)<\/script>/s.exec(html)[1]);
|
|
124
|
+
strict_1.default.equal(data.days[0].items[0].kind, "Reunión");
|
|
125
|
+
});
|
|
126
|
+
(0, node_test_1.test)("lo no facturable no se publica", () => {
|
|
127
|
+
const html = (0, panel_js_1.buildPanel)({
|
|
128
|
+
...BASE,
|
|
129
|
+
entries: [
|
|
130
|
+
entry("2026-08-10", 3600),
|
|
131
|
+
entry("2026-08-11", 3600, { id: "nf", billable: false, description: "Interno" }),
|
|
132
|
+
],
|
|
133
|
+
});
|
|
134
|
+
strict_1.default.ok(!html.includes("Interno"));
|
|
135
|
+
});
|
|
136
|
+
(0, node_test_1.test)("un proyecto sin trabajo produce una página válida", () => {
|
|
137
|
+
const html = (0, panel_js_1.buildPanel)({ ...BASE, entries: [] });
|
|
138
|
+
strict_1.default.ok(html.startsWith("<!doctype html>"));
|
|
139
|
+
strict_1.default.ok(html.includes("Eurosistema Blazor"));
|
|
140
|
+
});
|
|
141
|
+
(0, node_test_1.test)("los hijos de la rejilla pueden encoger", () => {
|
|
142
|
+
// El fallo que esto previene: min-width:auto es el valor por defecto de un
|
|
143
|
+
// hijo de rejilla, así que no encoge por debajo de su contenido. Un nombre
|
|
144
|
+
// de rama largo con nowrap desbordaba la pantalla entera en móvil.
|
|
145
|
+
const html = (0, panel_js_1.buildPanel)({ ...BASE, entries: [entry("2026-08-10", 3600)] });
|
|
146
|
+
strict_1.default.match(html, /\.grid>\*\{min-width:0\}/, "hace falta .grid>*{min-width:0}");
|
|
147
|
+
});
|
|
148
|
+
(0, node_test_1.test)("el panel se adapta a pantallas estrechas", () => {
|
|
149
|
+
const html = (0, panel_js_1.buildPanel)({ ...BASE, entries: [entry("2026-08-10", 3600)] });
|
|
150
|
+
strict_1.default.match(html, /@media\(max-width:940px\)\{\.grid\{grid-template-columns:1fr\}\}/, "la rejilla debe colapsar a una columna");
|
|
151
|
+
strict_1.default.ok(html.includes("@media(max-width:560px)"), "hay ajustes para móvil");
|
|
152
|
+
});
|
|
153
|
+
(0, node_test_1.test)("la animación respeta a quien pide menos movimiento", () => {
|
|
154
|
+
const html = (0, panel_js_1.buildPanel)({ ...BASE, entries: [entry("2026-08-10", 3600)] });
|
|
155
|
+
strict_1.default.ok(html.includes("prefers-reduced-motion"));
|
|
156
|
+
strict_1.default.match(html, /prefers-reduced-motion[^}]*\}[^@]*\.rise\{opacity:1/s, "sin movimiento, las tarjetas deben verse igualmente");
|
|
157
|
+
});
|
|
158
|
+
// ── Equipo del proyecto y el candado ─────────────────────────────────────────
|
|
159
|
+
const TEAM = [
|
|
160
|
+
{ name: "JDev Leon", isMe: true, seconds: 95_948, commits: 11, branches: 1,
|
|
161
|
+
lastDay: "2026-08-27" },
|
|
162
|
+
{ name: "Juan Manuel Cruz Berjano", isMe: false, commits: 21, branches: 11,
|
|
163
|
+
lastDay: "2026-08-25" },
|
|
164
|
+
{ name: "Denys Fonseca", isMe: false, commits: 8, branches: 8,
|
|
165
|
+
lastDay: "2026-08-20" },
|
|
166
|
+
];
|
|
167
|
+
(0, node_test_1.test)("las horas de un compañero no están en el fichero, ni ocultas", () => {
|
|
168
|
+
// Lo que se vende es el dato; si viaja dentro del HTML y solo se tapa al
|
|
169
|
+
// pintar, cualquiera lo lee con Ver código fuente. Un candado con la llave
|
|
170
|
+
// puesta no es un candado.
|
|
171
|
+
const html = (0, panel_js_1.buildPanel)({ ...BASE, entries: [entry("2026-08-20", 3600)], team: TEAM });
|
|
172
|
+
const team = /"team":(\[.*?\}\])/.exec(html);
|
|
173
|
+
strict_1.default.ok(team, "no se encontró el equipo en el payload");
|
|
174
|
+
const parsed = JSON.parse(team[1]);
|
|
175
|
+
for (const person of parsed) {
|
|
176
|
+
if (person.name === "JDev Leon")
|
|
177
|
+
continue;
|
|
178
|
+
strict_1.default.equal(person.seconds, undefined, `${person.name} lleva sus segundos dentro del fichero`);
|
|
179
|
+
}
|
|
180
|
+
// Y el número concreto de un compañero no puede aparecer por ninguna otra vía.
|
|
181
|
+
strict_1.default.ok(!html.includes("75600"), "un total ajeno se coló en el HTML");
|
|
182
|
+
});
|
|
183
|
+
(0, node_test_1.test)("quien publica sí ve sus horas, marcadas como medidas", () => {
|
|
184
|
+
const html = (0, panel_js_1.buildPanel)({ ...BASE, entries: [entry("2026-08-20", 3600)], team: TEAM });
|
|
185
|
+
strict_1.default.match(html, /"name":"JDev Leon","isMe":true,"seconds":95948/);
|
|
186
|
+
strict_1.default.ok(html.includes("medido"), "falta distinguir medido de estimado");
|
|
187
|
+
});
|
|
188
|
+
(0, node_test_1.test)("el equipo enseña a los compañeros por su nombre", () => {
|
|
189
|
+
// Es el repositorio del cliente y su propia gente: reconocerlos es lo que
|
|
190
|
+
// demuestra que la herramienta funciona sobre sus datos y no sobre una demo.
|
|
191
|
+
const html = (0, panel_js_1.buildPanel)({ ...BASE, entries: [entry("2026-08-20", 3600)], team: TEAM });
|
|
192
|
+
strict_1.default.ok(html.includes("Juan Manuel Cruz Berjano"));
|
|
193
|
+
strict_1.default.ok(html.includes("Denys Fonseca"));
|
|
194
|
+
});
|
|
195
|
+
(0, node_test_1.test)("sin equipo el panel no enseña ningún candado", () => {
|
|
196
|
+
// Un proyecto de una sola persona no debe recibir una llamada a vender algo
|
|
197
|
+
// que no le aporta nada.
|
|
198
|
+
const html = (0, panel_js_1.buildPanel)({ ...BASE, entries: [entry("2026-08-20", 3600)] });
|
|
199
|
+
strict_1.default.ok(!html.includes("Equipo del proyecto") || html.includes('"team":[]'));
|
|
200
|
+
});
|
|
201
|
+
(0, node_test_1.test)("el candado lleva al dominio real por defecto", () => {
|
|
202
|
+
// getestela.dev ya está comprado y apuntando al servidor. Un enlace roto
|
|
203
|
+
// justo cuando alguien se interesa cuesta más que no haber puesto el candado,
|
|
204
|
+
// así que el valor por defecto tiene que ser un sitio que responda hoy.
|
|
205
|
+
const porDefecto = (0, panel_js_1.buildPanel)({ ...BASE, entries: [entry("2026-08-20", 3600)], team: TEAM });
|
|
206
|
+
strict_1.default.ok(porDefecto.includes("getestela.dev"), "el candado no lleva a ningún sitio");
|
|
207
|
+
// Sigue siendo configurable: un panel publicado desde un entorno de pruebas,
|
|
208
|
+
// o antes de que el dominio final apuntara al servidor, necesitaba poder
|
|
209
|
+
// apuntar a otro sitio sin tocar el código.
|
|
210
|
+
const propio = (0, panel_js_1.buildPanel)({
|
|
211
|
+
...BASE, entries: [entry("2026-08-20", 3600)], team: TEAM,
|
|
212
|
+
siteUrl: "https://estela.zaisor.io/",
|
|
213
|
+
});
|
|
214
|
+
strict_1.default.ok(propio.includes('"site":"https://estela.zaisor.io"'), "la barra final duplicaría la del path");
|
|
215
|
+
});
|
|
216
|
+
(0, node_test_1.test)("el candado no promete coste de IA por persona", () => {
|
|
217
|
+
// Sería una divulgación del gasto de alguien, y además indeterminable: el
|
|
218
|
+
// demonio lee los transcripts, ve el modelo y los tokens, y jamás de quién
|
|
219
|
+
// es la tarjeta. Un coste cuyo dueño no puedes saber no se enseña como coste.
|
|
220
|
+
const html = (0, panel_js_1.buildPanel)({ ...BASE, entries: [entry("2026-08-20", 3600)], team: TEAM });
|
|
221
|
+
// Desde el título del bloque, no desde `class="lock"`: eso cae primero en
|
|
222
|
+
// el CSS y el corte se quedaba sin el texto.
|
|
223
|
+
const start = html.indexOf("Horas medidas de tu equipo");
|
|
224
|
+
strict_1.default.ok(start > 0, "no se encontró el bloque bloqueado");
|
|
225
|
+
const lock = html.slice(start, start + 600);
|
|
226
|
+
strict_1.default.ok(lock.includes("por proyecto"), "debe decir que el coste es por proyecto");
|
|
227
|
+
strict_1.default.ok(/nunca por[\s\S]{0,20}persona/.test(lock), "debe decir explícitamente que no es por persona");
|
|
228
|
+
});
|
|
229
|
+
(0, node_test_1.test)("los enlaces del panel nunca apuntan a un dominio fijo que puede no existir", () => {
|
|
230
|
+
// El fallo real: la tarjeta "Esto es una foto del proyecto" y el pie de
|
|
231
|
+
// página llevaban "https://getestela.dev" escrito a fuego en el HTML. Ese
|
|
232
|
+
// dominio no resuelve hasta que se compre. Quien busca de dónde sale el
|
|
233
|
+
// panel y encuentra un enlace muerto duda más que si no hubiera enlace: es
|
|
234
|
+
// el escenario exacto que este panel existe para evitar.
|
|
235
|
+
const html = (0, panel_js_1.buildPanel)({ ...BASE, entries: [entry("2026-08-20", 3600)] });
|
|
236
|
+
strict_1.default.ok(!html.includes('href="https://getestela.dev"'), "un enlace de salida sigue fijo al dominio final, que hoy no resuelve");
|
|
237
|
+
// Los dos puntos de salida tienen que existir y estar cableados al mismo
|
|
238
|
+
// sitio configurable que ya usa el candado de Equipo.
|
|
239
|
+
strict_1.default.ok(html.includes('id="cta-more"'), "falta el enlace de la tarjeta superior");
|
|
240
|
+
strict_1.default.ok(html.includes('id="footer-site"'), "falta el enlace del pie de página");
|
|
241
|
+
strict_1.default.match(html, /el\("cta-more"\)\.setAttribute\("href",\s*site/);
|
|
242
|
+
strict_1.default.match(html, /el\("footer-site"\)/);
|
|
243
|
+
});
|
|
244
|
+
(0, node_test_1.test)("con --site, la tarjeta de arriba y el candado apuntan al mismo sitio", () => {
|
|
245
|
+
const html = (0, panel_js_1.buildPanel)({
|
|
246
|
+
...BASE, entries: [entry("2026-08-20", 3600)], team: TEAM,
|
|
247
|
+
siteUrl: "https://getestela.dev",
|
|
248
|
+
});
|
|
249
|
+
// Ambos leen D.site en el navegador: basta con comprobar que el dato viaja
|
|
250
|
+
// una sola vez y que las dos partes de la página lo consultan.
|
|
251
|
+
strict_1.default.match(html, /"site":"https:\/\/getestela\.dev"/);
|
|
252
|
+
strict_1.default.match(html, /var site = D\.site/);
|
|
253
|
+
});
|
|
254
|
+
(0, node_test_1.test)("el script del panel es JavaScript sintácticamente válido", () => {
|
|
255
|
+
// Lo que de verdad falló una vez: un regex con "\/" dentro del template
|
|
256
|
+
// literal de TypeScript se compiló a "\/" → "/" — "/^https?:\/\//" salía
|
|
257
|
+
// como "/^https?:///" en el HTML, un error de sintaxis que reventaba TODO
|
|
258
|
+
// el <script>. Ninguna prueba de contenido (grep de ids, de strings) lo
|
|
259
|
+
// detecta: hace falta parsear el JavaScript de verdad, no solo mirarlo.
|
|
260
|
+
//
|
|
261
|
+
// Las pruebas de arriba comprueban contenido del HTML; esta comprueba que el
|
|
262
|
+
// HTML resultante sea ejecutable, que es una propiedad distinta y es la que
|
|
263
|
+
// realmente falló.
|
|
264
|
+
const html = (0, panel_js_1.buildPanel)({ ...BASE, entries: [entry("2026-08-20", 3600)], team: TEAM });
|
|
265
|
+
const open = html.indexOf("<script>\n");
|
|
266
|
+
const close = html.indexOf("</script>", open);
|
|
267
|
+
strict_1.default.ok(open > 0 && close > open, "no se encontró el bloque de script");
|
|
268
|
+
const code = html.slice(open + "<script>\n".length, close);
|
|
269
|
+
// new Function() analiza el cuerpo como JavaScript real: si hay un error de
|
|
270
|
+
// sintaxis, lanza aquí y no en el navegador de un cliente.
|
|
271
|
+
strict_1.default.doesNotThrow(() => new Function(code), (error) => `el script del panel no es JS válido: ${error.message}`);
|
|
272
|
+
});
|
|
273
|
+
//# sourceMappingURL=panel.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"panel.test.js","sourceRoot":"","sources":["../../src/export/panel.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Escritor de PDF mínimo, sin dependencias.
|
|
3
|
+
*
|
|
4
|
+
* Una factura necesita texto, líneas y alineación a la derecha. Eso cabe en
|
|
5
|
+
* PDF 1.4 con las fuentes base, que todo lector trae incorporadas. La
|
|
6
|
+
* alternativa habitual —arrastrar Puppeteer para imprimir HTML— añade una
|
|
7
|
+
* descarga de Chromium de más de cien megas a una herramienta que presume de
|
|
8
|
+
* instalarse en segundos.
|
|
9
|
+
*
|
|
10
|
+
* Codificación WinAnsi: cubre acentos, eñes y el símbolo del euro, que es
|
|
11
|
+
* exactamente lo que una factura en español necesita.
|
|
12
|
+
*/
|
|
13
|
+
export type FontName = "Helvetica" | "Helvetica-Bold" | "Courier";
|
|
14
|
+
export declare class PdfDocument {
|
|
15
|
+
private readonly pages;
|
|
16
|
+
private current;
|
|
17
|
+
get width(): number;
|
|
18
|
+
get height(): number;
|
|
19
|
+
get pageCount(): number;
|
|
20
|
+
newPage(): void;
|
|
21
|
+
text(x: number, y: number, text: string, font?: FontName, size?: number, gray?: number): void;
|
|
22
|
+
/** Texto alineado a la derecha del borde `x`. */
|
|
23
|
+
textRight(x: number, y: number, text: string, font?: FontName, size?: number, gray?: number): void;
|
|
24
|
+
line(x1: number, y1: number, x2: number, y2: number, width?: number, gray?: number): void;
|
|
25
|
+
rect(x: number, y: number, w: number, h: number, gray: number): void;
|
|
26
|
+
/** Parte un texto en líneas que caben en `maxWidth`. */
|
|
27
|
+
static wrap(text: string, font: FontName, size: number, maxWidth: number): string[];
|
|
28
|
+
static truncate(text: string, font: FontName, size: number, maxWidth: number): string;
|
|
29
|
+
static measure(text: string, font: FontName, size: number): number;
|
|
30
|
+
toBuffer(): Buffer;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=pdf.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf.d.ts","sourceRoot":"","sources":["../../src/export/pdf.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,QAAQ,GAAG,WAAW,GAAG,gBAAgB,GAAG,SAAS,CAAC;AAUlE,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgB;IACtC,OAAO,CAAC,OAAO,CAAK;IAEpB,IAAI,KAAK,IAAI,MAAM,CAAuB;IAC1C,IAAI,MAAM,IAAI,MAAM,CAAwB;IAC5C,IAAI,SAAS,IAAI,MAAM,CAA8B;IAErD,OAAO,IAAI,IAAI;IAKf,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,QAAsB,EAAE,IAAI,SAAK,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAOtG,iDAAiD;IACjD,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,QAAsB,EAAE,IAAI,SAAK,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAI3G,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,SAAM,EAAE,IAAI,SAAO,GAAG,IAAI;IAMpF,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAIpE,wDAAwD;IACxD,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IAgBnF,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IAIrF,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM;IAIlE,QAAQ,IAAI,MAAM;CA+DnB"}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Escritor de PDF mínimo, sin dependencias.
|
|
4
|
+
*
|
|
5
|
+
* Una factura necesita texto, líneas y alineación a la derecha. Eso cabe en
|
|
6
|
+
* PDF 1.4 con las fuentes base, que todo lector trae incorporadas. La
|
|
7
|
+
* alternativa habitual —arrastrar Puppeteer para imprimir HTML— añade una
|
|
8
|
+
* descarga de Chromium de más de cien megas a una herramienta que presume de
|
|
9
|
+
* instalarse en segundos.
|
|
10
|
+
*
|
|
11
|
+
* Codificación WinAnsi: cubre acentos, eñes y el símbolo del euro, que es
|
|
12
|
+
* exactamente lo que una factura en español necesita.
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.PdfDocument = void 0;
|
|
16
|
+
const PAGE_WIDTH = 595.28; // A4 en puntos
|
|
17
|
+
const PAGE_HEIGHT = 841.89;
|
|
18
|
+
class PdfDocument {
|
|
19
|
+
pages = [[]];
|
|
20
|
+
current = 0;
|
|
21
|
+
get width() { return PAGE_WIDTH; }
|
|
22
|
+
get height() { return PAGE_HEIGHT; }
|
|
23
|
+
get pageCount() { return this.pages.length; }
|
|
24
|
+
newPage() {
|
|
25
|
+
this.pages.push([]);
|
|
26
|
+
this.current = this.pages.length - 1;
|
|
27
|
+
}
|
|
28
|
+
text(x, y, text, font = "Helvetica", size = 10, gray) {
|
|
29
|
+
this.pages[this.current].push({
|
|
30
|
+
kind: "text", x, y: PAGE_HEIGHT - y, text, font, size,
|
|
31
|
+
...(gray !== undefined ? { gray } : {}),
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
/** Texto alineado a la derecha del borde `x`. */
|
|
35
|
+
textRight(x, y, text, font = "Helvetica", size = 10, gray) {
|
|
36
|
+
this.text(x - measure(text, font, size), y, text, font, size, gray);
|
|
37
|
+
}
|
|
38
|
+
line(x1, y1, x2, y2, width = 0.5, gray = 0.75) {
|
|
39
|
+
this.pages[this.current].push({
|
|
40
|
+
kind: "line", x1, y1: PAGE_HEIGHT - y1, x2, y2: PAGE_HEIGHT - y2, width, gray,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
rect(x, y, w, h, gray) {
|
|
44
|
+
this.pages[this.current].push({ kind: "rect", x, y: PAGE_HEIGHT - y - h, w, h, gray });
|
|
45
|
+
}
|
|
46
|
+
/** Parte un texto en líneas que caben en `maxWidth`. */
|
|
47
|
+
static wrap(text, font, size, maxWidth) {
|
|
48
|
+
const words = text.split(/\s+/);
|
|
49
|
+
const lines = [];
|
|
50
|
+
let line = "";
|
|
51
|
+
for (const word of words) {
|
|
52
|
+
const candidate = line ? `${line} ${word}` : word;
|
|
53
|
+
if (measure(candidate, font, size) <= maxWidth) {
|
|
54
|
+
line = candidate;
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
if (line)
|
|
58
|
+
lines.push(line);
|
|
59
|
+
// Una palabra sola más ancha que la caja: se trunca en vez de desbordar.
|
|
60
|
+
line = measure(word, font, size) <= maxWidth ? word : truncate(word, font, size, maxWidth);
|
|
61
|
+
}
|
|
62
|
+
if (line)
|
|
63
|
+
lines.push(line);
|
|
64
|
+
return lines;
|
|
65
|
+
}
|
|
66
|
+
static truncate(text, font, size, maxWidth) {
|
|
67
|
+
return truncate(text, font, size, maxWidth);
|
|
68
|
+
}
|
|
69
|
+
static measure(text, font, size) {
|
|
70
|
+
return measure(text, font, size);
|
|
71
|
+
}
|
|
72
|
+
toBuffer() {
|
|
73
|
+
const objects = [];
|
|
74
|
+
const add = (body) => {
|
|
75
|
+
objects.push(Buffer.isBuffer(body) ? body : Buffer.from(body, "latin1"));
|
|
76
|
+
return objects.length; // los números de objeto empiezan en 1
|
|
77
|
+
};
|
|
78
|
+
// 1: catálogo, 2: árbol de páginas. Se reservan para poder referenciarlos
|
|
79
|
+
// antes de conocer los ids de las páginas.
|
|
80
|
+
add("<< /Type /Catalog /Pages 2 0 R >>");
|
|
81
|
+
add("");
|
|
82
|
+
const fontIds = {
|
|
83
|
+
Helvetica: add("<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica /Encoding /WinAnsiEncoding >>"),
|
|
84
|
+
"Helvetica-Bold": add("<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding >>"),
|
|
85
|
+
Courier: add("<< /Type /Font /Subtype /Type1 /BaseFont /Courier /Encoding /WinAnsiEncoding >>"),
|
|
86
|
+
};
|
|
87
|
+
const resources = `<< /Font << /F1 ${fontIds.Helvetica} 0 R /F2 ${fontIds["Helvetica-Bold"]} 0 R ` +
|
|
88
|
+
`/F3 ${fontIds.Courier} 0 R >> >>`;
|
|
89
|
+
const pageIds = [];
|
|
90
|
+
for (const ops of this.pages) {
|
|
91
|
+
const stream = Buffer.from(renderOps(ops), "latin1");
|
|
92
|
+
const contentId = add(Buffer.concat([
|
|
93
|
+
Buffer.from(`<< /Length ${stream.length} >>\nstream\n`, "latin1"),
|
|
94
|
+
stream,
|
|
95
|
+
Buffer.from("\nendstream", "latin1"),
|
|
96
|
+
]));
|
|
97
|
+
pageIds.push(add(`<< /Type /Page /Parent 2 0 R /MediaBox [0 0 ${PAGE_WIDTH} ${PAGE_HEIGHT}] ` +
|
|
98
|
+
`/Resources ${resources} /Contents ${contentId} 0 R >>`));
|
|
99
|
+
}
|
|
100
|
+
objects[1] = Buffer.from(`<< /Type /Pages /Kids [${pageIds.map((id) => `${id} 0 R`).join(" ")}] /Count ${pageIds.length} >>`, "latin1");
|
|
101
|
+
// Ensamblado con tabla xref.
|
|
102
|
+
const chunks = [Buffer.from("%PDF-1.4\n%\xE2\xE3\xCF\xD3\n", "latin1")];
|
|
103
|
+
let offset = chunks[0].length;
|
|
104
|
+
const offsets = [];
|
|
105
|
+
objects.forEach((body, index) => {
|
|
106
|
+
offsets.push(offset);
|
|
107
|
+
const chunk = Buffer.concat([
|
|
108
|
+
Buffer.from(`${index + 1} 0 obj\n`, "latin1"),
|
|
109
|
+
body,
|
|
110
|
+
Buffer.from("\nendobj\n", "latin1"),
|
|
111
|
+
]);
|
|
112
|
+
chunks.push(chunk);
|
|
113
|
+
offset += chunk.length;
|
|
114
|
+
});
|
|
115
|
+
const xrefStart = offset;
|
|
116
|
+
let xref = `xref\n0 ${objects.length + 1}\n0000000000 65535 f \n`;
|
|
117
|
+
for (const o of offsets)
|
|
118
|
+
xref += `${String(o).padStart(10, "0")} 00000 n \n`;
|
|
119
|
+
xref += `trailer\n<< /Size ${objects.length + 1} /Root 1 0 R >>\nstartxref\n${xrefStart}\n%%EOF\n`;
|
|
120
|
+
chunks.push(Buffer.from(xref, "latin1"));
|
|
121
|
+
return Buffer.concat(chunks);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
exports.PdfDocument = PdfDocument;
|
|
125
|
+
const FONT_KEY = {
|
|
126
|
+
Helvetica: "/F1", "Helvetica-Bold": "/F2", Courier: "/F3",
|
|
127
|
+
};
|
|
128
|
+
function renderOps(ops) {
|
|
129
|
+
const out = [];
|
|
130
|
+
let gray = -1;
|
|
131
|
+
for (const op of ops) {
|
|
132
|
+
if (op.kind === "text") {
|
|
133
|
+
const g = op.gray ?? 0;
|
|
134
|
+
if (g !== gray) {
|
|
135
|
+
out.push(`${g} g`);
|
|
136
|
+
gray = g;
|
|
137
|
+
}
|
|
138
|
+
out.push(`BT ${FONT_KEY[op.font]} ${op.size} Tf ${fmt(op.x)} ${fmt(op.y)} Td (${escapeText(op.text)}) Tj ET`);
|
|
139
|
+
}
|
|
140
|
+
else if (op.kind === "line") {
|
|
141
|
+
if (op.gray !== gray) {
|
|
142
|
+
out.push(`${op.gray} G`);
|
|
143
|
+
gray = -1;
|
|
144
|
+
}
|
|
145
|
+
out.push(`${op.width} w ${fmt(op.x1)} ${fmt(op.y1)} m ${fmt(op.x2)} ${fmt(op.y2)} l S`);
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
if (op.gray !== gray) {
|
|
149
|
+
out.push(`${op.gray} g`);
|
|
150
|
+
gray = op.gray;
|
|
151
|
+
}
|
|
152
|
+
out.push(`${fmt(op.x)} ${fmt(op.y)} ${fmt(op.w)} ${fmt(op.h)} re f`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return out.join("\n");
|
|
156
|
+
}
|
|
157
|
+
const fmt = (n) => n.toFixed(2);
|
|
158
|
+
/** Escapa y convierte a WinAnsi. Lo no representable cae a "?" antes que romper el PDF. */
|
|
159
|
+
function escapeText(text) {
|
|
160
|
+
let out = "";
|
|
161
|
+
for (const char of text) {
|
|
162
|
+
if (char === "(" || char === ")" || char === "\\") {
|
|
163
|
+
out += `\\${char}`;
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
const code = WINANSI[char] ?? (char.codePointAt(0) < 128 ? char.codePointAt(0) : 63);
|
|
167
|
+
out += code < 32 || code > 126 ? `\\${code.toString(8).padStart(3, "0")}` : String.fromCharCode(code);
|
|
168
|
+
}
|
|
169
|
+
return out;
|
|
170
|
+
}
|
|
171
|
+
/** Caracteres fuera de ASCII que una factura en español necesita. */
|
|
172
|
+
const WINANSI = {
|
|
173
|
+
"€": 0x80, "‚": 0x82, "„": 0x84, "…": 0x85, "‘": 0x91, "’": 0x92, "“": 0x93, "”": 0x94,
|
|
174
|
+
"•": 0x95, "–": 0x96, "—": 0x97, "¡": 0xa1, "¢": 0xa2, "£": 0xa3, "¥": 0xa5, "§": 0xa7,
|
|
175
|
+
"©": 0xa9, "ª": 0xaa, "«": 0xab, "°": 0xb0, "±": 0xb1, "º": 0xba, "»": 0xbb, "¿": 0xbf,
|
|
176
|
+
"Á": 0xc1, "Ä": 0xc4, "Ç": 0xc7, "É": 0xc9, "Í": 0xcd, "Ñ": 0xd1, "Ó": 0xd3, "Ö": 0xd6,
|
|
177
|
+
"Ú": 0xda, "Ü": 0xdc, "ß": 0xdf, "á": 0xe1, "â": 0xe2, "ä": 0xe4, "ç": 0xe7, "è": 0xe8,
|
|
178
|
+
"é": 0xe9, "ê": 0xea, "í": 0xed, "ï": 0xef, "ñ": 0xf1, "ó": 0xf3, "ô": 0xf4, "ö": 0xf6,
|
|
179
|
+
"ú": 0xfa, "ü": 0xfc,
|
|
180
|
+
};
|
|
181
|
+
/**
|
|
182
|
+
* Anchos de las fuentes base, en milésimas de em.
|
|
183
|
+
*
|
|
184
|
+
* Sin esto no hay alineación a la derecha, y una columna de importes desalineada
|
|
185
|
+
* es lo primero que delata una factura hecha a mano.
|
|
186
|
+
*/
|
|
187
|
+
const HELVETICA = buildWidths("278 278 355 556 556 889 667 191 333 333 389 584 278 333 278 278", // 32-47
|
|
188
|
+
"556 556 556 556 556 556 556 556 556 556 278 278 584 584 584 556", // 48-63
|
|
189
|
+
"1015 667 667 722 722 667 611 778 722 278 500 667 556 833 722 778", // 64-79
|
|
190
|
+
"667 778 722 667 611 722 667 944 667 667 611 278 278 278 469 556", // 80-95
|
|
191
|
+
"333 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556", // 96-111
|
|
192
|
+
"556 556 333 500 278 556 500 722 500 500 500 334 260 334 584 350"); // 112-127
|
|
193
|
+
const HELVETICA_BOLD = buildWidths("278 333 474 556 556 889 722 238 333 333 389 584 278 333 278 278", "556 556 556 556 556 556 556 556 556 556 333 333 584 584 584 611", "975 722 722 722 722 667 611 778 722 278 556 722 611 833 722 778", "667 778 722 667 611 722 667 944 667 667 611 333 278 333 584 556", "333 556 611 556 611 556 333 611 611 278 278 556 278 889 611 611", "611 611 389 556 333 611 556 778 556 556 500 389 280 389 584 350");
|
|
194
|
+
function buildWidths(...rows) {
|
|
195
|
+
const widths = {};
|
|
196
|
+
rows.forEach((row, rowIndex) => {
|
|
197
|
+
row.split(" ").forEach((value, i) => { widths[32 + rowIndex * 16 + i] = Number(value); });
|
|
198
|
+
});
|
|
199
|
+
return widths;
|
|
200
|
+
}
|
|
201
|
+
function measure(text, font, size) {
|
|
202
|
+
if (font === "Courier")
|
|
203
|
+
return text.length * 0.6 * size;
|
|
204
|
+
const table = font === "Helvetica-Bold" ? HELVETICA_BOLD : HELVETICA;
|
|
205
|
+
let width = 0;
|
|
206
|
+
for (const char of text) {
|
|
207
|
+
const code = WINANSI[char] ?? char.codePointAt(0);
|
|
208
|
+
// Las vocales acentuadas miden lo mismo que su vocal base en las fuentes
|
|
209
|
+
// base de PDF, así que el fallback es exacto para el español.
|
|
210
|
+
width += table[code] ?? table[BASE_LETTER[char]?.codePointAt(0) ?? 110] ?? 556;
|
|
211
|
+
}
|
|
212
|
+
return (width / 1000) * size;
|
|
213
|
+
}
|
|
214
|
+
const BASE_LETTER = {
|
|
215
|
+
"á": "a", "é": "e", "í": "i", "ó": "o", "ú": "u", "ü": "u", "ñ": "n", "ç": "c",
|
|
216
|
+
"Á": "A", "É": "E", "Í": "I", "Ó": "O", "Ú": "U", "Ü": "U", "Ñ": "N", "Ç": "C",
|
|
217
|
+
"€": "E", "¿": "?", "¡": "!",
|
|
218
|
+
};
|
|
219
|
+
function truncate(text, font, size, maxWidth) {
|
|
220
|
+
const ellipsis = measure("...", font, size);
|
|
221
|
+
let out = "";
|
|
222
|
+
for (const char of text) {
|
|
223
|
+
if (measure(out + char, font, size) + ellipsis > maxWidth)
|
|
224
|
+
return `${out}...`;
|
|
225
|
+
out += char;
|
|
226
|
+
}
|
|
227
|
+
return out;
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=pdf.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf.js","sourceRoot":"","sources":["../../src/export/pdf.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf.test.d.ts","sourceRoot":"","sources":["../../src/export/pdf.test.ts"],"names":[],"mappings":""}
|