@mostajs/mjs-unit 0.7.0 → 0.9.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 CHANGED
@@ -89,12 +89,41 @@ npm run build >/dev/null
89
89
  node node_modules/@mostajs/mjs-unit/bin/cli.mjs test-scripts/*.test.mjs
90
90
  ```
91
91
 
92
+ ## Rapport JUnit XML (0.8.0)
93
+
94
+ ```bash
95
+ mjs-unit test-scripts/*.test.mjs --junit=test-scripts/.out/junit.xml --timeout=10000
96
+ ```
97
+
98
+ Le fichier suit le schéma lu par Jenkins, GitLab (`artifacts:reports:junit`), GitHub et QATrax : une
99
+ `<testsuite>` par fichier, un `<testcase name classname file time>` par cas, `<failure>` pour une assertion
100
+ tombée, `<error>` pour une exception inattendue ou un délai dépassé, `<skipped message>` pour un cas ignoré,
101
+ les étiquettes en `<property name="tag">`. `--tag=securite` ne joue que les cas étiquetés.
102
+
103
+ ## Compte rendu de validation — cycle CRA (0.9.0)
104
+
105
+ ```bash
106
+ npx mjs-sbom # la SBOM de la version publiée (@mostajs/mjs-sbom)
107
+ npx mjs-unit test-scripts/**/*.test.mjs \
108
+ --sbom=sbom.cyclonedx.json --plan=docs/DEVTEST-PLAN.<projet>.json \
109
+ --compte-rendu --ctrf --intoto
110
+ # 📄 Compte rendu : test-scripts/.out/compte-rendu.json — @acme/produit@1.2.0 — verdict : conforme
111
+ npx mjs-unit-menu # ou le menu : essais, SBOM, compte rendu, envoi à qatrax.dev
112
+ ```
113
+
114
+ Le compte rendu lie les résultats à la version (lue dans la SBOM), au plan et aux scripts (empreintes) ; son verdict
115
+ est `conforme`, `non conforme` ou `incomplet` (avec les défauts) ; il s'écrit toujours. qatrax.dev l'enregistre, le
116
+ relie à l'analyse des vulnérabilités de la même SBOM, et scelle le dossier.
117
+
92
118
  ## API
93
119
 
94
120
  | Fonction | Rôle |
95
121
  |---|---|
96
- | `test(name, fn)` / `test.skip(...)` | Enregistre un cas (sync ou async) |
97
- | `describe(group, body)` | Préfixe les cas du groupe |
122
+ | `test(name, fn, { timeout?, tags? })` | Enregistre un cas (sync ou async) ; délai et étiquettes à la JUnit |
123
+ | `test.skip(name, fn?, raison?)` | Cas ignoré, raison rapportée (`@Disabled`) |
124
+ | `test.each(table)(name, fn)` | Un cas par ligne ; `%s`, `%i`, `$cle` dans le nom (`@ParameterizedTest`) |
125
+ | `describe(group, body)` | Groupe : préfixe les noms, et devient le `classname` JUnit |
126
+ | `beforeAll/afterAll/beforeEach/afterEach(fn)` | Crochets, au niveau du fichier ou d'un `describe` |
98
127
  | `expect(v).toBe/toEqual/toBeTruthy/toBeFalsy/toContain` | Assertions fluides |
99
128
  | `ok/equal/deepEqual(...)` | Assertions directes |
100
129
  | `throwsAsync/doesNotThrowAsync(fn)` | Vérifie qu'une promesse (ne) lève (pas) |
package/bin/cli.mjs CHANGED
@@ -6,16 +6,29 @@
6
6
  * Usage : mjs-unit <fichier-de-test...> [options]
7
7
  * --report[=fichier] écrit une preuve HTML (défaut : test-report.html)
8
8
  * --json[=fichier] écrit un rapport JSON (défaut : test-report.json)
9
- * --title="…" titre du rapport HTML
9
+ * --junit[=fichier] écrit un rapport JUnit XML (défaut : test-report.xml) — Jenkins, GitLab, GitHub, QATrax
10
+ * --timeout=ms délai par défaut de chaque cas (un cas le surcharge par { timeout })
11
+ * --tag=a,b ne joue que les cas étiquetés a ou b ; les autres sont rapportés ignorés
12
+ * --title="…" titre des rapports
13
+ * 0.9.0 — LE COMPTE RENDU DE VALIDATION (cycle CRA) :
14
+ * --sbom=fichier la version éprouvée, LUE dans la SBOM CycloneDX (nom, version, purl, serialNumber, empreinte)
15
+ * --plan=fichier le DEVTEST-PLAN (empreinte ; cas rattachés par leur ref ; cas du plan non exécutés relevés)
16
+ * --compte-rendu[=f] écrit le compte rendu mostajs-compte-rendu/1 (défaut : test-scripts/.out/compte-rendu.json),
17
+ * TOUJOURS — même invalide, avec ses défauts ; le code de sortie reste celui des essais
18
+ * --ctrf[=f] export CTRF (défaut : test-scripts/.out/ctrf.json)
19
+ * --intoto[=f] énoncé in-toto test-result v0.1, non signé (défaut : test-scripts/.out/test-result.intoto.json)
10
20
  *
11
21
  * @author Dr Hamid MADANI <drmdh@msn.com> · AGPL-3.0-or-later
12
22
  */
13
23
  import { register } from "node:module";
14
24
  import { pathToFileURL } from "node:url";
15
- import { writeFileSync } from "node:fs";
25
+ import { writeFileSync, readFileSync, mkdirSync } from "node:fs";
26
+ import { hostname } from "node:os";
27
+ import { createHash } from "node:crypto";
28
+ import { dirname } from "node:path";
16
29
 
17
30
  register(new URL("../loader.mjs", import.meta.url));
18
- const { run, pending, registered, takeRuns } = await import("../dist/index.js");
31
+ const { run, pending, registered, takeRuns, setDefaultTimeout, setTagFilter } = await import("../dist/index.js");
19
32
 
20
33
  // ── Découpe arguments / options ──────────────────────────────────────────────
21
34
  const argv = process.argv.slice(2);
@@ -27,8 +40,13 @@ const opt = (name) => {
27
40
  };
28
41
  const htmlOut = opt("report"); // "" si présent sans valeur, undefined si absent
29
42
  const jsonOut = opt("json");
43
+ const junitOut = opt("junit");
30
44
  const title = opt("title");
45
+ if (opt("timeout")) setDefaultTimeout(Number(opt("timeout")));
46
+ if (opt("tag")) setTagFilter(opt("tag").split(","));
47
+ const crOut = opt("compte-rendu"), ctrfOut = opt("ctrf"), intotoOut = opt("intoto"), sbomIn = opt("sbom"), planIn = opt("plan");
31
48
  const files = argv.filter((a) => !a.startsWith("--"));
49
+ const debut = new Date().toISOString();
32
50
  if (!files.length) { console.error("usage: mjs-unit <fichier-de-test...> [--report[=f]] [--json[=f]]"); process.exit(2); }
33
51
 
34
52
  // ── Exécution, une suite par fichier ─────────────────────────────────────────
@@ -44,26 +62,28 @@ for (const f of files) {
44
62
  if (pending() > 0) await run(f); // on exécute les cas restants, groupés par fichier
45
63
  const declares = registered() - avant;
46
64
  const executions = takeRuns();
47
- const results = executions.flatMap((r) => r.results);
65
+ const { classnameDe } = await import("../dist/report.js");
66
+ const results = executions.flatMap((r) => r.results).map((r) => ({ ...r, classname: classnameDe(f, r.groups) }));
67
+ const cas = results.filter((r) => !r.hook); // un crochet en échec est rapporté, mais n'est pas un cas déclaré
48
68
  totalFail += executions.reduce((n, r) => n + r.failed, 0);
49
69
  if (declares === 0) {
50
70
  console.error(`\n✗ ${f} : aucun test enregistré — un fichier de test vide n'est pas un succès.`);
51
71
  totalFail++;
52
72
  continue;
53
73
  }
54
- if (results.length !== declares) {
55
- console.error(`\n✗ ${f} : ${declares} test(s) enregistré(s), ${results.length} exécuté(s).`);
74
+ if (cas.length !== declares) {
75
+ console.error(`\n✗ ${f} : ${declares} test(s) enregistré(s), ${cas.length} exécuté(s).`);
56
76
  totalFail++;
57
77
  }
58
- totalDeclares += declares; totalExecutes += results.length;
78
+ totalDeclares += declares; totalExecutes += cas.length;
59
79
  suites.push({ file: f, results });
60
80
  }
61
81
  console.log(`\n${totalExecutes === totalDeclares ? "✓" : "✗"} ${totalExecutes}/${totalDeclares} test(s) exécutés sur ${suites.length} fichier(s) — compte relevé auprès du module, pas supposé`);
62
82
 
63
83
  // ── Reporters optionnels ─────────────────────────────────────────────────────
64
- if (htmlOut !== undefined || jsonOut !== undefined) {
65
- const { renderHtmlReport, renderJsonReport } = await import("../dist/report.js");
66
- const report = { suites, generatedAt: new Date().toISOString(), title: title || undefined };
84
+ if (htmlOut !== undefined || jsonOut !== undefined || junitOut !== undefined) {
85
+ const { renderHtmlReport, renderJsonReport, renderJunitReport } = await import("../dist/report.js");
86
+ const report = { suites, generatedAt: new Date().toISOString(), title: title || undefined, hostname: hostname() };
67
87
  if (htmlOut !== undefined) {
68
88
  const out = htmlOut || "test-report.html";
69
89
  writeFileSync(out, renderHtmlReport(report));
@@ -74,6 +94,38 @@ if (htmlOut !== undefined || jsonOut !== undefined) {
74
94
  writeFileSync(out, renderJsonReport(report));
75
95
  console.log(`📄 Rapport JSON : ${out}`);
76
96
  }
97
+ if (junitOut !== undefined) {
98
+ const out = junitOut || "test-report.xml";
99
+ writeFileSync(out, renderJunitReport(report));
100
+ console.log(`📄 Rapport JUnit XML : ${out}`);
101
+ }
102
+ }
103
+
104
+ // ── 0.9.0 — le compte rendu de validation, écrit TOUJOURS quand il est demandé (même invalide) ─────────────
105
+ if (crOut !== undefined || ctrfOut !== undefined || intotoOut !== undefined) {
106
+ const { construireCompteRendu, renderCtrf, renderInTotoTestResult } = await import("../dist/report.js");
107
+ const sha = (b) => createHash("sha256").update(b).digest("hex");
108
+ const piece = (f) => { const b = readFileSync(f); return { fichier: f, sha256: sha(b), contenu: JSON.parse(b.toString("utf8")) }; };
109
+ const lire = (f) => { if (!f) return { p: null }; try { return { p: piece(f) }; } catch (e) { return { p: null, e: `${f} — ${e?.code ?? e?.message ?? e}` }; } };
110
+ const s = lire(sbomIn), pl = lire(planIn);
111
+ const moi = JSON.parse(readFileSync(new URL("../package.json", import.meta.url), "utf8"));
112
+ const env = process.env;
113
+ const ci = env.CI_PIPELINE_URL || env.CI_JOB_URL || (env.GITHUB_RUN_ID && env.GITHUB_SERVER_URL && env.GITHUB_REPOSITORY ? `${env.GITHUB_SERVER_URL}/${env.GITHUB_REPOSITORY}/actions/runs/${env.GITHUB_RUN_ID}` : undefined);
114
+ const cr = construireCompteRendu({ suites, generatedAt: new Date().toISOString(), title: title || undefined, hostname: hostname() }, {
115
+ sbom: s.p, sbomErreur: s.e, plan: pl.p, planErreur: pl.e,
116
+ scripts: files.map((f) => { try { return { fichier: f, sha256: sha(readFileSync(f)) }; } catch { return { fichier: f, sha256: "" }; } }),
117
+ environnement: { node: process.version, plateforme: `${process.platform}-${process.arch}`, hote: hostname(), ...(ci ? { ci } : {}), debut, fin: new Date().toISOString() },
118
+ declares: totalDeclares, outil: { name: moi.name, version: moi.version },
119
+ });
120
+ const ecrire = (f, texte) => { mkdirSync(dirname(f), { recursive: true }); writeFileSync(f, texte); return sha(texte); };
121
+ const exports_ = {};
122
+ if (ctrfOut !== undefined) { const f = ctrfOut || "test-scripts/.out/ctrf.json"; exports_.ctrf = ecrire(f, renderCtrf(cr)); console.log(`📄 CTRF : ${f}`); }
123
+ if (intotoOut !== undefined) { const f = intotoOut || "test-scripts/.out/test-result.intoto.json"; exports_.intoto = ecrire(f, renderInTotoTestResult(cr)); console.log(`📄 in-toto test-result : ${f}`); }
124
+ if (crOut !== undefined) {
125
+ const f = crOut || "test-scripts/.out/compte-rendu.json";
126
+ ecrire(f, `${JSON.stringify({ ...cr, integrite: { algorithme: "sha256", empreinte: sha(JSON.stringify(cr)), exports: exports_ } }, null, 2)}\n`);
127
+ console.log(`📄 Compte rendu : ${f} — ${cr.produit.nom}@${cr.produit.version} — verdict : ${cr.synthese.verdict}${cr.defauts.length ? ` (${cr.defauts.length} défaut(s))` : ""}`);
128
+ }
77
129
  }
78
130
 
79
131
  if (totalFail > 0) process.exitCode = 1;
@@ -0,0 +1,99 @@
1
+ #!/usr/bin/env bash
2
+ #
3
+ # mjs-unit-menu — le cycle de validation en un menu (0.9.0) : essais → SBOM → compte rendu → qatrax.dev.
4
+ #
5
+ # 1) lancer les essais (rapports HTML, JSON, JUnit)
6
+ # 2) générer ou continuer la SBOM (npx mjs-sbom --diff)
7
+ # 3) compte rendu complet : SBOM + plan + essais + CTRF + in-toto
8
+ # 4) envoyer à qatrax.dev : POST /sbom puis POST /runs (le compte rendu), clé de CI du projet
9
+ # 5) lire les vulnérabilités de la version sur qatrax.dev (GET /vulnerabilites)
10
+ # 6) afficher le dernier compte rendu (verdict, défauts)
11
+ #
12
+ # Sans interaction : mjs-unit-menu --choix=N (CI, scripts).
13
+ # Variables : MJS_TESTS (fichiers d'essai, motif shell ; défaut test-scripts/**/*.test.mjs), MJS_SBOM (défaut
14
+ # sbom.cyclonedx.json), MJS_PLAN (défaut : premier docs/DEVTEST-PLAN*.json), MJS_OUT (défaut test-scripts/.out),
15
+ # QATRAX_URL, QATRAX_CLE (clé de CI, lue dans l'environnement, jamais écrite), QATRAX_PROJET.
16
+ #
17
+ # @author Dr Hamid MADANI <drmdh@msn.com> · AGPL-3.0-or-later
18
+ set -uo pipefail
19
+ shopt -s globstar nullglob
20
+
21
+ ICI="$(cd "$(dirname "$(readlink -f "$0")")" && pwd)"
22
+ CLI="${MJS_UNIT_CLI:-$ICI/cli.mjs}"
23
+ OUT="${MJS_OUT:-test-scripts/.out}"
24
+ SBOM="${MJS_SBOM:-sbom.cyclonedx.json}"
25
+ PLAN="${MJS_PLAN:-$(ls docs/DEVTEST-PLAN*.json 2>/dev/null | head -1)}"
26
+ CR="$OUT/compte-rendu.json"
27
+
28
+ essais() { local motif="${MJS_TESTS:-test-scripts/**/*.test.mjs}"; local f; f=( $motif ); printf '%s\n' "${f[@]}"; }
29
+
30
+ lancer_essais() {
31
+ mkdir -p "$OUT"; mapfile -t F < <(essais)
32
+ [ ${#F[@]} -gt 0 ] || { echo "✗ aucun fichier d'essai (MJS_TESTS)"; return 2; }
33
+ node "$CLI" "${F[@]}" --report="$OUT/report.html" --json="$OUT/report.json" --junit="$OUT/report.xml"
34
+ }
35
+
36
+ generer_sbom() {
37
+ npx --no-install mjs-sbom --diff || { echo "✗ @mostajs/mjs-sbom n'est pas installé (npm i -D @mostajs/mjs-sbom)"; return 2; }
38
+ }
39
+
40
+ compte_rendu() {
41
+ mkdir -p "$OUT"; mapfile -t F < <(essais)
42
+ [ ${#F[@]} -gt 0 ] || { echo "✗ aucun fichier d'essai (MJS_TESTS)"; return 2; }
43
+ local opts=(--compte-rendu="$CR" --ctrf="$OUT/ctrf.json" --intoto="$OUT/test-result.intoto.json" --json="$OUT/report.json" --junit="$OUT/report.xml")
44
+ [ -f "$SBOM" ] && opts+=(--sbom="$SBOM") || echo "⚠ pas de SBOM ($SBOM) : le compte rendu sera « incomplet » (choix 2)"
45
+ [ -n "$PLAN" ] && [ -f "$PLAN" ] && opts+=(--plan="$PLAN")
46
+ node "$CLI" "${F[@]}" "${opts[@]}"
47
+ }
48
+
49
+ # Les appels à qatrax.dev passent par Node (fetch) : pas de dépendance à curl, et la clé ne paraît dans aucune ligne de commande.
50
+ qatrax() { # $1 = action (envoyer | vulnerabilites)
51
+ : "${QATRAX_URL:?QATRAX_URL manquante}" "${QATRAX_CLE:?QATRAX_CLE manquante (clé de CI du projet)}" "${QATRAX_PROJET:?QATRAX_PROJET manquant}"
52
+ ACTION="$1" SBOM="$SBOM" CR="$CR" node --input-type=module -e '
53
+ import { readFileSync, existsSync } from "node:fs";
54
+ const { QATRAX_URL: base, QATRAX_CLE: cle, QATRAX_PROJET: p, ACTION, SBOM, CR } = process.env;
55
+ const e = encodeURIComponent; const auth = { authorization: `Bearer ${cle}` };
56
+ if (!existsSync(CR)) { console.error(`✗ pas de compte rendu (${CR}) : choix 3 d’abord`); process.exit(2); }
57
+ const cr = JSON.parse(readFileSync(CR, "utf8")); const v = cr.produit?.version ?? "inconnue";
58
+ const appel = async (methode, chemin, corps) => {
59
+ const r = await fetch(`${base}${chemin}`, { method: methode, headers: { ...auth, ...(corps ? { "content-type": "application/json" } : { accept: "application/json" }) }, body: corps });
60
+ const t = await r.text(); console.log(`${r.ok ? "✓" : "✗"} ${methode} ${chemin} → ${r.status}`); if (!r.ok) console.log(t.slice(0, 500)); return { ok: r.ok, t };
61
+ };
62
+ if (ACTION === "envoyer") {
63
+ let bon = true;
64
+ if (existsSync(SBOM)) bon = (await appel("POST", `/sbom?p=${e(p)}&version=${e(v)}`, readFileSync(SBOM, "utf8"))).ok && bon;
65
+ else console.log(`⚠ pas de SBOM (${SBOM}) : seul le compte rendu part — qatrax.dev le consignera « SBOM non reçue »`);
66
+ bon = (await appel("POST", `/runs?p=${e(p)}&format=json`, readFileSync(CR, "utf8"))).ok && bon;
67
+ process.exit(bon ? 0 : 1);
68
+ } else {
69
+ const r = await appel("GET", `/vulnerabilites?p=${e(p)}&version=${e(v)}&format=json`);
70
+ console.log(r.t.slice(0, 4000)); process.exit(r.ok ? 0 : 1);
71
+ }'
72
+ }
73
+
74
+ dernier() {
75
+ [ -f "$CR" ] || { echo "✗ pas de compte rendu ($CR) : choix 3 d'abord"; return 2; }
76
+ CR="$CR" node --input-type=module -e '
77
+ import { readFileSync } from "node:fs";
78
+ const c = JSON.parse(readFileSync(process.env.CR, "utf8")); const s = c.synthese ?? {};
79
+ console.log(`${c.produit?.nom}@${c.produit?.version} — verdict : ${s.verdict}`);
80
+ console.log(` ${s.executes}/${s.declares} exécutés · ${s.succes} succès · ${s.echecs} échec(s) · ${s.erreurs} erreur(s) · ${s.ignores} ignoré(s)`);
81
+ if (c.sbom) console.log(` SBOM ${c.sbom.serialNumber} (révision ${c.sbom.revision}) sha256 ${c.sbom.sha256.slice(0, 16)}…`);
82
+ for (const d of c.defauts ?? []) console.log(` ⚠ ${d}`);'
83
+ }
84
+
85
+ faire() {
86
+ case "$1" in
87
+ 1) lancer_essais ;; 2) generer_sbom ;; 3) compte_rendu ;; 4) qatrax envoyer ;; 5) qatrax vulnerabilites ;; 6) dernier ;;
88
+ *) echo "✗ choix inconnu : $1"; return 2 ;;
89
+ esac
90
+ }
91
+
92
+ for a in "$@"; do case "$a" in --choix=*) faire "${a#--choix=}"; exit $? ;; -h|--help) sed -n '2,19p' "$0"; exit 0 ;; esac; done
93
+
94
+ while true; do
95
+ printf '\n── mjs-unit — cycle de validation ──\n 1) essais 2) SBOM 3) compte rendu complet 4) envoyer à qatrax.dev\n 5) vulnérabilités (qatrax.dev) 6) dernier compte rendu q) quitter\n> '
96
+ read -r c || exit 0
97
+ [ "$c" = "q" ] && exit 0
98
+ faire "$c"
99
+ done
package/dist/index.d.ts CHANGED
@@ -6,18 +6,42 @@
6
6
  * @author Dr Hamid MADANI <drmdh@msn.com>
7
7
  * @license AGPL-3.0-or-later
8
8
  */
9
+ /** Options d'un cas (0.8.0, à la manière de JUnit 5 : @Timeout, @Tag, @Disabled). */
10
+ export interface TestOptions {
11
+ timeout?: number;
12
+ tags?: string[];
13
+ skip?: boolean | string;
14
+ }
15
+ type Fn = (...a: any[]) => void | Promise<void>;
9
16
  export interface TestCase {
10
17
  name: string;
11
- fn: () => void | Promise<void>;
18
+ fn: Fn;
12
19
  skip?: boolean;
20
+ skipReason?: string;
21
+ title?: string;
22
+ groups?: string[];
23
+ timeout?: number;
24
+ tags?: string[];
13
25
  }
14
- /** Enregistre un test (exécuté par `run()`). */
15
- export declare function test(name: string, fn: () => void | Promise<void>): void;
26
+ /** Enregistre un test (exécuté par `run()`). `opts` : { timeout (ms), tags, skip } — comme @Timeout, @Tag, @Disabled. */
27
+ export declare function test(name: string, fn: Fn, opts?: TestOptions): void;
16
28
  export declare namespace test {
17
- var skip: (name: string, fn: () => void | Promise<void>) => void;
29
+ var skip: (name: string, fn?: Fn, raison?: string) => void;
30
+ var each: (table: unknown[]) => (name: string, fn: Fn, opts?: TestOptions) => void;
18
31
  }
19
- /** Groupe logique (préfixe les noms). */
32
+ /**
33
+ * Groupe logique. Le nom des cas reste PRÉFIXÉ (`groupe › cas`, compatibilité < 0.8.0) ; le groupe est aussi
34
+ * porté à part (`groups`), et c'est lui que les rapports mettent en `classname` — le titre JUnit reste le nom nu.
35
+ */
20
36
  export declare function describe(group: string, body: () => void): void;
37
+ export declare const beforeAll: (fn: () => void | Promise<void>) => void;
38
+ export declare const afterAll: (fn: () => void | Promise<void>) => void;
39
+ export declare const beforeEach: (fn: () => void | Promise<void>) => void;
40
+ export declare const afterEach: (fn: () => void | Promise<void>) => void;
41
+ /** Délai par défaut de chaque cas, en ms (0 : aucun). Le CLI le pose par `--timeout=`. */
42
+ export declare function setDefaultTimeout(ms: number): void;
43
+ /** Ne jouer que les cas portant l'une de ces étiquettes (les autres sont dits ignorés). Le CLI : `--tag=`. */
44
+ export declare function setTagFilter(tags: string[]): void;
21
45
  export declare function ok(cond: unknown, message?: string): void;
22
46
  export declare function equal(actual: unknown, expected: unknown, message?: string): void;
23
47
  export declare function deepEqual(actual: unknown, expected: unknown, message?: string): void;
@@ -179,17 +203,32 @@ export declare function expect(actual: unknown): {
179
203
  */
180
204
  toReject: (matcher?: RegExp | string, m?: string) => Promise<unknown>;
181
205
  };
182
- /** Issue d'un cas de test (consommé par les reporters, ex. `./report`). */
206
+ /**
207
+ * Issue d'un cas de test (consommé par les reporters, ex. `./report`). `status` reste pass|fail|skip
208
+ * (compatibilité) ; `kind` dit, à la JUnit, si un échec est une assertion tombée (`failure`) ou une exception
209
+ * inattendue (`error`).
210
+ */
183
211
  export interface TestResult {
184
212
  name: string;
185
213
  status: "pass" | "fail" | "skip";
186
214
  error?: string;
187
215
  durationMs: number;
216
+ kind?: "failure" | "error";
217
+ errorType?: string;
218
+ stack?: string;
219
+ skipReason?: string;
220
+ title?: string;
221
+ groups?: string[];
222
+ tags?: string[];
223
+ classname?: string;
224
+ /** Résultat d'un crochet (afterAll en échec…) : il compte comme erreur, pas comme un cas déclaré. */
225
+ hook?: boolean;
188
226
  }
189
227
  export interface RunResult {
190
228
  passed: number;
191
229
  failed: number;
192
230
  skipped: number;
231
+ errors?: number;
193
232
  label: string;
194
233
  results: TestResult[];
195
234
  }
@@ -205,4 +244,5 @@ export declare function registered(): number;
205
244
  * s'exécutaient mais n'apparaissaient nulle part.
206
245
  */
207
246
  export declare function takeRuns(): RunResult[];
247
+ export {};
208
248
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -6,6 +6,11 @@
6
6
  * @author Dr Hamid MADANI <drmdh@msn.com>
7
7
  * @license AGPL-3.0-or-later
8
8
  */
9
+ const _hooks = [];
10
+ /** Pile des `describe` ouverts : un cas, un crochet, savent dans quel groupe ils naissent. */
11
+ const _groupes = [];
12
+ let _delaiDefaut = 0;
13
+ let _filtreTags = [];
9
14
  const _suite = [];
10
15
  /** Total des cas ENREGISTRÉS depuis le chargement du module — ce que le CLI compare aux exécutés. */
11
16
  let _enregistres = 0;
@@ -27,21 +32,56 @@ function _installerGarde() {
27
32
  process.exitCode = 1;
28
33
  });
29
34
  }
30
- /** Enregistre un test (exécuté par `run()`). */
31
- export function test(name, fn) {
32
- _suite.push({ name, fn });
35
+ function _enregistrer(name, fn, o = {}) {
36
+ const skip = o.skip === true || typeof o.skip === "string";
37
+ _suite.push({ name, title: name, fn, groups: [..._groupes], ...(skip ? { skip: true, ...(typeof o.skip === "string" ? { skipReason: o.skip } : {}) } : {}),
38
+ ...(o.timeout ? { timeout: o.timeout } : {}), ...(o.tags?.length ? { tags: [...o.tags] } : {}) });
33
39
  _enregistres++;
34
40
  _installerGarde();
35
41
  }
36
- /** Test ignoré (compté à part). */
37
- test.skip = (name, fn) => { _suite.push({ name, fn, skip: true }); _enregistres++; _installerGarde(); };
38
- /** Groupe logique (préfixe les noms). */
42
+ /** Enregistre un test (exécuté par `run()`). `opts` : { timeout (ms), tags, skip } — comme @Timeout, @Tag, @Disabled. */
43
+ export function test(name, fn, opts) { _enregistrer(name, fn, opts); }
44
+ /** Test ignoré (compté à part) ; la raison, facultative, est rapportée — comme @Disabled("raison"). */
45
+ test.skip = (name, fn = () => { }, raison) => { _enregistrer(name, fn, { skip: raison ?? true }); };
46
+ /**
47
+ * Tests paramétrés (comme @ParameterizedTest) : un cas par ligne. Le nom s'interpole : `%s` (valeurs dans
48
+ * l'ordre), `%i` (rang de la ligne), `$cle` (ligne objet).
49
+ */
50
+ test.each = (table) => (name, fn, opts) => {
51
+ table.forEach((ligne, i) => {
52
+ const args = Array.isArray(ligne) ? ligne : [ligne];
53
+ let k = 0;
54
+ const nom = name.replace(/%i/g, String(i)).replace(/%s/g, () => fmt(args[k++]))
55
+ .replace(/\$([A-Za-z_]\w*)/g, (m, c) => (ligne && typeof ligne === "object" && !Array.isArray(ligne) && c in ligne ? fmt(ligne[c]) : m));
56
+ _enregistrer(nom, () => fn(...args), opts);
57
+ });
58
+ };
59
+ /**
60
+ * Groupe logique. Le nom des cas reste PRÉFIXÉ (`groupe › cas`, compatibilité < 0.8.0) ; le groupe est aussi
61
+ * porté à part (`groups`), et c'est lui que les rapports mettent en `classname` — le titre JUnit reste le nom nu.
62
+ */
39
63
  export function describe(group, body) {
40
64
  const start = _suite.length;
41
- body();
65
+ _groupes.push(group);
66
+ try {
67
+ body();
68
+ }
69
+ finally {
70
+ _groupes.pop();
71
+ }
42
72
  for (let i = start; i < _suite.length; i++)
43
73
  _suite[i].name = `${group} › ${_suite[i].name}`;
44
74
  }
75
+ /** Crochets (comme @BeforeAll, @AfterAll, @BeforeEach, @AfterEach) : au niveau du fichier, ou d'un `describe`. */
76
+ const _crochet = (type) => (fn) => { _hooks.push({ type, groups: [..._groupes], fn }); };
77
+ export const beforeAll = _crochet("beforeAll");
78
+ export const afterAll = _crochet("afterAll");
79
+ export const beforeEach = _crochet("beforeEach");
80
+ export const afterEach = _crochet("afterEach");
81
+ /** Délai par défaut de chaque cas, en ms (0 : aucun). Le CLI le pose par `--timeout=`. */
82
+ export function setDefaultTimeout(ms) { _delaiDefaut = Math.max(0, Number(ms) || 0); }
83
+ /** Ne jouer que les cas portant l'une de ces étiquettes (les autres sont dits ignorés). Le CLI : `--tag=`. */
84
+ export function setTagFilter(tags) { _filtreTags = (tags ?? []).map((t) => String(t).trim()).filter(Boolean); }
45
85
  // ── Assertions ───────────────────────────────────────────────────────────────
46
86
  class AssertionError extends Error {
47
87
  constructor(m) { super(m); this.name = "AssertionError"; }
@@ -326,40 +366,152 @@ function matchMessage(err, matcher, m) {
326
366
  throw new AssertionError(m ?? `exception « ${msg} » ne matche pas ${matcher}`);
327
367
  }
328
368
  const _now = () => (typeof performance !== "undefined" ? performance.now() : Date.now());
369
+ class TimeoutError extends Error {
370
+ constructor(m) { super(m); this.name = "TimeoutError"; }
371
+ }
372
+ /** Une assertion tombée (la nôtre, celle de node:assert, de chai…) est un ÉCHEC ; tout le reste, une ERREUR. */
373
+ const _nature = (e) => {
374
+ const x = e;
375
+ const errorType = x?.name || x?.constructor?.name || typeof e;
376
+ const failure = errorType === "AssertionError" || x?.code === "ERR_ASSERTION";
377
+ return { kind: failure ? "failure" : "error", errorType, error: x?.message ?? String(e), ...(x?.stack ? { stack: String(x.stack).slice(0, 8000) } : {}) };
378
+ };
379
+ async function _executer(fn, ms) {
380
+ if (!ms) {
381
+ await fn();
382
+ return;
383
+ }
384
+ let t;
385
+ try {
386
+ await Promise.race([Promise.resolve().then(fn), new Promise((_, rej) => { t = setTimeout(() => rej(new TimeoutError(`délai dépassé : ${ms} ms`)), ms); })]);
387
+ }
388
+ finally {
389
+ if (t)
390
+ clearTimeout(t);
391
+ }
392
+ }
393
+ const _prefixe = (a, b) => a.length <= b.length && a.every((g, i) => g === b[i]);
394
+ const _cle = (g) => JSON.stringify(g);
329
395
  /** Exécute les tests enregistrés, affiche le rapport, positionne `process.exitCode` si échec. */
330
396
  export async function run(label = "") {
331
- let passed = 0, failed = 0, skipped = 0;
397
+ let passed = 0, failed = 0, skipped = 0, errors = 0;
332
398
  const results = [];
333
399
  if (label)
334
400
  console.log(`\n▶ ${label}`);
401
+ const hooks = _hooks.splice(0);
402
+ const de = (type, g) => hooks.filter((h) => h.type === type && _cle(h.groups) === _cle(g));
403
+ const ouverts = []; // portées dont le beforeAll a été joué
404
+ const echecsPortee = new Map(); // portée → motif de l'échec de son beforeAll
405
+ const base = (t) => ({ name: t.name, title: t.title ?? t.name, groups: t.groups ?? [], ...(t.tags ? { tags: t.tags } : {}) });
406
+ const erreurCrochet = (type, g, e) => {
407
+ const n = _nature(e);
408
+ failed++;
409
+ errors++;
410
+ console.log(` ✗ ${type}${g.length ? ` (${g.join(" › ")})` : ""}\n ${n.error}`);
411
+ results.push({ name: `${type}${g.length ? ` — ${g.join(" › ")}` : ""}`, title: type, groups: g, status: "fail", durationMs: 0, ...n, kind: "error", hook: true });
412
+ };
413
+ const fermerJusqua = async (g) => {
414
+ while (ouverts.length && !_prefixe(ouverts[ouverts.length - 1], g)) {
415
+ const p = ouverts.pop();
416
+ for (const h of de("afterAll", p)) {
417
+ try {
418
+ await h.fn();
419
+ }
420
+ catch (e) {
421
+ erreurCrochet("afterAll", p, e);
422
+ }
423
+ }
424
+ }
425
+ };
426
+ const ouvrir = async (g) => {
427
+ for (let k = 0; k <= g.length; k++) {
428
+ const p = g.slice(0, k);
429
+ if (ouverts.some((o) => _cle(o) === _cle(p)))
430
+ continue;
431
+ ouverts.push(p);
432
+ const parent = [...echecsPortee.entries()].find(([c]) => _prefixe(JSON.parse(c), p));
433
+ if (parent) {
434
+ echecsPortee.set(_cle(p), parent[1]);
435
+ continue;
436
+ }
437
+ for (const h of de("beforeAll", p)) {
438
+ try {
439
+ await h.fn();
440
+ }
441
+ catch (e) {
442
+ echecsPortee.set(_cle(p), `beforeAll a échoué : ${_nature(e).error}`);
443
+ break;
444
+ }
445
+ }
446
+ }
447
+ };
335
448
  for (const t of _suite) {
336
- if (t.skip) {
337
- console.log(` ⊘ ${t.name} (ignoré)`);
449
+ const g = t.groups ?? [];
450
+ const filtre = _filtreTags.length && !(t.tags ?? []).some((x) => _filtreTags.includes(x));
451
+ if (t.skip || filtre) {
452
+ const raison = t.skip ? t.skipReason : `filtré : --tag=${_filtreTags.join(",")}`;
453
+ console.log(` ⊘ ${t.name} (ignoré${raison ? ` : ${raison}` : ""})`);
338
454
  skipped++;
339
- results.push({ name: t.name, status: "skip", durationMs: 0 });
455
+ results.push({ ...base(t), status: "skip", durationMs: 0, ...(raison ? { skipReason: raison } : {}) });
340
456
  continue;
341
457
  }
458
+ await fermerJusqua(g);
459
+ await ouvrir(g);
342
460
  const t0 = _now();
343
- try {
344
- await t.fn();
345
- const d = _now() - t0;
461
+ const motifPortee = [...echecsPortee.entries()].find(([c]) => _prefixe(JSON.parse(c), g))?.[1];
462
+ let echec = motifPortee ? Object.assign(new Error(motifPortee), { name: "HookError" }) : undefined;
463
+ if (!echec) {
464
+ const avant = hooks.filter((h) => h.type === "beforeEach" && _prefixe(h.groups, g)).sort((a, b) => a.groups.length - b.groups.length);
465
+ const apres = hooks.filter((h) => h.type === "afterEach" && _prefixe(h.groups, g)).sort((a, b) => b.groups.length - a.groups.length);
466
+ try {
467
+ for (const h of avant)
468
+ await h.fn();
469
+ await _executer(t.fn, t.timeout ?? _delaiDefaut);
470
+ }
471
+ catch (e) {
472
+ echec = e;
473
+ }
474
+ for (const h of apres) {
475
+ try {
476
+ await h.fn();
477
+ }
478
+ catch (e) {
479
+ if (!echec)
480
+ echec = e;
481
+ }
482
+ }
483
+ }
484
+ const d = _now() - t0;
485
+ if (!echec) {
346
486
  console.log(` ✓ ${t.name}`);
347
487
  passed++;
348
- results.push({ name: t.name, status: "pass", durationMs: d });
488
+ results.push({ ...base(t), status: "pass", durationMs: d });
489
+ continue;
349
490
  }
350
- catch (e) {
351
- const d = _now() - t0;
352
- const msg = e?.message ?? String(e);
353
- console.log(` ✗ ${t.name}\n ${msg}`);
354
- failed++;
355
- results.push({ name: t.name, status: "fail", error: msg, durationMs: d });
491
+ const n = _nature(echec);
492
+ failed++;
493
+ if (n.kind === "error")
494
+ errors++;
495
+ console.log(` ✗ ${t.name}${n.kind === "error" ? ` [erreur ${n.errorType}]` : ""}\n ${n.error}`);
496
+ results.push({ ...base(t), status: "fail", durationMs: d, ...n });
497
+ }
498
+ await fermerJusqua([]);
499
+ while (ouverts.length) {
500
+ const p = ouverts.pop();
501
+ for (const h of de("afterAll", p)) {
502
+ try {
503
+ await h.fn();
504
+ }
505
+ catch (e) {
506
+ erreurCrochet("afterAll", p, e);
507
+ }
356
508
  }
357
509
  }
358
- console.log(`\n${failed === 0 ? "✅" : "❌"} ${passed} passé(s), ${failed} échoué(s)${skipped ? `, ${skipped} ignoré(s)` : ""}`);
510
+ console.log(`\n${failed === 0 ? "✅" : "❌"} ${passed} passé(s), ${failed} échoué(s)${errors ? ` dont ${errors} erreur(s)` : ""}${skipped ? `, ${skipped} ignoré(s)` : ""}`);
359
511
  if (failed > 0 && typeof process !== "undefined")
360
512
  process.exitCode = 1;
361
513
  _suite.length = 0; // réinitialise pour un éventuel run suivant
362
- const r = { passed, failed, skipped, label, results };
514
+ const r = { passed, failed, skipped, errors, label, results };
363
515
  _executions.push(r);
364
516
  return r;
365
517
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,MAAM,MAAM,GAAW,EAAE,CAAC;AAC1B,8FAA8F;AAC9F,MAAM,QAAQ,GAAa,EAAE,CAAC;AAC9B,IAAI,YAAY,GAAG,CAAC,CAAC;AACrB,IAAI,WAAW,GAAa,EAAE,CAAC;AAE/B,MAAM,MAAM,GAAe,EAAE,CAAC;AAC9B,qGAAqG;AACrG,IAAI,YAAY,GAAG,CAAC,CAAC;AACrB,mHAAmH;AACnH,MAAM,WAAW,GAAgB,EAAE,CAAC;AAEpC,oGAAoG;AACpG,kGAAkG;AAClG,+FAA+F;AAC/F,sFAAsF;AACtF,IAAI,eAAe,GAAG,KAAK,CAAC;AAC5B,SAAS,eAAe;IACtB,IAAI,eAAe,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,UAAU;QAAE,OAAO;IACpG,eAAe,GAAG,IAAI,CAAC;IACvB,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,EAAE;QAC9B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAChC,OAAO,CAAC,KAAK,CAAC,kBAAkB,MAAM,CAAC,MAAM,sIAAsI,CAAC,CAAC;QACrL,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,YAAY,CAAC,IAAY,EAAE,EAAM,EAAE,IAAiB,EAAE;IAC7D,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;IAC3D,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,GAAG,QAAQ,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxJ,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACpG,YAAY,EAAE,CAAC;IAAC,eAAe,EAAE,CAAC;AACpC,CAAC;AACD,yHAAyH;AACzH,MAAM,UAAU,IAAI,CAAC,IAAY,EAAE,EAAM,EAAE,IAAkB,IAAU,YAAY,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AACtG,uGAAuG;AACvG,IAAI,CAAC,IAAI,GAAG,CAAC,IAAY,EAAE,KAAS,GAAG,EAAE,GAAE,CAAC,EAAE,MAAe,EAAQ,EAAE,GAAG,YAAY,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9H;;;GAGG;AACH,IAAI,CAAC,IAAI,GAAG,CAAC,KAAgB,EAAE,EAAE,CAAC,CAAC,IAAY,EAAE,EAAM,EAAE,IAAkB,EAAQ,EAAE;IACnF,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QACzB,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACpD,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;aAC5E,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAK,KAAgB,CAAC,CAAC,CAAC,GAAG,CAAE,KAAiC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpL,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAa,EAAE,IAAgB;IACtD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,IAAI,CAAC;QAAC,IAAI,EAAE,CAAC;IAAC,CAAC;YAAS,CAAC;QAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;IAAC,CAAC;IAC3C,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,KAAK,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAC9F,CAAC;AAED,kHAAkH;AAClH,MAAM,QAAQ,GAAG,CAAC,IAAc,EAAE,EAAE,CAAC,CAAC,EAA8B,EAAQ,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,GAAG,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACrI,MAAM,CAAC,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;AAC/C,MAAM,CAAC,MAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;AAC7C,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;AACjD,MAAM,CAAC,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;AAC/C,0FAA0F;AAC1F,MAAM,UAAU,iBAAiB,CAAC,EAAU,IAAU,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACpG,8GAA8G;AAC9G,MAAM,UAAU,YAAY,CAAC,IAAc,IAAU,WAAW,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAE/H,gFAAgF;AAChF,MAAM,cAAe,SAAQ,KAAK;IAAG,YAAY,CAAS,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC,CAAC,CAAC;CAAE;AACzG,MAAM,GAAG,GAAG,CAAC,CAAU,EAAE,EAAE,GAAG,IAAI,CAAC;IAAC,OAAO,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAAC,CAAC;AAAC,MAAM,CAAC;IAAC,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;AAAC,CAAC,CAAC,CAAC,CAAC;AAE1H,MAAM,UAAU,EAAE,CAAC,IAAa,EAAE,OAAO,GAAG,cAAc;IACxD,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,cAAc,CAAC,OAAO,CAAC,CAAC;AAC/C,CAAC;AACD,MAAM,UAAU,KAAK,CAAC,MAAe,EAAE,QAAiB,EAAE,OAAgB;IACxE,IAAI,MAAM,KAAK,QAAQ;QAAE,MAAM,IAAI,cAAc,CAAC,OAAO,IAAI,WAAW,GAAG,CAAC,QAAQ,CAAC,UAAU,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAChH,CAAC;AACD,MAAM,UAAU,SAAS,CAAC,MAAe,EAAE,QAAiB,EAAE,OAAgB;IAC5E,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;QAAE,MAAM,IAAI,cAAc,CAAC,OAAO,IAAI,WAAW,GAAG,CAAC,QAAQ,CAAC,UAAU,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAChJ,CAAC;AACD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,EAA0B,EAAE,KAAuB,EAAE,OAAgB;IACrG,qFAAqF;IACrF,MAAM,QAAQ,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;IAC7D,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QAAC,MAAM,EAAE,EAAE,CAAC;IAAC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QAAC,KAAK,GAAG,IAAI,CAAC;QAAC,GAAG,GAAG,CAAC,CAAC;IAAC,CAAC;IACxD,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,cAAc,CAAC,QAAQ,IAAI,cAAc,CAAC,CAAC;IACjE,MAAM,GAAG,GAAI,GAA4B,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC;IAClE,IAAI,KAAK,YAAY,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,cAAc,CAAC,QAAQ,IAAI,eAAe,GAAG,oBAAoB,KAAK,EAAE,CAAC,CAAC;IACtF,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AACD,qHAAqH;AACrH,MAAM,UAAU,MAAM,CAAC,EAAiB,EAAE,OAAyB,EAAE,OAAgB;IACnF,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QAAC,EAAE,EAAE,CAAC;IAAC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QAAC,KAAK,GAAG,IAAI,CAAC;QAAC,GAAG,GAAG,CAAC,CAAC;IAAC,CAAC;IAClD,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,cAAc,CAAC,OAAO,IAAI,4BAA4B,CAAC,CAAC;IAC9E,MAAM,GAAG,GAAI,GAA4B,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC;IAClE,IAAI,OAAO,YAAY,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,cAAc,CAAC,OAAO,IAAI,eAAe,GAAG,oBAAoB,OAAO,EAAE,CAAC,CAAC;IAC1I,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,MAAM,IAAI,cAAc,CAAC,OAAO,IAAI,eAAe,GAAG,wBAAwB,OAAO,IAAI,CAAC,CAAC;IACtJ,OAAO,GAAG,CAAC;AACb,CAAC;AACD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,KAAK,CAAC,MAAe,EAAE,MAAc,EAAE,OAAgB;IACrE,MAAM,CAAC,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,MAAM,IAAI,cAAc,CAAC,OAAO,IAAI,KAAK,CAAC,oBAAoB,MAAM,EAAE,CAAC,CAAC;AAC/F,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,YAAY,CAAC,MAAe,EAAE,MAAc,EAAE,OAAgB;IAC5E,MAAM,CAAC,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/D,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,MAAM,IAAI,cAAc,CAAC,OAAO,IAAI,KAAK,CAAC,aAAa,MAAM,6BAA6B,CAAC,CAAC;AAClH,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,QAAQ,CAAC,MAAe,EAAE,QAAiB,EAAE,OAAgB;IAC3E,IAAI,MAAM,KAAK,QAAQ;QAAE,MAAM,IAAI,cAAc,CAAC,OAAO,IAAI,wBAAwB,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AACxG,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,YAAY,CAAC,MAAe,EAAE,QAAiB,EAAE,OAAgB;IAC/E,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,cAAc,CAAC,OAAO,IAAI,yCAAyC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAChG,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,EAA0B,EAAE,OAAO,GAAG,qBAAqB;IACjG,IAAI,CAAC;QAAC,MAAM,EAAE,EAAE,CAAC;IAAC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QAAC,MAAM,IAAI,cAAc,CAAC,GAAG,OAAO,MAAO,CAAW,EAAE,OAAO,EAAE,CAAC,CAAC;IAAC,CAAC;AACtG,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,MAAM,CAAC,MAAe;IACpC,OAAO,EAAE,GAAG,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC;AACrE,CAAC;AAED;;;;GAIG;AACH,SAAS,QAAQ,CAAC,MAAe,EAAE,MAAe;IAChD,MAAM,MAAM,GAAG,CAAC,IAAa,EAAE,KAAa,EAAE,MAAc,EAAE,CAAU,EAAQ,EAAE;QAChF,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;YAAE,MAAM,IAAI,cAAc,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACtF,CAAC,CAAC;IAEF,OAAO;QACL,IAAI,EAAE,CAAC,CAAU,EAAE,CAAU,EAAE,EAAE,CAC/B,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,sBAAsB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAEnG,OAAO,EAAE,CAAC,CAAU,EAAE,CAAU,EAAE,EAAE,CAClC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,6BAA6B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAE1I,UAAU,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,wBAAwB,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,uBAAuB,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5H,SAAS,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,uBAAuB,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,wBAAwB,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QAE1H,uFAAuF;QACvF,WAAW,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,gCAAgC,EAAE,mCAAmC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;QACjJ,aAAa,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,2BAA2B,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,8BAA8B,EAAE,CAAC,CAAC;QACxI,QAAQ,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE,sBAAsB,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,yBAAyB,EAAE,CAAC,CAAC;QAEpH,mGAAmG;QACnG,cAAc,EAAE,CAAC,IAAoC,EAAE,CAAU,EAAE,EAAE,CACnE,MAAM,CACJ,MAAM,YAAY,IAAI,EACtB,2BAA2B,IAAI,CAAC,IAAI,UAAW,MAAiB,EAAE,WAAW,EAAE,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,EAAE,EACpG,sCAAsC,IAAI,CAAC,IAAI,EAAE,EACjD,CAAC,CACF;QAEH;;;;;;;WAOG;QACH,SAAS,EAAE,CAAC,IAAa,EAAE,CAAU,EAAE,EAAE;YACvC,MAAM,OAAO,GACX,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC1D,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;oBAC/C,CAAC,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;wBAC1C,CAAC,CAAC,KAAK,CAAC;YACV,MAAM,CAAC,OAAO,EAAE,KAAK,GAAG,CAAC,MAAM,CAAC,sBAAsB,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC,MAAM,CAAC,6BAA6B,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAClI,CAAC;QAED,mEAAmE;QACnE,OAAO,EAAE,CAAC,EAAmB,EAAE,CAAU,EAAE,EAAE,CAC3C,MAAM,CACJ,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,EAAE,YAAY,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAC5F,KAAK,GAAG,CAAC,MAAM,CAAC,oBAAoB,EAAE,EAAE,EACxC,KAAK,GAAG,CAAC,MAAM,CAAC,4BAA4B,EAAE,EAAE,EAChD,CAAC,CACF;QAEH,qCAAqC;QACrC,YAAY,EAAE,CAAC,CAAS,EAAE,CAAU,EAAE,EAAE;YACtC,MAAM,GAAG,GAAI,MAA8B,EAAE,MAAM,CAAC;YACpD,MAAM,CAAC,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,CAAC,EAAE,qBAAqB,CAAC,UAAU,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,kCAAkC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACrI,CAAC;QAED;;;;;;;;WAQG;QACH,cAAc,EAAE,CAAC,IAAqC,EAAE,GAAG,IAAe,EAAE,EAAE;YAC5E,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAClE,IAAI,GAAG,GAAY,MAAM,CAAC;YAC1B,IAAI,KAAK,GAAG,IAAI,CAAC;YACjB,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;gBACrB,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,IAAK,GAAc,EAAE,CAAC;oBACpE,GAAG,GAAI,GAAwC,CAAC,CAAW,CAAC,CAAC;gBAC/D,CAAC;qBAAM,CAAC;oBAAC,KAAK,GAAG,KAAK,CAAC;oBAAC,MAAM;gBAAC,CAAC;YAClC,CAAC;YACD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;YACjC,MAAM,OAAO,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7E,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACzB,MAAM,CACJ,KAAK,IAAI,OAAO,EAChB,QAAQ;gBACN,CAAC,CAAC,eAAe,CAAC,iBAAiB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE;gBACvF,CAAC,CAAC,eAAe,CAAC,iBAAiB,GAAG,CAAC,MAAM,CAAC,EAAE,EAClD,QAAQ;gBACN,CAAC,CAAC,eAAe,CAAC,2BAA2B,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE;gBAC3D,CAAC,CAAC,eAAe,CAAC,0BAA0B,CAC/C,CAAC;QACJ,CAAC;QAED,eAAe,EAAE,CAAC,CAAS,EAAE,CAAU,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,GAAG,CAAC,EAAE,aAAa,CAAC,UAAU,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,wBAAwB,CAAC,EAAE,EAAE,CAAC,CAAC;QACnK,sBAAsB,EAAE,CAAC,CAAS,EAAE,CAAU,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,IAAI,CAAC,EAAE,aAAa,CAAC,UAAU,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,wBAAwB,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3K,YAAY,EAAE,CAAC,CAAS,EAAE,CAAU,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,GAAG,CAAC,EAAE,aAAa,CAAC,UAAU,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,wBAAwB,CAAC,EAAE,EAAE,CAAC,CAAC;QAChK,mBAAmB,EAAE,CAAC,CAAS,EAAE,CAAU,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,IAAI,CAAC,EAAE,aAAa,CAAC,UAAU,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,wBAAwB,CAAC,EAAE,EAAE,CAAC,CAAC;QAExK;;;;WAIG;QACH,OAAO,EAAE,CAAC,OAAyB,EAAE,CAAU,EAAE,EAAE;YACjD,IAAI,OAAO,MAAM,KAAK,UAAU;gBAAE,MAAM,IAAI,cAAc,CAAC,6BAA6B,CAAC,CAAC;YAC1F,IAAI,GAAY,CAAC;YACjB,IAAI,KAAK,GAAG,KAAK,CAAC;YAClB,IAAI,CAAC;gBAAE,MAAwB,EAAE,CAAC;YAAC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBAAC,KAAK,GAAG,IAAI,CAAC;gBAAC,GAAG,GAAG,CAAC,CAAC;YAAC,CAAC;YAEzE,IAAI,MAAM,EAAE,CAAC;gBACX,IAAI,KAAK;oBAAE,MAAM,IAAI,cAAc,CAAC,CAAC,IAAI,sCAAsC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC7F,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,cAAc,CAAC,CAAC,IAAI,4BAA4B,CAAC,CAAC;YACxE,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;YAC9B,OAAO,GAAG,CAAC;QACb,CAAC;QAED;;;;WAIG;QACH,QAAQ,EAAE,KAAK,EAAE,OAAyB,EAAE,CAAU,EAAoB,EAAE;YAC1E,IAAI,OAAO,MAAM,KAAK,UAAU;gBAAE,MAAM,IAAI,cAAc,CAAC,8BAA8B,CAAC,CAAC;YAC3F,IAAI,GAAY,CAAC;YACjB,IAAI,KAAK,GAAG,KAAK,CAAC;YAClB,IAAI,CAAC;gBAAC,MAAO,MAAiC,EAAE,CAAC;YAAC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBAAC,KAAK,GAAG,IAAI,CAAC;gBAAC,GAAG,GAAG,CAAC,CAAC;YAAC,CAAC;YAExF,IAAI,MAAM,EAAE,CAAC;gBACX,IAAI,KAAK;oBAAE,MAAM,IAAI,cAAc,CAAC,CAAC,IAAI,0CAA0C,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACjG,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,cAAc,CAAC,CAAC,IAAI,gBAAgB,CAAC,CAAC;YAC5D,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;YAC9B,OAAO,GAAG,CAAC;QACb,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,KAAK,GAAG,CAAC,GAAY,EAAU,EAAE,CAAE,GAA4B,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC;AAE9F,SAAS,YAAY,CAAC,GAAY,EAAE,OAAyB,EAAE,CAAU;IACvE,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO;IAClC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;IACvB,MAAM,OAAO,GAAG,OAAO,YAAY,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACtF,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,cAAc,CAAC,CAAC,IAAI,eAAe,GAAG,oBAAoB,OAAO,EAAE,CAAC,CAAC;AAC/F,CAAC;AAiBD,MAAM,IAAI,GAAG,GAAW,EAAE,CAAC,CAAC,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;AACjG,MAAM,YAAa,SAAQ,KAAK;IAAG,YAAY,CAAS,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC,CAAC,CAAC;CAAE;AAErG,gHAAgH;AAChH,MAAM,OAAO,GAAG,CAAC,CAAU,EAAmF,EAAE;IAC9G,MAAM,CAAC,GAAG,CAAwG,CAAC;IACnH,MAAM,SAAS,GAAG,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,WAAW,EAAE,IAAI,IAAI,OAAO,CAAC,CAAC;IAC9D,MAAM,OAAO,GAAG,SAAS,KAAK,gBAAgB,IAAI,CAAC,EAAE,IAAI,KAAK,eAAe,CAAC;IAC9E,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AAC5J,CAAC,CAAC;AAEF,KAAK,UAAU,SAAS,CAAC,EAAiB,EAAE,EAAU;IACpD,IAAI,CAAC,EAAE,EAAE,CAAC;QAAC,MAAM,EAAE,EAAE,CAAC;QAAC,OAAO;IAAC,CAAC;IAChC,IAAI,CAA4C,CAAC;IACjD,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,GAAG,CAAC,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9J,CAAC;YAAS,CAAC;QAAC,IAAI,CAAC;YAAE,YAAY,CAAC,CAAC,CAAC,CAAC;IAAC,CAAC;AACvC,CAAC;AAED,MAAM,QAAQ,GAAG,CAAC,CAAW,EAAE,CAAW,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACrG,MAAM,IAAI,GAAG,CAAC,CAAW,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAEhD,iGAAiG;AACjG,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,KAAK,GAAG,EAAE;IAClC,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC;IACpD,MAAM,OAAO,GAAiB,EAAE,CAAC;IACjC,IAAI,KAAK;QAAE,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,EAAE,GAAG,CAAC,IAAc,EAAE,CAAW,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/G,MAAM,OAAO,GAAe,EAAE,CAAC,CAAiB,uCAAuC;IACvF,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC,CAAC,6CAA6C;IAC7F,MAAM,IAAI,GAAG,CAAC,CAAW,EAA0D,EAAE,CACnF,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC5G,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,CAAW,EAAE,CAAU,EAAE,EAAE;QAC9D,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAAC,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QACrF,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACpK,CAAC,CAAC;IACF,MAAM,YAAY,GAAG,KAAK,EAAE,CAAW,EAAE,EAAE;QACzC,OAAO,OAAO,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YACnE,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,EAAc,CAAC;YACpC,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC;gBAAC,IAAI,CAAC;oBAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC;gBAAC,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBAAC,aAAa,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBAAC,CAAC;YAAC,CAAC;QAC7G,CAAC;IACH,CAAC,CAAC;IACF,MAAM,MAAM,GAAG,KAAK,EAAE,CAAW,EAAE,EAAE;QACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACnC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACxB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC;gBAAE,SAAS;YACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChB,MAAM,MAAM,GAAG,CAAC,GAAG,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACrF,IAAI,MAAM,EAAE,CAAC;gBAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;gBAAC,SAAS;YAAC,CAAC;YAC/D,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC;gBACnC,IAAI,CAAC;oBAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC;gBAAC,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,wBAAwB,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;oBAAC,MAAM;gBAAC,CAAC;YACnH,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1F,IAAI,CAAC,CAAC,IAAI,IAAI,MAAM,EAAE,CAAC;YACrB,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,kBAAkB,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACjF,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,WAAW,MAAM,CAAC,CAAC,CAAC,MAAM,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YAAC,OAAO,EAAE,CAAC;YAChF,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAAC,SAAS;QACnH,CAAC;QACD,MAAM,YAAY,CAAC,CAAC,CAAC,CAAC;QAAC,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC;QAClB,MAAM,WAAW,GAAG,CAAC,GAAG,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/F,IAAI,KAAK,GAAY,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC5G,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,IAAI,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACtI,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACrI,IAAI,CAAC;gBAAC,KAAK,MAAM,CAAC,IAAI,KAAK;oBAAE,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC;gBAAC,MAAM,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,IAAI,YAAY,CAAC,CAAC;YAAC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBAAC,KAAK,GAAG,CAAC,CAAC;YAAC,CAAC;YACvH,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;gBAAC,IAAI,CAAC;oBAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC;gBAAC,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBAAC,IAAI,CAAC,KAAK;wBAAE,KAAK,GAAG,CAAC,CAAC;gBAAC,CAAC;YAAC,CAAC;QACvF,CAAC;QACD,MAAM,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,KAAK,EAAE,CAAC;YAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAAC,MAAM,EAAE,CAAC;YAAC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QAC9H,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QAAC,MAAM,EAAE,CAAC;QAAC,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO;YAAE,MAAM,EAAE,CAAC;QACrE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QACtG,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,MAAM,YAAY,CAAC,EAAE,CAAC,CAAC;IACvB,OAAO,OAAO,CAAC,MAAM,EAAE,CAAC;QAAC,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,EAAc,CAAC;QAAC,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC;gBAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC;YAAC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBAAC,aAAa,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAAC,CAAC;QAAC,CAAC;IAAC,CAAC;IAC3K,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,MAAM,cAAc,MAAM,aAAa,MAAM,CAAC,CAAC,CAAC,SAAS,MAAM,YAAY,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC3K,IAAI,MAAM,GAAG,CAAC,IAAI,OAAO,OAAO,KAAK,WAAW;QAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,4CAA4C;IAC/D,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IAC9D,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,OAAO,CAAC,CAAC;AACX,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,OAAO,KAAa,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;AAE3D,0FAA0F;AAC1F,MAAM,UAAU,UAAU,KAAa,OAAO,YAAY,CAAC,CAAC,CAAC;AAE7D;;;;GAIG;AACH,MAAM,UAAU,QAAQ,KAAkB,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC"}
package/dist/report.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mostajs/mjs-unit/report — Reporters de preuve de test (HTML & JSON).
2
+ * @mostajs/mjs-unit/report — Reporters de preuve de test (HTML, JSON & JUnit XML).
3
3
  *
4
4
  * Fonctions PURES : prennent un agrégat de résultats (`TestReport`) et rendent
5
5
  * une chaîne. Aucune E/S, aucun accès disque — l'appelant (CLI ou script) écrit
@@ -20,7 +20,18 @@ export interface TestReport {
20
20
  suites: ReportSuite[];
21
21
  generatedAt: string;
22
22
  title?: string;
23
+ hostname?: string;
23
24
  }
25
+ /**
26
+ * Le `classname` JUnit d'un cas : le chemin du fichier sans extension, en notation pointée, suivi de ses
27
+ * groupes `describe` — `test-scripts/a.test.mjs` + [Groupe] → `test-scripts.a.test.Groupe`.
28
+ */
29
+ export declare function classnameDe(file: string, groups?: string[]): string;
30
+ /**
31
+ * Rapport JUnit XML — le schéma qu'attendent Jenkins, GitLab, GitHub, Azure DevOps et les outils de traçabilité.
32
+ * Une suite par fichier ; échec d'assertion → <failure>, exception inattendue → <error>, ignoré → <skipped>.
33
+ */
34
+ export declare function renderJunitReport(report: TestReport): string;
24
35
  /** Totaux sur l'ensemble des suites. */
25
36
  export declare function summarize(report: TestReport): {
26
37
  total: number;
@@ -33,4 +44,52 @@ export declare function summarize(report: TestReport): {
33
44
  export declare function renderJsonReport(report: TestReport): string;
34
45
  /** Rapport HTML autonome (thème sombre, cartes de synthèse + tables par suite). */
35
46
  export declare function renderHtmlReport(report: TestReport): string;
47
+ /** Ce que l'appelant a lu et mesuré autour de l'exécution. */
48
+ export interface ContexteCompteRendu {
49
+ /** la SBOM désignée (objet CycloneDX) et sa pièce ; null si absente ou illisible */
50
+ sbom?: {
51
+ fichier: string;
52
+ sha256: string;
53
+ contenu: any;
54
+ } | null;
55
+ /** motif quand la SBOM n'a pas pu être lue */
56
+ sbomErreur?: string;
57
+ /** le plan DEVTEST et sa pièce ; null si absent */
58
+ plan?: {
59
+ fichier: string;
60
+ sha256: string;
61
+ contenu: any;
62
+ } | null;
63
+ planErreur?: string;
64
+ scripts: {
65
+ fichier: string;
66
+ sha256: string;
67
+ }[];
68
+ environnement: {
69
+ node: string;
70
+ plateforme: string;
71
+ hote?: string;
72
+ ci?: string;
73
+ debut: string;
74
+ fin: string;
75
+ };
76
+ declares: number;
77
+ outil: {
78
+ name: string;
79
+ version: string;
80
+ };
81
+ }
82
+ export type StatutCompteRendu = "succes" | "echec" | "erreur" | "ignore";
83
+ export type Verdict = "conforme" | "non conforme" | "incomplet";
84
+ /** La référence d'un cas (« T-SB-12 — … » → « T-SB-12 ») ; '' si le titre n'en porte pas. */
85
+ export declare function refDe(titre: string): string;
86
+ /**
87
+ * Le compte rendu `mostajs-compte-rendu/1`, SANS son bloc d'intégrité (que l'appelant ajoute après avoir écrit les
88
+ * exports). Il est produit même invalide : ses `defauts` disent ce qui manque, son verdict en découle.
89
+ */
90
+ export declare function construireCompteRendu(report: TestReport, ctx: ContexteCompteRendu): Record<string, any>;
91
+ /** Export CTRF (Common Test Report Format) d'un compte rendu. */
92
+ export declare function renderCtrf(cr: Record<string, any>): string;
93
+ /** L'énoncé in-toto v1, prédicat test-result v0.1, NON signé : son sujet est la SBOM (la version éprouvée). */
94
+ export declare function renderInTotoTestResult(cr: Record<string, any>): string;
36
95
  //# sourceMappingURL=report.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,sDAAsD;AACtD,MAAM,WAAW,WAAW;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,UAAU,EAAE,CAAA;CAAE;AACpE,uCAAuC;AACvC,MAAM,WAAW,UAAU;IAAG,MAAM,EAAE,WAAW,EAAE,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE;AAW1F,wCAAwC;AACxC,wBAAgB,SAAS,CAAC,MAAM,EAAE,UAAU;;;;;;EAG3C;AAED,wDAAwD;AACxD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAE3D;AAED,mFAAmF;AACnF,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAmD3D"}
1
+ {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,sDAAsD;AACtD,MAAM,WAAW,WAAW;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,UAAU,EAAE,CAAA;CAAE;AACpE,uCAAuC;AACvC,MAAM,WAAW,UAAU;IAAG,MAAM,EAAE,WAAW,EAAE,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE;AAE7G;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,EAAO,GAAG,MAAM,CAGvE;AAQD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CA0B5D;AAWD,wCAAwC;AACxC,wBAAgB,SAAS,CAAC,MAAM,EAAE,UAAU;;;;;;EAG3C;AAED,wDAAwD;AACxD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAE3D;AAED,mFAAmF;AACnF,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAmD3D;AAQD,8DAA8D;AAC9D,MAAM,WAAW,mBAAmB;IAClC,oFAAoF;IACpF,IAAI,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,GAAG,CAAA;KAAE,GAAG,IAAI,CAAC;IAChE,8CAA8C;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mDAAmD;IACnD,IAAI,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,GAAG,CAAA;KAAE,GAAG,IAAI,CAAC;IAChE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC/C,aAAa,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5G,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1C;AAED,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;AACzE,MAAM,MAAM,OAAO,GAAG,UAAU,GAAG,cAAc,GAAG,WAAW,CAAC;AAEhE,6FAA6F;AAC7F,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE3C;AAGD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAsDvG;AAED,iEAAiE;AACjE,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAW1D;AAED,+GAA+G;AAC/G,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAkBtE"}
package/dist/report.js CHANGED
@@ -1,3 +1,48 @@
1
+ /**
2
+ * Le `classname` JUnit d'un cas : le chemin du fichier sans extension, en notation pointée, suivi de ses
3
+ * groupes `describe` — `test-scripts/a.test.mjs` + [Groupe] → `test-scripts.a.test.Groupe`.
4
+ */
5
+ export function classnameDe(file, groups = []) {
6
+ const base = String(file ?? "").replace(/\\/g, "/").replace(/^\.?\//, "").replace(/\.(m?[jt]s|cjs)$/, "").replace(/\//g, ".");
7
+ return [base, ...groups].filter(Boolean).join(".");
8
+ }
9
+ // XML 1.0 : ni caractère de contrôle (hors tabulation et sauts de ligne), ni `]]>` nu dans une section CDATA.
10
+ const xmlPropre = (v) => String(v ?? "").replace(/[\u0000-\u0008\u000B\u000C\u000E-\u001F\uFFFE\uFFFF]/g, "");
11
+ const attrXml = (v) => xmlPropre(v).replace(/[&<>"']/g, (c) => ({ "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&apos;" }[c]));
12
+ const cdata = (v) => `<![CDATA[${xmlPropre(v).replace(/]]>/g, "]]]]><![CDATA[>")}]]>`;
13
+ const sec = (ms) => (Math.max(0, ms || 0) / 1000).toFixed(3);
14
+ /**
15
+ * Rapport JUnit XML — le schéma qu'attendent Jenkins, GitLab, GitHub, Azure DevOps et les outils de traçabilité.
16
+ * Une suite par fichier ; échec d'assertion → <failure>, exception inattendue → <error>, ignoré → <skipped>.
17
+ */
18
+ export function renderJunitReport(report) {
19
+ const comptes = (rs) => ({
20
+ tests: rs.length,
21
+ failures: rs.filter((r) => r.status === "fail" && r.kind !== "error").length,
22
+ errors: rs.filter((r) => r.status === "fail" && r.kind === "error").length,
23
+ skipped: rs.filter((r) => r.status === "skip").length,
24
+ time: rs.reduce((n, r) => n + (r.durationMs || 0), 0),
25
+ });
26
+ const horodatage = String(report.generatedAt ?? "").replace(/\.\d+Z$|Z$/, "");
27
+ const suites = report.suites.map((s, i) => {
28
+ const c = comptes(s.results);
29
+ const cas = s.results.map((r) => {
30
+ const ouverture = `<testcase name="${attrXml(r.title ?? r.name)}" classname="${attrXml(r.classname ?? classnameDe(s.file, r.groups))}" file="${attrXml(s.file)}" time="${sec(r.durationMs)}"`;
31
+ const props = r.tags?.length ? `<properties>${r.tags.map((t) => `<property name="tag" value="${attrXml(t)}"/>`).join("")}</properties>` : "";
32
+ let corps = "";
33
+ if (r.status === "skip")
34
+ corps = r.skipReason ? `<skipped message="${attrXml(r.skipReason)}"/>` : "<skipped/>";
35
+ else if (r.status === "fail") {
36
+ const balise = r.kind === "error" ? "error" : "failure";
37
+ corps = `<${balise} message="${attrXml(r.error ?? "")}" type="${attrXml(r.errorType ?? (balise === "error" ? "Error" : "AssertionError"))}">${cdata(r.stack ?? r.error ?? "")}</${balise}>`;
38
+ }
39
+ return props || corps ? ` ${ouverture}>${props}${corps}</testcase>` : ` ${ouverture}/>`;
40
+ }).join("\n");
41
+ return ` <testsuite name="${attrXml(s.file)}" id="${i}" tests="${c.tests}" failures="${c.failures}" errors="${c.errors}" skipped="${c.skipped}" time="${sec(c.time)}" timestamp="${attrXml(horodatage)}" hostname="${attrXml(report.hostname ?? "localhost")}">\n${cas}\n </testsuite>`;
42
+ });
43
+ const t = comptes(report.suites.flatMap((s) => s.results));
44
+ return `<?xml version="1.0" encoding="UTF-8"?>\n<testsuites name="${attrXml(report.title ?? "mjs-unit")}" tests="${t.tests}" failures="${t.failures}" errors="${t.errors}" skipped="${t.skipped}" time="${sec(t.time)}" timestamp="${attrXml(horodatage)}">\n${suites.join("\n")}\n</testsuites>\n`;
45
+ }
1
46
  const esc = (s) => String(s).replace(/[&<>"]/g, (c) => ({ "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;" }[c]));
2
47
  const tally = (results) => ({
3
48
  passed: results.filter((r) => r.status === "pass").length,
@@ -64,4 +109,107 @@ export function renderHtmlReport(report) {
64
109
  <footer>Auteur : Dr Hamid MADANI &lt;drmdh@msn.com&gt; · AGPL-3.0-or-later</footer>
65
110
  </body></html>`;
66
111
  }
112
+ /** La référence d'un cas (« T-SB-12 — … » → « T-SB-12 ») ; '' si le titre n'en porte pas. */
113
+ export function refDe(titre) {
114
+ return /^\s*(T-[A-Za-z0-9-]*\d)\b/.exec(String(titre ?? ""))?.[1] ?? "";
115
+ }
116
+ const statutDe = (r) => (r.status === "pass" ? "succes" : r.status === "skip" ? "ignore" : r.kind === "error" ? "erreur" : "echec");
117
+ /**
118
+ * Le compte rendu `mostajs-compte-rendu/1`, SANS son bloc d'intégrité (que l'appelant ajoute après avoir écrit les
119
+ * exports). Il est produit même invalide : ses `defauts` disent ce qui manque, son verdict en découle.
120
+ */
121
+ export function construireCompteRendu(report, ctx) {
122
+ const defauts = [];
123
+ const sb = ctx.sbom?.contenu;
124
+ const comp = sb?.metadata?.component ?? {};
125
+ const prop = (n) => (sb?.metadata?.properties ?? []).find((p) => p?.name === n)?.value ?? "";
126
+ if (!ctx.sbom)
127
+ defauts.push(ctx.sbomErreur ? `SBOM illisible : ${ctx.sbomErreur}` : "SBOM absente : la version éprouvée est inconnue (--sbom)");
128
+ else if (!comp.version)
129
+ defauts.push("SBOM sans version de produit (metadata.component.version)");
130
+ const cas = report.suites.flatMap((s) => s.results.filter((r) => !r.hook).map((r) => ({ r, fichier: s.file })));
131
+ const resultats = cas.map(({ r, fichier }) => {
132
+ const titre = r.title ?? r.name;
133
+ const statut = statutDe(r);
134
+ return { ref: refDe(titre), titre, fichier, statut, dureeMs: Math.round(r.durationMs || 0),
135
+ ...(statut === "ignore" ? { motif: r.skipReason ?? "" } : {}), ...(r.error ? { message: String(r.error).slice(0, 2000) } : {}) };
136
+ });
137
+ for (const x of resultats) {
138
+ if (x.statut === "echec" || x.statut === "erreur")
139
+ defauts.push(`${x.ref || x.titre} en ${x.statut}`);
140
+ if (x.statut === "ignore" && !x.motif)
141
+ defauts.push(`${x.ref || x.titre} ignoré sans motif`);
142
+ }
143
+ if (resultats.length !== ctx.declares)
144
+ defauts.push(`${ctx.declares} cas déclaré(s), ${resultats.length} exécuté(s)`);
145
+ // Essai réel sur travel (09/10) : 0 déclaré, 0 exécuté (deux instances de mjs-unit) — une pièce vide ne prouve rien.
146
+ if (resultats.length === 0)
147
+ defauts.push("aucun cas exécuté : rien n'a été vérifié");
148
+ let plan = null;
149
+ if (ctx.plan) {
150
+ const auto = (ctx.plan.contenu?.tests ?? []).filter((t) => t?.type !== "manual").map((t) => String(t.ref));
151
+ const joues = new Set(resultats.map((x) => x.ref).filter(Boolean));
152
+ const manquants = auto.filter((r) => !joues.has(r));
153
+ if (manquants.length)
154
+ defauts.push(`cas du plan non exécutés : ${manquants.join(", ")}`);
155
+ plan = { fichier: ctx.plan.fichier, sha256: ctx.plan.sha256, couverts: auto.length - manquants.length, manquants,
156
+ horsPlan: [...joues].filter((r) => !auto.includes(r)) };
157
+ }
158
+ else if (ctx.planErreur)
159
+ defauts.push(`plan illisible : ${ctx.planErreur}`);
160
+ const n = (s) => resultats.filter((x) => x.statut === s).length;
161
+ const synthese = { declares: ctx.declares, executes: resultats.length, succes: n("succes"), echecs: n("echec"), erreurs: n("erreur"), ignores: n("ignore"),
162
+ verdict: (n("echec") + n("erreur") > 0 ? "non conforme" : defauts.length ? "incomplet" : "conforme") };
163
+ return {
164
+ format: "mostajs-compte-rendu/1",
165
+ genereLe: report.generatedAt,
166
+ ...(report.title ? { titre: report.title } : {}),
167
+ outil: ctx.outil,
168
+ produit: { nom: String(comp.name ?? "inconnu"), version: String(comp.version || "inconnue"), purl: String(comp.purl ?? "") },
169
+ sbom: ctx.sbom ? { fichier: ctx.sbom.fichier, serialNumber: String(sb?.serialNumber ?? ""), revision: Number(sb?.version) || 1, sha256: ctx.sbom.sha256 } : null,
170
+ source: { publication: prop("mostajs:publication"), etiquette: prop("mostajs:git:tag"), commit: prop("mostajs:git:commit") },
171
+ plan,
172
+ scripts: ctx.scripts,
173
+ environnement: ctx.environnement,
174
+ resultats,
175
+ synthese,
176
+ defauts,
177
+ // Les suites au format du rapport JSON : le compte rendu reste lisible par qatrax.dev (qa-engine) tel quel.
178
+ suites: report.suites,
179
+ };
180
+ }
181
+ /** Export CTRF (Common Test Report Format) d'un compte rendu. */
182
+ export function renderCtrf(cr) {
183
+ const st = { succes: "passed", echec: "failed", erreur: "failed", ignore: "skipped" };
184
+ const tests = (cr.resultats ?? []).map((x) => ({ name: x.titre, status: st[x.statut] ?? "other", duration: x.dureeMs, filePath: x.fichier, ...(x.message ? { message: x.message } : {}) }));
185
+ const c = (s) => tests.filter((t) => t.status === s).length;
186
+ const debut = Date.parse(cr.environnement?.debut ?? "") || 0;
187
+ const fin = Date.parse(cr.environnement?.fin ?? "") || debut;
188
+ return `${JSON.stringify({ reportFormat: "CTRF", specVersion: "0.0.0", results: {
189
+ tool: { name: cr.outil?.name ?? "@mostajs/mjs-unit", version: cr.outil?.version ?? "" },
190
+ summary: { tests: tests.length, passed: c("passed"), failed: c("failed"), pending: 0, skipped: c("skipped"), other: c("other"), start: debut, stop: fin },
191
+ tests,
192
+ environment: { appName: cr.produit?.nom, appVersion: cr.produit?.version, buildUrl: cr.environnement?.ci, commit: cr.source?.commit },
193
+ } }, null, 2)}\n`;
194
+ }
195
+ /** L'énoncé in-toto v1, prédicat test-result v0.1, NON signé : son sujet est la SBOM (la version éprouvée). */
196
+ export function renderInTotoTestResult(cr) {
197
+ const nomDe = (f) => String(f ?? "").split(/[\\/]/).pop() ?? "";
198
+ const r = cr.resultats ?? [];
199
+ const noms = (pred) => r.filter(pred).map((x) => x.titre);
200
+ const result = cr.synthese?.verdict === "non conforme" ? "FAILED" : cr.synthese?.verdict === "conforme" ? "PASSED" : "WARNED";
201
+ return `${JSON.stringify({
202
+ _type: "https://in-toto.io/Statement/v1",
203
+ subject: cr.sbom ? [{ name: nomDe(cr.sbom.fichier), digest: { sha256: cr.sbom.sha256 } }] : [],
204
+ predicateType: "https://in-toto.io/attestation/test-result/v0.1",
205
+ predicate: {
206
+ result,
207
+ configuration: [...(cr.plan ? [{ name: cr.plan.fichier, digest: { sha256: cr.plan.sha256 } }] : []), ...(cr.scripts ?? []).map((s) => ({ name: s.fichier, digest: { sha256: s.sha256 } }))],
208
+ ...(cr.environnement?.ci ? { url: cr.environnement.ci } : {}),
209
+ passedTests: noms((x) => x.statut === "succes"),
210
+ warnedTests: noms((x) => x.statut === "ignore"),
211
+ failedTests: noms((x) => x.statut === "echec" || x.statut === "erreur"),
212
+ },
213
+ }, null, 2)}\n`;
214
+ }
67
215
  //# sourceMappingURL=report.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"report.js","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"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"}
package/llms.txt CHANGED
@@ -26,7 +26,7 @@ réécrit `./x` → `./x.js` puis `./x/index.js`.
26
26
  - `./register` (register.mjs) : enregistre le resolver via `node --import`.
27
27
  - `./loader` (loader.mjs) : le hook `resolve` (pour usage avancé).
28
28
  - bin `mjs-unit` (bin/cli.mjs) : runner — active le resolver, importe les fichiers, exécute.
29
- Options : `--report[=fichier]` (preuve HTML, défaut test-report.html), `--json[=fichier]`,
29
+ Options : `--report[=fichier]` (preuve HTML, défaut test-report.html), `--json[=fichier]`, `--junit[=fichier]` (JUnit XML, 0.8.0), `--timeout=ms`, `--tag=a,b`,
30
30
  `--title="…"`. Ex. : `mjs-unit test-scripts/*.test.mjs --report --title="Mon module"`.
31
31
 
32
32
  ## API
@@ -43,8 +43,11 @@ réécrit `./x` → `./x.js` puis `./x/index.js`.
43
43
  une chaîne-message. Pour exiger une sous-chaîne en asynchrone, passer une RegExp.
44
44
  ⚠️ Avant la 0.5.0, toute RegExp passée ici était **décorative** — un refus survenant pour la
45
45
  MAUVAISE raison passait inaperçu. Relire les essais qui en passaient une.
46
- - run(label?): Promise<{passed, failed, skipped, label, results}> // exécute les cas ; exitCode=1 si échec
47
- results: { name, status: 'pass'|'fail'|'skip', error?, durationMs }[] // consommé par ./report
46
+ - run(label?): Promise<{passed, failed, skipped, errors, label, results}> // exécute les cas ; exitCode=1 si échec
47
+ results: { name, status: 'pass'|'fail'|'skip', error?, durationMs, kind?: 'failure'|'error', errorType?, stack?, skipReason?, title?, groups?, tags?, classname?, hook? }[]
48
+ - test(name, fn, { timeout?, tags?, skip? }) · test.skip(name, fn?, raison?) · test.each(table)(name, fn, opts?) // 0.8.0, notions JUnit 5
49
+ - beforeAll/afterAll/beforeEach/afterEach(fn) // au niveau du fichier ou d'un describe — 0.8.0
50
+ - setDefaultTimeout(ms) · setTagFilter(tags) // ce que le CLI pose par --timeout= et --tag= — 0.8.0
48
51
  - pending(): number
49
52
  - registered(): number // total des cas enregistrés (test + test.skip) depuis le chargement — 0.7.0
50
53
  - takeRuns(): RunResult[] // relève et vide les run() exécutés — le CLI s'en sert pour rapporter un fichier qui a appelé run() — 0.7.0
@@ -53,9 +56,27 @@ réécrit `./x` → `./x.js` puis `./x/index.js`.
53
56
  - renderHtmlReport(report: TestReport): string // document HTML autonome (thème sombre, cartes + tables par suite, durées, échappement anti-injection)
54
57
  - renderJsonReport(report: TestReport): string // JSON { ...report, summary }
55
58
  - summarize(report): { passed, failed, skipped, total, suites }
59
+ - renderJunitReport(report): string // JUnit XML (testsuites/testsuite/testcase, failure≠error, skipped, properties tag) — 0.8.0
60
+ - classnameDe(file, groups?): string // 'test-scripts/a.test.mjs' + ['G'] → 'test-scripts.a.test.G' — 0.8.0
56
61
  - TestReport = { suites: { file, results: TestResult[] }[], generatedAt: string, title?: string }
57
62
  L'appelant écrit le fichier ; le CLI le fait via `--report`/`--json`.
58
63
 
64
+ ## COMPTE RENDU DE VALIDATION (0.9.0, cycle CRA)
65
+ - CLI : `--sbom=f` (version LUE dans la SBOM CycloneDX), `--plan=f` (DEVTEST-PLAN), `--compte-rendu[=f]`
66
+ (défaut test-scripts/.out/compte-rendu.json), `--ctrf[=f]`, `--intoto[=f]` (test-result v0.1, non signé, sujet = SBOM).
67
+ - Format `mostajs-compte-rendu/1` : { format, genereLe, titre?, outil, produit{nom,version,purl}, sbom{fichier,serialNumber,
68
+ revision,sha256}|null, source{publication,etiquette,commit}, plan{fichier,sha256,couverts,manquants,horsPlan}|null,
69
+ scripts[{fichier,sha256}], environnement{node,plateforme,hote,ci?,debut,fin}, resultats[{ref,titre,fichier,
70
+ statut:succes|echec|erreur|ignore,dureeMs,motif?,message?}], synthese{declares,executes,succes,echecs,erreurs,ignores,
71
+ verdict:conforme|non conforme|incomplet}, defauts[], suites (format --json), integrite{algorithme,empreinte,exports} }.
72
+ - `integrite.empreinte` = sha256 de JSON.stringify(compte rendu sans `integrite`).
73
+ - Toujours écrit, même invalide (verdict incomplet + défauts) ; code de sortie = celui des essais.
74
+ - `./report` : construireCompteRendu(report, contexte) · renderCtrf(cr) · renderInTotoTestResult(cr) · refDe(titre) — purs.
75
+ - Menu : `mjs-unit-menu [--choix=1..6]` — essais, SBOM, compte rendu, envoi qatrax.dev (POST /sbom?p=&version= puis
76
+ POST /runs?p=&format=json, Bearer QATRAX_CLE), vulnérabilités (GET /vulnerabilites), dernier verdict.
77
+ - PIÈGES : un ignoré sans motif rend le verdict incomplet → `test.skip(nom, fn, 'motif')` ou `test(nom, fn, { skip: 'motif' })` ;
78
+ les essais doivent importer LA MÊME instance de mjs-unit que la CLI (sinon 0 cas exécuté, défaut « aucun cas exécuté »).
79
+
59
80
  ## API — WEB (./web, générique, zéro dépendance)
60
81
  - startServer(target): Promise<TestServer> // target = http.Server | RequestListener | app Express
61
82
  → { url, port, server, close() } ; écoute sur 127.0.0.1:0 ; close() ne ferme que les serveurs créés par mjs-unit
package/package.json CHANGED
@@ -1,14 +1,15 @@
1
1
  {
2
2
  "name": "@mostajs/mjs-unit",
3
- "version": "0.7.0",
4
- "description": "Micro-framework de test pour l'\u00e9cosyst\u00e8me @mostajs/* : z\u00e9ro d\u00e9pendance, API minimale (test/expect/run), runner CLI (preuves HTML/JSON via --report), reporters r\u00e9utilisables (./report), et un resolver ESM qui ex\u00e9cute sous Node les dist \u00e0 imports sans extension (convention moduleResolution=bundler).",
3
+ "version": "0.9.0",
4
+ "description": "Micro-framework de test pour l'écosystème @mostajs/* : zéro dépendance, API minimale (test/expect/run), runner CLI (preuves HTML/JSON/JUnit XML via --report/--json/--junit ; compte rendu de validation CRA lié à la SBOM, CTRF, in-toto test-result via --compte-rendu/--ctrf/--intoto ; menu en shell mjs-unit-menu), notions JUnit (échec/erreur, classname, crochets, délai, étiquettes, tests paramétrés), reporters réutilisables (./report), et un resolver ESM qui exécute sous Node les dist à imports sans extension (convention moduleResolution=bundler).",
5
5
  "author": "Dr Hamid MADANI <drmdh@msn.com>",
6
6
  "license": "AGPL-3.0-or-later",
7
7
  "type": "module",
8
8
  "main": "dist/index.js",
9
9
  "types": "dist/index.d.ts",
10
10
  "bin": {
11
- "mjs-unit": "bin/cli.mjs"
11
+ "mjs-unit": "bin/cli.mjs",
12
+ "mjs-unit-menu": "bin/mjs-unit-menu.sh"
12
13
  },
13
14
  "exports": {
14
15
  ".": {
@@ -45,7 +46,7 @@
45
46
  "scripts": {
46
47
  "build": "tsc -p tsconfig.json",
47
48
  "test": "bash test-scripts/run-tests.sh",
48
- "report": "npm run build && node bin/cli.mjs test-scripts/*.test.mjs --report=test-report.html --title=\"@mostajs/mjs-unit \u2014 auto-preuve\""
49
+ "report": "npm run build && node bin/cli.mjs test-scripts/*.test.mjs --report=test-report.html --title=\"@mostajs/mjs-unit — auto-preuve\""
49
50
  },
50
51
  "devDependencies": {
51
52
  "typescript": "^5.6.0",