@mostajs/mjs-unit 0.8.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
@@ -100,6 +100,21 @@ Le fichier suit le schéma lu par Jenkins, GitLab (`artifacts:reports:junit`), G
100
100
  tombée, `<error>` pour une exception inattendue ou un délai dépassé, `<skipped message>` pour un cas ignoré,
101
101
  les étiquettes en `<property name="tag">`. `--tag=securite` ne joue que les cas étiquetés.
102
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
+
103
118
  ## API
104
119
 
105
120
  | Fonction | Rôle |
package/bin/cli.mjs CHANGED
@@ -10,13 +10,22 @@
10
10
  * --timeout=ms délai par défaut de chaque cas (un cas le surcharge par { timeout })
11
11
  * --tag=a,b ne joue que les cas étiquetés a ou b ; les autres sont rapportés ignorés
12
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)
13
20
  *
14
21
  * @author Dr Hamid MADANI <drmdh@msn.com> · AGPL-3.0-or-later
15
22
  */
16
23
  import { register } from "node:module";
17
24
  import { pathToFileURL } from "node:url";
18
- import { writeFileSync } from "node:fs";
25
+ import { writeFileSync, readFileSync, mkdirSync } from "node:fs";
19
26
  import { hostname } from "node:os";
27
+ import { createHash } from "node:crypto";
28
+ import { dirname } from "node:path";
20
29
 
21
30
  register(new URL("../loader.mjs", import.meta.url));
22
31
  const { run, pending, registered, takeRuns, setDefaultTimeout, setTagFilter } = await import("../dist/index.js");
@@ -35,7 +44,9 @@ const junitOut = opt("junit");
35
44
  const title = opt("title");
36
45
  if (opt("timeout")) setDefaultTimeout(Number(opt("timeout")));
37
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");
38
48
  const files = argv.filter((a) => !a.startsWith("--"));
49
+ const debut = new Date().toISOString();
39
50
  if (!files.length) { console.error("usage: mjs-unit <fichier-de-test...> [--report[=f]] [--json[=f]]"); process.exit(2); }
40
51
 
41
52
  // ── Exécution, une suite par fichier ─────────────────────────────────────────
@@ -90,4 +101,31 @@ if (htmlOut !== undefined || jsonOut !== undefined || junitOut !== undefined) {
90
101
  }
91
102
  }
92
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
+ }
129
+ }
130
+
93
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/report.d.ts CHANGED
@@ -44,4 +44,52 @@ export declare function summarize(report: TestReport): {
44
44
  export declare function renderJsonReport(report: TestReport): string;
45
45
  /** Rapport HTML autonome (thème sombre, cartes de synthèse + tables par suite). */
46
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;
47
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,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"}
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
@@ -109,4 +109,107 @@ export function renderHtmlReport(report) {
109
109
  <footer>Auteur : Dr Hamid MADANI &lt;drmdh@msn.com&gt; · AGPL-3.0-or-later</footer>
110
110
  </body></html>`;
111
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
+ }
112
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
@@ -61,6 +61,22 @@ réécrit `./x` → `./x.js` puis `./x/index.js`.
61
61
  - TestReport = { suites: { file, results: TestResult[] }[], generatedAt: string, title?: string }
62
62
  L'appelant écrit le fichier ; le CLI le fait via `--report`/`--json`.
63
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
+
64
80
  ## API — WEB (./web, générique, zéro dépendance)
65
81
  - startServer(target): Promise<TestServer> // target = http.Server | RequestListener | app Express
66
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.8.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/JUnit XML via --report/--json/--junit), notions JUnit (échec/erreur, classname, crochets, délai, étiquettes, tests paramétrés), 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",