estela 0.1.19 → 0.1.21
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/LICENSE +1 -1
- package/dist/billing/amortize.d.ts.map +1 -1
- package/dist/billing/amortize.js +3 -2
- package/dist/billing/amortize.js.map +1 -1
- package/dist/billing/invoice.d.ts.map +1 -1
- package/dist/billing/invoice.js +19 -18
- package/dist/billing/invoice.js.map +1 -1
- package/dist/billing/sessionize.d.ts.map +1 -1
- package/dist/billing/sessionize.js +3 -2
- package/dist/billing/sessionize.js.map +1 -1
- package/dist/billing.d.ts.map +1 -1
- package/dist/billing.js +5 -4
- package/dist/billing.js.map +1 -1
- package/dist/bin.js +6 -2
- package/dist/bin.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +311 -164
- package/dist/cli.js.map +1 -1
- package/dist/cloud/auth.d.ts.map +1 -1
- package/dist/cloud/auth.js +9 -8
- package/dist/cloud/auth.js.map +1 -1
- package/dist/cloud/client.d.ts.map +1 -1
- package/dist/cloud/client.js +11 -6
- package/dist/cloud/client.js.map +1 -1
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +4 -3
- package/dist/db/schema.js.map +1 -1
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +50 -45
- package/dist/doctor.js.map +1 -1
- package/dist/i18n/en.d.ts +10 -0
- package/dist/i18n/en.d.ts.map +1 -0
- package/dist/i18n/en.js +326 -0
- package/dist/i18n/en.js.map +1 -0
- package/dist/i18n/i18n.test.d.ts +2 -0
- package/dist/i18n/i18n.test.d.ts.map +1 -0
- package/dist/i18n/i18n.test.js +201 -0
- package/dist/i18n/i18n.test.js.map +1 -0
- package/dist/i18n/index.d.ts +54 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +106 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/publish.d.ts.map +1 -1
- package/dist/publish.js +6 -5
- package/dist/publish.js.map +1 -1
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +50 -25
- package/dist/server.js.map +1 -1
- package/dist/server.test.d.ts +2 -0
- package/dist/server.test.d.ts.map +1 -0
- package/dist/server.test.js +125 -0
- package/dist/server.test.js.map +1 -0
- package/dist/setup.d.ts.map +1 -1
- package/dist/setup.js +8 -5
- package/dist/setup.js.map +1 -1
- package/dist/sync/team.d.ts.map +1 -1
- package/dist/sync/team.js +7 -6
- package/dist/sync/team.js.map +1 -1
- package/dist/sync.d.ts.map +1 -1
- package/dist/sync.js +7 -6
- package/dist/sync.js.map +1 -1
- package/dist/team.d.ts.map +1 -1
- package/dist/team.js +9 -8
- package/dist/team.js.map +1 -1
- package/dist/updateCheck.d.ts.map +1 -1
- package/dist/updateCheck.js +3 -2
- package/dist/updateCheck.js.map +1 -1
- package/dist/watchers/claude.d.ts.map +1 -1
- package/dist/watchers/claude.js +3 -2
- package/dist/watchers/claude.js.map +1 -1
- package/dist/web-ui.test.js +96 -7
- package/dist/web-ui.test.js.map +1 -1
- package/node_modules/@estela/shared/dist/money.d.ts +1 -0
- package/node_modules/@estela/shared/dist/money.d.ts.map +1 -1
- package/node_modules/@estela/shared/dist/money.js +9 -1
- package/node_modules/@estela/shared/dist/money.js.map +1 -1
- package/package.json +1 -1
- package/web/app.js +213 -223
- package/web/i18n.js +635 -0
- package/web/index.html +40 -34
- package/web/lib.js +33 -8
|
@@ -0,0 +1,201 @@
|
|
|
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_fs_1 = require("node:fs");
|
|
8
|
+
const node_path_1 = require("node:path");
|
|
9
|
+
const node_test_1 = require("node:test");
|
|
10
|
+
const en_js_1 = require("./en.js");
|
|
11
|
+
const index_js_1 = require("./index.js");
|
|
12
|
+
/**
|
|
13
|
+
* El idioma de la terminal.
|
|
14
|
+
*
|
|
15
|
+
* El fallo que más cuesta ver es el silencioso: una frase marcada con tr`` sin
|
|
16
|
+
* traducción sale en español en mitad de una sesión en inglés, y nada falla.
|
|
17
|
+
* O una frase que alguien añade sin marcar. Los dos se buscan aquí leyendo el
|
|
18
|
+
* código con el compilador de TypeScript, no con expresiones regulares: las
|
|
19
|
+
* plantillas anidadas y los `${}` las harían fallar en los casos que importan.
|
|
20
|
+
*/
|
|
21
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
22
|
+
const ts = require("typescript");
|
|
23
|
+
const SRC = (0, node_path_1.join)(__dirname, "..", "..", "src");
|
|
24
|
+
function sourceFiles(dir) {
|
|
25
|
+
return (0, node_fs_1.readdirSync)(dir, { withFileTypes: true }).flatMap((entry) => {
|
|
26
|
+
const path = (0, node_path_1.join)(dir, entry.name);
|
|
27
|
+
if (entry.isDirectory())
|
|
28
|
+
return sourceFiles(path);
|
|
29
|
+
return path.endsWith(".ts") && !path.endsWith(".test.ts") ? [path] : [];
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
/** Todas las frases marcadas con tr`` del código, con su clave. */
|
|
33
|
+
function taggedPhrases() {
|
|
34
|
+
const found = [];
|
|
35
|
+
for (const file of sourceFiles(SRC)) {
|
|
36
|
+
const sf = ts.createSourceFile(file, (0, node_fs_1.readFileSync)(file, "utf8"), ts.ScriptTarget.Latest, true);
|
|
37
|
+
const visit = (node) => {
|
|
38
|
+
if (ts.isTaggedTemplateExpression(node) && ts.isIdentifier(node.tag) && node.tag.text === "tr") {
|
|
39
|
+
const t = node.template;
|
|
40
|
+
const parts = ts.isNoSubstitutionTemplateLiteral(t)
|
|
41
|
+
? [t.text]
|
|
42
|
+
: [t.head.text, ...t.templateSpans.map((span) => span.literal.text)];
|
|
43
|
+
const line = sf.getLineAndCharacterOfPosition(node.getStart(sf)).line + 1;
|
|
44
|
+
found.push({ key: (0, index_js_1.keyOf)(parts), where: `${(0, node_path_1.relative)(SRC, file)}:${line}` });
|
|
45
|
+
}
|
|
46
|
+
ts.forEachChild(node, visit);
|
|
47
|
+
};
|
|
48
|
+
visit(sf);
|
|
49
|
+
}
|
|
50
|
+
return found;
|
|
51
|
+
}
|
|
52
|
+
const huecos = (s) => [...s.matchAll(/\{(\d+)\}/g)].map((m) => m[1]).sort().join(",");
|
|
53
|
+
(0, node_test_1.test)("i18n: toda frase marcada en el código tiene traducción al inglés", () => {
|
|
54
|
+
const faltan = taggedPhrases().filter((f) => !(f.key in en_js_1.EN));
|
|
55
|
+
strict_1.default.deepEqual(faltan.map((f) => `${f.where} ${JSON.stringify(f.key)}`), [], "añade estas frases a i18n/en.ts");
|
|
56
|
+
});
|
|
57
|
+
(0, node_test_1.test)("i18n: el catálogo no guarda traducciones de frases que ya no existen", () => {
|
|
58
|
+
// Al cambiar una frase en español cambia su clave, y la traducción vieja se
|
|
59
|
+
// queda huérfana: no rompe nada, pero el catálogo se llena de basura que
|
|
60
|
+
// nadie sabe si puede borrar.
|
|
61
|
+
const vivas = new Set(taggedPhrases().map((f) => f.key));
|
|
62
|
+
const huerfanas = Object.keys(en_js_1.EN).filter((key) => !vivas.has(key));
|
|
63
|
+
strict_1.default.deepEqual(huerfanas, [], "estas claves de en.ts ya no están en el código");
|
|
64
|
+
});
|
|
65
|
+
(0, node_test_1.test)("i18n: cada traducción usa exactamente los mismos huecos", () => {
|
|
66
|
+
// "{1} bloques" traducido como "{0} blocks" pondría el número equivocado.
|
|
67
|
+
const mal = Object.entries(en_js_1.EN).filter(([es, en]) => huecos(es) !== huecos(en));
|
|
68
|
+
strict_1.default.deepEqual(mal, []);
|
|
69
|
+
});
|
|
70
|
+
(0, node_test_1.test)("i18n: no queda texto en español sin marcar en lo que se imprime", () => {
|
|
71
|
+
// La forma de romper el inglés sin que falle nada: un console.log nuevo con
|
|
72
|
+
// la frase escrita a pelo. Se miran los argumentos de console.* y de los
|
|
73
|
+
// errores que ve la persona.
|
|
74
|
+
const ERRORES = new Set(["UserError", "Error", "CloudError", "NoAccountError", "NotSyncedError", "InvoiceError"]);
|
|
75
|
+
const espanol = /[áéíóúñ¿¡]|\b(de|con|sin|por|para|los|las|del|una|hay|que|tu|tus|ya|al|en|es|no|se)\b/i;
|
|
76
|
+
const sueltas = [];
|
|
77
|
+
for (const file of sourceFiles(SRC)) {
|
|
78
|
+
const sf = ts.createSourceFile(file, (0, node_fs_1.readFileSync)(file, "utf8"), ts.ScriptTarget.Latest, true);
|
|
79
|
+
const literales = (node) => {
|
|
80
|
+
if (ts.isTaggedTemplateExpression(node))
|
|
81
|
+
return;
|
|
82
|
+
let texto = null;
|
|
83
|
+
if (ts.isStringLiteral(node) || ts.isNoSubstitutionTemplateLiteral(node))
|
|
84
|
+
texto = node.text;
|
|
85
|
+
if (ts.isTemplateExpression(node)) {
|
|
86
|
+
texto = [node.head.text, ...node.templateSpans.map((s) => s.literal.text)].join(" ");
|
|
87
|
+
}
|
|
88
|
+
if (texto !== null && /[a-záéíóúñ]{3}/i.test(texto) && espanol.test(texto)) {
|
|
89
|
+
const line = sf.getLineAndCharacterOfPosition(node.getStart(sf)).line + 1;
|
|
90
|
+
sueltas.push(`${(0, node_path_1.relative)(SRC, file)}:${line} ${JSON.stringify(texto).slice(0, 80)}`);
|
|
91
|
+
}
|
|
92
|
+
ts.forEachChild(node, literales);
|
|
93
|
+
};
|
|
94
|
+
const visit = (node) => {
|
|
95
|
+
const esConsola = ts.isCallExpression(node) && ts.isPropertyAccessExpression(node.expression) &&
|
|
96
|
+
ts.isIdentifier(node.expression.expression) && node.expression.expression.text === "console";
|
|
97
|
+
const esError = ts.isNewExpression(node) && ts.isIdentifier(node.expression) &&
|
|
98
|
+
ERRORES.has(node.expression.text);
|
|
99
|
+
if ((esConsola || esError) && node.arguments) {
|
|
100
|
+
for (const arg of node.arguments)
|
|
101
|
+
literales(arg);
|
|
102
|
+
}
|
|
103
|
+
ts.forEachChild(node, visit);
|
|
104
|
+
};
|
|
105
|
+
visit(sf);
|
|
106
|
+
}
|
|
107
|
+
strict_1.default.deepEqual(sueltas, [], "márcalas con tr``");
|
|
108
|
+
});
|
|
109
|
+
(0, node_test_1.test)("i18n: la ayuda en inglés documenta los mismos comandos y opciones", () => {
|
|
110
|
+
// Dos textos completos se separan fácil: se añade un comando en uno y el
|
|
111
|
+
// otro se queda sin él.
|
|
112
|
+
const cli = (0, node_fs_1.readFileSync)((0, node_path_1.join)(SRC, "cli.ts"), "utf8");
|
|
113
|
+
const bloque = (name) => {
|
|
114
|
+
const start = cli.indexOf(`const ${name} = \``);
|
|
115
|
+
strict_1.default.ok(start >= 0, `no encuentro ${name}`);
|
|
116
|
+
return cli.slice(start, cli.indexOf("\n`;", start));
|
|
117
|
+
};
|
|
118
|
+
const firma = (text) => ({
|
|
119
|
+
comandos: [...new Set([...text.matchAll(/^ {2}estela ([a-z-]+(?: [a-z-]+)?)/gm)].map((m) => m[1]))].sort(),
|
|
120
|
+
opciones: [...new Set([...text.matchAll(/--[a-z][a-z-]*/g)].map((m) => m[0]))].sort(),
|
|
121
|
+
});
|
|
122
|
+
strict_1.default.deepEqual(firma(bloque("HELP_EN")), firma(bloque("HELP_ES")));
|
|
123
|
+
});
|
|
124
|
+
(0, node_test_1.test)("i18n: tr deja el español tal cual y traduce al inglés", () => {
|
|
125
|
+
const antes = (0, index_js_1.getLang)();
|
|
126
|
+
try {
|
|
127
|
+
const nombre = "Web";
|
|
128
|
+
(0, index_js_1.setLang)("es");
|
|
129
|
+
strict_1.default.equal((0, index_js_1.tr) `Proyecto "${nombre}" guardado.`, 'Proyecto "Web" guardado.');
|
|
130
|
+
(0, index_js_1.setLang)("en");
|
|
131
|
+
strict_1.default.equal((0, index_js_1.tr) `Proyecto "${nombre}" guardado.`, 'Project "Web" saved.');
|
|
132
|
+
// Una frase sin traducción sale en español, no vacía ni con la clave rota.
|
|
133
|
+
strict_1.default.equal((0, index_js_1.tr) `Frase inventada ${nombre} que no está`, "Frase inventada Web que no está");
|
|
134
|
+
}
|
|
135
|
+
finally {
|
|
136
|
+
(0, index_js_1.setLang)(antes);
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
(0, node_test_1.test)("i18n: los huecos se pueden reordenar en la traducción", () => {
|
|
140
|
+
strict_1.default.equal((0, index_js_1.keyOf)(["a ", " b ", " c"]), "a {0} b {1} c");
|
|
141
|
+
// El valor 1 va donde la traducción diga {1}, esté donde esté.
|
|
142
|
+
const plantilla = "{1} antes que {0}";
|
|
143
|
+
const valores = ["uno", "dos"];
|
|
144
|
+
strict_1.default.equal(plantilla.replace(/\{(\d+)\}/g, (_, i) => valores[Number(i)]), "dos antes que uno");
|
|
145
|
+
});
|
|
146
|
+
(0, node_test_1.test)("i18n: langFromTag entiende las formas habituales y no se inventa idioma con C", () => {
|
|
147
|
+
strict_1.default.equal((0, index_js_1.langFromTag)("es_EC.UTF-8"), "es");
|
|
148
|
+
strict_1.default.equal((0, index_js_1.langFromTag)("es-ES"), "es");
|
|
149
|
+
strict_1.default.equal((0, index_js_1.langFromTag)("en_US.UTF-8"), "en");
|
|
150
|
+
strict_1.default.equal((0, index_js_1.langFromTag)("fr_FR.UTF-8"), "en", "un idioma sin traducción cae al inglés");
|
|
151
|
+
strict_1.default.equal((0, index_js_1.langFromTag)("C.UTF-8"), null, "C no dice ningún idioma");
|
|
152
|
+
strict_1.default.equal((0, index_js_1.langFromTag)("POSIX"), null);
|
|
153
|
+
strict_1.default.equal((0, index_js_1.langFromTag)(""), null);
|
|
154
|
+
strict_1.default.equal((0, index_js_1.langFromTag)(undefined), null);
|
|
155
|
+
});
|
|
156
|
+
(0, node_test_1.test)("i18n: detectLang, de lo más explícito a lo menos", () => {
|
|
157
|
+
const nunca = () => { throw new Error("no debería preguntar al sistema"); };
|
|
158
|
+
const base = { platform: "linux", appleLanguage: nunca, intlLocale: nunca };
|
|
159
|
+
strict_1.default.equal((0, index_js_1.detectLang)({ ...base, flag: "en", env: { ESTELA_LANG: "es", LANG: "es_ES.UTF-8" } }), "en", "--lang gana a todo");
|
|
160
|
+
strict_1.default.equal((0, index_js_1.detectLang)({ ...base, env: { ESTELA_LANG: "en", LANG: "es_ES.UTF-8" } }), "en", "ESTELA_LANG gana al entorno");
|
|
161
|
+
strict_1.default.equal((0, index_js_1.detectLang)({ ...base, env: { LC_ALL: "es_EC.UTF-8", LANG: "en_US.UTF-8" } }), "es", "LC_ALL gana a LANG");
|
|
162
|
+
strict_1.default.equal((0, index_js_1.detectLang)({ ...base, env: { LANG: "en_GB.UTF-8" } }), "en");
|
|
163
|
+
});
|
|
164
|
+
(0, node_test_1.test)("i18n: con LANG=C en macOS pregunta al sistema, no elige inglés", () => {
|
|
165
|
+
// El caso real: la terminal con LANG=C.UTF-8 en un Mac en español. Elegir
|
|
166
|
+
// inglés ahí pasaría a toda la gente que ya usa Estela a verla en inglés.
|
|
167
|
+
strict_1.default.equal((0, index_js_1.detectLang)({
|
|
168
|
+
env: { LANG: "C.UTF-8" }, platform: "darwin",
|
|
169
|
+
appleLanguage: () => "es-EC", intlLocale: () => "en-US",
|
|
170
|
+
}), "es");
|
|
171
|
+
strict_1.default.equal((0, index_js_1.detectLang)({
|
|
172
|
+
env: { LANG: "C.UTF-8" }, platform: "darwin",
|
|
173
|
+
appleLanguage: () => "en-GB", intlLocale: () => "es-ES",
|
|
174
|
+
}), "en");
|
|
175
|
+
});
|
|
176
|
+
(0, node_test_1.test)("i18n: sin nada que lo diga, Intl; y si tampoco, inglés", () => {
|
|
177
|
+
strict_1.default.equal((0, index_js_1.detectLang)({ env: {}, platform: "win32", intlLocale: () => "es-MX" }), "es");
|
|
178
|
+
strict_1.default.equal((0, index_js_1.detectLang)({ env: {}, platform: "linux", intlLocale: () => null }), "en");
|
|
179
|
+
strict_1.default.equal((0, index_js_1.detectLang)({ env: {}, platform: "darwin", appleLanguage: () => null, intlLocale: () => null }), "en");
|
|
180
|
+
});
|
|
181
|
+
(0, node_test_1.test)("i18n: dos peticiones a la vez no se pisan el idioma", async () => {
|
|
182
|
+
// El panel local puede atender a la vez una petición en inglés y otra en
|
|
183
|
+
// español. Con el idioma en una variable global, la que termina después
|
|
184
|
+
// cogería el de la otra en cuanto hubiera un await de por medio.
|
|
185
|
+
const antes = (0, index_js_1.getLang)();
|
|
186
|
+
(0, index_js_1.setLang)("es");
|
|
187
|
+
const espera = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
188
|
+
try {
|
|
189
|
+
const [en, es] = await Promise.all([
|
|
190
|
+
(0, index_js_1.withLang)("en", async () => { await espera(20); return (0, index_js_1.tr) `Invitación revocada.`; }),
|
|
191
|
+
(0, index_js_1.withLang)("es", async () => { await espera(5); return (0, index_js_1.tr) `Invitación revocada.`; }),
|
|
192
|
+
]);
|
|
193
|
+
strict_1.default.equal(en, "Invitation revoked.");
|
|
194
|
+
strict_1.default.equal(es, "Invitación revocada.");
|
|
195
|
+
strict_1.default.equal((0, index_js_1.tr) `Invitación revocada.`, "Invitación revocada.", "fuera de una petición, el de la terminal");
|
|
196
|
+
}
|
|
197
|
+
finally {
|
|
198
|
+
(0, index_js_1.setLang)(antes);
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
//# sourceMappingURL=i18n.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.test.js","sourceRoot":"","sources":["../../src/i18n/i18n.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Idioma de la terminal.
|
|
3
|
+
*
|
|
4
|
+
* La frase en español ES la clave: `tr` recibe la plantilla tal cual está
|
|
5
|
+
* escrita en el código y, en inglés, busca su traducción en `en.ts`. Es el
|
|
6
|
+
* esquema de gettext, y aquí encaja mejor que las claves inventadas de la web
|
|
7
|
+
* por dos razones: el código sigue leyéndose en español, como todo el
|
|
8
|
+
* proyecto, y marcar un texto no toca su lógica — solo se le pone delante la
|
|
9
|
+
* etiqueta. Un test recorre el código con el compilador de TypeScript y falla
|
|
10
|
+
* si alguna frase marcada no tiene traducción.
|
|
11
|
+
*
|
|
12
|
+
* tr`Tarifa de "${nombre}": ${importe}/hora`
|
|
13
|
+
* → clave 'Tarifa de "{0}": {1}/hora'
|
|
14
|
+
* → inglés 'Rate for "{0}": {1}/hour'
|
|
15
|
+
*
|
|
16
|
+
* Los huecos van numerados, así que el inglés puede reordenarlos.
|
|
17
|
+
*
|
|
18
|
+
* Este módulo lo carga también `bin.ts` para avisar de que Node es viejo, así
|
|
19
|
+
* que no puede usar nada que no exista en Node 16.
|
|
20
|
+
*/
|
|
21
|
+
export type Lang = "es" | "en";
|
|
22
|
+
export declare function setLang(lang: Lang): void;
|
|
23
|
+
export declare function getLang(): Lang;
|
|
24
|
+
/** Ejecuta `fn` con otro idioma solo para lo que ocurra dentro, incluidos los await. */
|
|
25
|
+
export declare function withLang<T>(lang: Lang, fn: () => T): T;
|
|
26
|
+
/** La clave de una plantilla: sus trozos fijos unidos por {0}, {1}… */
|
|
27
|
+
export declare function keyOf(strings: readonly string[]): string;
|
|
28
|
+
export declare function tr(strings: TemplateStringsArray, ...values: unknown[]): string;
|
|
29
|
+
/**
|
|
30
|
+
* "es_EC.UTF-8", "es-ES", "en" → el idioma que toca. Uno que no es ni español
|
|
31
|
+
* ni inglés cuenta como inglés: es la traducción que hay. "C" y "POSIX" no
|
|
32
|
+
* dicen ningún idioma, así que devuelven null y se sigue buscando.
|
|
33
|
+
*/
|
|
34
|
+
export declare function langFromTag(tag: string | null | undefined): Lang | null;
|
|
35
|
+
export interface LangInput {
|
|
36
|
+
readonly flag?: string | undefined;
|
|
37
|
+
readonly env: Record<string, string | undefined>;
|
|
38
|
+
readonly platform: string;
|
|
39
|
+
/** El primer idioma del sistema en macOS, o null. Inyectable para los tests. */
|
|
40
|
+
readonly appleLanguage?: () => string | null;
|
|
41
|
+
/** El locale que ve Intl. Inyectable para los tests. */
|
|
42
|
+
readonly intlLocale?: () => string | null;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* De qué idioma hablarle a esta persona, de más a menos explícito.
|
|
46
|
+
*
|
|
47
|
+
* El orden importa por un caso muy concreto: en macOS la terminal suele traer
|
|
48
|
+
* `LANG=C.UTF-8`, que no dice nada, aunque el sistema esté en español. Si con
|
|
49
|
+
* eso bastara para elegir inglés, toda la gente que ya usa Estela en español
|
|
50
|
+
* pasaría a verla en inglés al actualizar. Por eso "C" no decide, y en ese caso
|
|
51
|
+
* se pregunta al sistema.
|
|
52
|
+
*/
|
|
53
|
+
export declare function detectLang(input: LangInput): Lang;
|
|
54
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/i18n/index.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,MAAM,MAAM,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAa/B,wBAAgB,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAoB;AAC7D,wBAAgB,OAAO,IAAI,IAAI,CAAyC;AAExE,wFAAwF;AACxF,wBAAgB,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAEtD;AAED,uEAAuE;AACvE,wBAAgB,KAAK,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAIxD;AAED,wBAAgB,EAAE,CAAC,OAAO,EAAE,oBAAoB,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAS9E;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,GAAG,IAAI,CAKvE;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACjD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,gFAAgF;IAChF,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IAC7C,wDAAwD;IACxD,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;CAC3C;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAkBjD"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.setLang = setLang;
|
|
4
|
+
exports.getLang = getLang;
|
|
5
|
+
exports.withLang = withLang;
|
|
6
|
+
exports.keyOf = keyOf;
|
|
7
|
+
exports.tr = tr;
|
|
8
|
+
exports.langFromTag = langFromTag;
|
|
9
|
+
exports.detectLang = detectLang;
|
|
10
|
+
const node_async_hooks_1 = require("node:async_hooks");
|
|
11
|
+
const node_child_process_1 = require("node:child_process");
|
|
12
|
+
const en_js_1 = require("./en.js");
|
|
13
|
+
let current = "es";
|
|
14
|
+
/*
|
|
15
|
+
* El idioma de una petición concreta del panel local. `estela web` sirve a un
|
|
16
|
+
* navegador que puede estar en otro idioma que la terminal que lo arrancó: un
|
|
17
|
+
* error lanzado dentro de una petición tiene que salir en el del navegador, y
|
|
18
|
+
* lo que imprime la terminal, en el suyo. Con una variable global se pisarían
|
|
19
|
+
* entre peticiones simultáneas; AsyncLocalStorage lo ata a cada una.
|
|
20
|
+
*/
|
|
21
|
+
const scoped = new node_async_hooks_1.AsyncLocalStorage();
|
|
22
|
+
function setLang(lang) { current = lang; }
|
|
23
|
+
function getLang() { return scoped.getStore() ?? current; }
|
|
24
|
+
/** Ejecuta `fn` con otro idioma solo para lo que ocurra dentro, incluidos los await. */
|
|
25
|
+
function withLang(lang, fn) {
|
|
26
|
+
return scoped.run(lang, fn);
|
|
27
|
+
}
|
|
28
|
+
/** La clave de una plantilla: sus trozos fijos unidos por {0}, {1}… */
|
|
29
|
+
function keyOf(strings) {
|
|
30
|
+
let key = strings[0] ?? "";
|
|
31
|
+
for (let i = 1; i < strings.length; i++)
|
|
32
|
+
key += `{${i - 1}}` + strings[i];
|
|
33
|
+
return key;
|
|
34
|
+
}
|
|
35
|
+
function tr(strings, ...values) {
|
|
36
|
+
const key = keyOf(strings);
|
|
37
|
+
// Sin traducción cae al español en vez de romper: mejor una frase en el otro
|
|
38
|
+
// idioma que un hueco. El test es quien impide que eso llegue a publicarse.
|
|
39
|
+
const template = getLang() === "en" ? (en_js_1.EN[key] ?? key) : key;
|
|
40
|
+
return template.replace(/\{(\d+)\}/g, (match, index) => {
|
|
41
|
+
const i = Number(index);
|
|
42
|
+
return i < values.length ? String(values[i]) : match;
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* "es_EC.UTF-8", "es-ES", "en" → el idioma que toca. Uno que no es ni español
|
|
47
|
+
* ni inglés cuenta como inglés: es la traducción que hay. "C" y "POSIX" no
|
|
48
|
+
* dicen ningún idioma, así que devuelven null y se sigue buscando.
|
|
49
|
+
*/
|
|
50
|
+
function langFromTag(tag) {
|
|
51
|
+
if (!tag)
|
|
52
|
+
return null;
|
|
53
|
+
const base = tag.trim().toLowerCase().split(/[_.@-]/)[0] ?? "";
|
|
54
|
+
if (!base || base === "c" || base === "posix")
|
|
55
|
+
return null;
|
|
56
|
+
return base === "es" ? "es" : "en";
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* De qué idioma hablarle a esta persona, de más a menos explícito.
|
|
60
|
+
*
|
|
61
|
+
* El orden importa por un caso muy concreto: en macOS la terminal suele traer
|
|
62
|
+
* `LANG=C.UTF-8`, que no dice nada, aunque el sistema esté en español. Si con
|
|
63
|
+
* eso bastara para elegir inglés, toda la gente que ya usa Estela en español
|
|
64
|
+
* pasaría a verla en inglés al actualizar. Por eso "C" no decide, y en ese caso
|
|
65
|
+
* se pregunta al sistema.
|
|
66
|
+
*/
|
|
67
|
+
function detectLang(input) {
|
|
68
|
+
const fromFlag = input.flag === "es" || input.flag === "en" ? input.flag : null;
|
|
69
|
+
if (fromFlag)
|
|
70
|
+
return fromFlag;
|
|
71
|
+
const explicit = input.env["ESTELA_LANG"];
|
|
72
|
+
if (explicit === "es" || explicit === "en")
|
|
73
|
+
return explicit;
|
|
74
|
+
for (const name of ["LC_ALL", "LC_MESSAGES", "LANG"]) {
|
|
75
|
+
const lang = langFromTag(input.env[name]);
|
|
76
|
+
if (lang)
|
|
77
|
+
return lang;
|
|
78
|
+
}
|
|
79
|
+
if (input.platform === "darwin") {
|
|
80
|
+
const lang = langFromTag((input.appleLanguage ?? readAppleLanguage)());
|
|
81
|
+
if (lang)
|
|
82
|
+
return lang;
|
|
83
|
+
}
|
|
84
|
+
return langFromTag((input.intlLocale ?? readIntlLocale)()) ?? "en";
|
|
85
|
+
}
|
|
86
|
+
function readAppleLanguage() {
|
|
87
|
+
try {
|
|
88
|
+
// Formato: ( "es-EC", "en-EC" ). Tarda unos 10 ms y solo se llega aquí si
|
|
89
|
+
// el entorno no dice ya el idioma.
|
|
90
|
+
const out = (0, node_child_process_1.execFileSync)("defaults", ["read", "-g", "AppleLanguages"], { encoding: "utf8", timeout: 1000, stdio: ["ignore", "pipe", "ignore"] });
|
|
91
|
+
const match = /[A-Za-z]{2,3}(?:[-_][A-Za-z0-9]+)*/.exec(out);
|
|
92
|
+
return match ? match[0] : null;
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
function readIntlLocale() {
|
|
99
|
+
try {
|
|
100
|
+
return Intl.DateTimeFormat().resolvedOptions().locale;
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/i18n/index.ts"],"names":[],"mappings":"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"}
|
package/dist/publish.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../src/publish.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../src/publish.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAehD;;;;;;;;;;GAUG;AAEH,qBAAa,cAAe,SAAQ,KAAK;CAAG;AAE5C,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B;;;;;;;OAOG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAwBD,wBAAsB,YAAY,CAAC,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CA8DpG"}
|
package/dist/publish.js
CHANGED
|
@@ -44,6 +44,7 @@ const team_js_1 = require("./metrics/team.js");
|
|
|
44
44
|
const team_js_2 = require("./team.js");
|
|
45
45
|
const git_js_1 = require("./watchers/git.js");
|
|
46
46
|
const identity_js_1 = require("./watchers/identity.js");
|
|
47
|
+
const index_js_1 = require("./i18n/index.js");
|
|
47
48
|
/**
|
|
48
49
|
* Publica un panel, alojado en la cuenta vinculada.
|
|
49
50
|
*
|
|
@@ -83,7 +84,7 @@ function commitsOfProject(db, repoPaths) {
|
|
|
83
84
|
async function publishPanel(db, options) {
|
|
84
85
|
const project = store.getProject(db, options.projectId);
|
|
85
86
|
if (!project)
|
|
86
|
-
throw new Error(`No existe el proyecto "${options.projectId}".`);
|
|
87
|
+
throw new Error((0, index_js_1.tr) `No existe el proyecto "${options.projectId}".`);
|
|
87
88
|
const client = store.getClient(db, project.clientId);
|
|
88
89
|
const rates = store.getRates(db, options.projectId);
|
|
89
90
|
// Reutilizar el token si se republica: el cliente ya tiene ese enlace
|
|
@@ -110,8 +111,8 @@ async function publishPanel(db, options) {
|
|
|
110
111
|
// en tu plan, y sin ella no hay a quién cargarle esa cuota.
|
|
111
112
|
const account = store.getCloudAccount(db);
|
|
112
113
|
if (!account) {
|
|
113
|
-
throw new NoAccountError(`Necesitas una cuenta para publicar. Vincúlala con:\n\n` +
|
|
114
|
-
` estela login --email tu@correo.com\n`);
|
|
114
|
+
throw new NoAccountError((0, index_js_1.tr) `Necesitas una cuenta para publicar. Vincúlala con:\n\n` +
|
|
115
|
+
(0, index_js_1.tr) ` estela login --email tu@correo.com\n`);
|
|
115
116
|
}
|
|
116
117
|
let result;
|
|
117
118
|
try {
|
|
@@ -124,8 +125,8 @@ async function publishPanel(db, options) {
|
|
|
124
125
|
// sobre cuántos paneles permite cada plan, y el CLI imprime CloudError
|
|
125
126
|
// limpio. Envolverlo lo convertía en un volcado de pila.
|
|
126
127
|
if (error instanceof client_js_1.CloudError && error.status === 401) {
|
|
127
|
-
throw new NoAccountError(`Tu sesión ya no vale. Vuelve a vincular la máquina:\n\n` +
|
|
128
|
-
` estela login --email tu@correo.com\n`);
|
|
128
|
+
throw new NoAccountError((0, index_js_1.tr) `Tu sesión ya no vale. Vuelve a vincular la máquina:\n\n` +
|
|
129
|
+
(0, index_js_1.tr) ` estela login --email tu@correo.com\n`);
|
|
129
130
|
}
|
|
130
131
|
throw error;
|
|
131
132
|
}
|
package/dist/publish.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publish.js","sourceRoot":"","sources":["../src/publish.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"publish.js","sourceRoot":"","sources":["../src/publish.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
|
+
import { type Server } from "node:http";
|
|
1
2
|
export interface ServerOptions {
|
|
2
3
|
readonly port?: number;
|
|
3
4
|
readonly dbPath?: string;
|
|
4
5
|
/** Cada cuánto reimportar. 0 lo desactiva. */
|
|
5
6
|
readonly autoImportMinutes?: number;
|
|
7
|
+
/** Solo para tests: recibe el servidor para poder cerrarlo al terminar. */
|
|
8
|
+
readonly onServer?: (server: Server) => void;
|
|
6
9
|
}
|
|
7
10
|
export interface ImportStatus {
|
|
8
11
|
readonly at: string;
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsC,KAAK,MAAM,EAAuB,MAAM,WAAW,CAAC;AAoEjG,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,8CAA8C;IAC9C,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,2EAA2E;IAC3E,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C;AA6ED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,gFAAgF;IAChF,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAcD,wBAAgB,eAAe,IAAI,YAAY,GAAG,IAAI,CAErD;AA2CD,wBAAgB,WAAW,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAkBxE"}
|