xonecode 0.26.0 → 0.26.1
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/apps/web/dist/assets/{EditorDeFichero-BOMIz5Wx.js → EditorDeFichero-BW6i19HW.js} +1 -1
- package/apps/web/dist/assets/{index-DTsPoUh_.js → index-CJycg35E.js} +19 -19
- package/apps/web/dist/assets/{php-BHWCwDKR.js → php-DxWUQTjM.js} +1 -1
- package/apps/web/dist/assets/{ruby-D3HLU4IP.js → ruby-gCKsUWxP.js} +1 -1
- package/apps/web/dist/index.html +1 -1
- package/dist/agent/cloudstudio/subida.js +99 -26
- package/dist/agent/cloudstudio/subida.js.map +1 -1
- package/dist/cli/main.js +7 -1
- package/dist/cli/main.js.map +1 -1
- package/dist/core/actos.js.map +1 -1
- package/dist/core/ports.js +22 -2
- package/dist/core/ports.js.map +1 -1
- package/dist/core/verificacionDeSubida.js +58 -0
- package/dist/core/verificacionDeSubida.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* La comprobación de lo que una subida dejó en CloudStudio: lo que se mandó contra lo que se
|
|
3
|
+
* relee. PURA, para poder probar el motivo sin red.
|
|
4
|
+
*
|
|
5
|
+
* Existe porque hay ficheros que se CORTAN al subirlos a Studio y la causa no se ha encontrado.
|
|
6
|
+
* Mientras tanto, cada texto subido se relee y se compara; un corte tiene que salir como fallo
|
|
7
|
+
* con cifras que se puedan medir —cuánto había, cuánto llegó, desde dónde difiere—, no como un
|
|
8
|
+
* «subido» que miente.
|
|
9
|
+
*
|
|
10
|
+
* La comparación normaliza SOLO dos transformaciones MEDIDAS contra el servidor real (una rama
|
|
11
|
+
* desechable de AppDemo), aplicadas a los dos lados:
|
|
12
|
+
* - **Studio quita el salto de línea FINAL** (o `studio_get_file` no lo devuelve): un
|
|
13
|
+
* «…'añadir';\n» de 76 B vuelve con 75 B, y un fichero de 457.890 B vuelve con 457.889 B,
|
|
14
|
+
* idéntico en todo lo demás. Un fichero SIN salto final vuelve idéntico.
|
|
15
|
+
* - **Studio convierte CRLF en LF** («\r\n» → «\n»).
|
|
16
|
+
* Nada más: el BOM se conserva, y tildes, emoji y «» llegan intactos, así que no se tocan.
|
|
17
|
+
* Normalizar a ciegas es justo cómo se esconde un corte; un corte de verdad (falta una línea,
|
|
18
|
+
* cambia algo en medio) sigue saliendo distinto. El motivo y los hashes se calculan sobre los
|
|
19
|
+
* textos EN CRUDO: son lo que hay de verdad a cada lado.
|
|
20
|
+
*/
|
|
21
|
+
import { createHash } from "node:crypto";
|
|
22
|
+
/** sha256 en hexadecimal minúsculo: el mismo formato que pide `studio_upload_file`. */
|
|
23
|
+
export function sha256Hex(datos) {
|
|
24
|
+
return createHash("sha256").update(datos).digest("hex");
|
|
25
|
+
}
|
|
26
|
+
/** Un número con el punto de miles del castellano, sin depender del ICU de la máquina. */
|
|
27
|
+
export function conMiles(n) {
|
|
28
|
+
return String(n).replace(/\B(?=(\d{3})+(?!\d))/g, ".");
|
|
29
|
+
}
|
|
30
|
+
/** Las dos transformaciones medidas de Studio (ver cabecera), y ninguna más. */
|
|
31
|
+
function comoLoGuardaStudio(texto) {
|
|
32
|
+
return texto.replace(/\r\n/g, "\n").replace(/\n+$/, "");
|
|
33
|
+
}
|
|
34
|
+
/** `undefined` = llegó igual. Si no, el motivo con las cifras y los dos hashes. */
|
|
35
|
+
export function diferenciaDeTexto(local, studio) {
|
|
36
|
+
if (comoLoGuardaStudio(local) === comoLoGuardaStudio(studio))
|
|
37
|
+
return undefined;
|
|
38
|
+
let desde = 0;
|
|
39
|
+
const tope = Math.min(local.length, studio.length);
|
|
40
|
+
while (desde < tope && local[desde] === studio[desde])
|
|
41
|
+
desde++;
|
|
42
|
+
const bytesLocal = Buffer.byteLength(local, "utf8");
|
|
43
|
+
const bytesStudio = Buffer.byteLength(studio, "utf8");
|
|
44
|
+
return {
|
|
45
|
+
motivo: `llegó distinto a Studio: ${conMiles(bytesLocal)} B en local, ${conMiles(bytesStudio)} B en Studio ` +
|
|
46
|
+
`(difieren desde el carácter ${conMiles(desde)})`,
|
|
47
|
+
sha256Local: sha256Hex(local),
|
|
48
|
+
sha256Studio: sha256Hex(studio),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/** Cuánto de un motivo de error remoto se deja en un fallo: lo justo para reconocerlo. */
|
|
52
|
+
const TOPE_DE_MOTIVO = 200;
|
|
53
|
+
/** El motivo de una relectura que no se pudo hacer: el fichero se escribió pero NO está comprobado. */
|
|
54
|
+
export function motivoSinComprobar(error) {
|
|
55
|
+
const corto = error.length > TOPE_DE_MOTIVO ? `${error.slice(0, TOPE_DE_MOTIVO)}…` : error;
|
|
56
|
+
return `subido pero no se pudo comprobar: ${corto}`;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=verificacionDeSubida.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verificacionDeSubida.js","sourceRoot":"","sources":["../../src/core/verificacionDeSubida.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,uFAAuF;AACvF,MAAM,UAAU,SAAS,CAAC,KAA0B;IAClD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,QAAQ,CAAC,CAAS;IAChC,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,uBAAuB,EAAE,GAAG,CAAC,CAAC;AACzD,CAAC;AASD,gFAAgF;AAChF,SAAS,kBAAkB,CAAC,KAAa;IACvC,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,iBAAiB,CAAC,KAAa,EAAE,MAAc;IAC7D,IAAI,kBAAkB,CAAC,KAAK,CAAC,KAAK,kBAAkB,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/E,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACnD,OAAO,KAAK,GAAG,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC;QAAE,KAAK,EAAE,CAAC;IAC/D,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACpD,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtD,OAAO;QACL,MAAM,EACJ,4BAA4B,QAAQ,CAAC,UAAU,CAAC,gBAAgB,QAAQ,CAAC,WAAW,CAAC,eAAe;YACpG,+BAA+B,QAAQ,CAAC,KAAK,CAAC,GAAG;QACnD,WAAW,EAAE,SAAS,CAAC,KAAK,CAAC;QAC7B,YAAY,EAAE,SAAS,CAAC,MAAM,CAAC;KAChC,CAAC;AACJ,CAAC;AAED,0FAA0F;AAC1F,MAAM,cAAc,GAAG,GAAG,CAAC;AAE3B,uGAAuG;AACvG,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;IAC3F,OAAO,qCAAqC,KAAK,EAAE,CAAC;AACtD,CAAC"}
|