@lab-anssi/lib 1.5.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -29,7 +29,7 @@ app.get('/', (req, res) => {res.json({})});
29
29
  La configuration serveur peut-être construite automatiquement à partir des variables d'environnement :
30
30
 
31
31
  ```
32
- const config = adaptateurEnvironnementServeurLab();
32
+ const config = configurationServeurLabEnvironnement();
33
33
  const app = creeServeurLab(config);
34
34
  app.get('/', (req, res) => {res.json({})});
35
35
  ```
@@ -0,0 +1,4 @@
1
+ export interface AdaptateurHttp {
2
+ ressourceExiste(url: string): Promise<boolean>;
3
+ }
4
+ export declare const fabriqueAdaptateurHttp: () => AdaptateurHttp;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fabriqueAdaptateurHttp = void 0;
4
+ const fabriqueAdaptateurHttp = () => ({
5
+ ressourceExiste: async (url) => {
6
+ const response = await fetch(url, { method: 'HEAD' });
7
+ return response.ok;
8
+ },
9
+ });
10
+ exports.fabriqueAdaptateurHttp = fabriqueAdaptateurHttp;
@@ -4,15 +4,16 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.CmsCrisp = void 0;
7
+ const erreurs_1 = require("../erreurs");
7
8
  const adaptateurCmsCrisp_1 = require("./adaptateurCmsCrisp");
9
+ const adaptateurHttp_1 = require("./adaptateurHttp");
8
10
  const crispMarkdown_1 = __importDefault(require("./crispMarkdown"));
9
- const erreurs_1 = require("../erreurs");
10
11
  class CmsCrisp {
11
12
  adaptateurCmsCrisp;
12
13
  constructeurCrispMarkdown;
13
14
  constructor(idSite, cleApi) {
14
15
  this.adaptateurCmsCrisp = new adaptateurCmsCrisp_1.AdaptateurCmsCrisp(idSite, cleApi);
15
- this.constructeurCrispMarkdown = (contenuMarkdown) => new crispMarkdown_1.default(contenuMarkdown);
16
+ this.constructeurCrispMarkdown = (contenuMarkdown) => new crispMarkdown_1.default(contenuMarkdown, (0, adaptateurHttp_1.fabriqueAdaptateurHttp)());
16
17
  }
17
18
  async recupereArticle(id) {
18
19
  const article = await this.adaptateurCmsCrisp.recupereArticle(id);
@@ -20,9 +21,9 @@ class CmsCrisp {
20
21
  let crispMarkdown = this.constructeurCrispMarkdown(contenuMarkdown);
21
22
  return {
22
23
  titre,
23
- contenu: crispMarkdown.versHTML(),
24
+ contenu: await crispMarkdown.versHTML(),
24
25
  description,
25
- tableDesMatieres: crispMarkdown.tableDesMatieres(),
26
+ tableDesMatieres: await crispMarkdown.tableDesMatieres(),
26
27
  };
27
28
  }
28
29
  async recupereArticleCategorie(slug, idCategorie) {
@@ -1,3 +1,4 @@
1
+ import { AdaptateurHttp } from './adaptateurHttp';
1
2
  import { EntreeTableDesMatieres } from './types';
2
3
  declare class CrispMarkdown {
3
4
  private contenuMarkdown;
@@ -5,9 +6,9 @@ declare class CrispMarkdown {
5
6
  private aDejaParse;
6
7
  private tdm;
7
8
  private marked;
8
- constructor(contenuMarkdown: string);
9
- parseLeMarkdown(): void;
10
- versHTML(): string | null;
11
- tableDesMatieres(): EntreeTableDesMatieres[];
9
+ constructor(contenuMarkdown: string, adaptateurHttp: AdaptateurHttp);
10
+ parseLeMarkdown(): Promise<void>;
11
+ versHTML(): Promise<string | null>;
12
+ tableDesMatieres(): Promise<EntreeTableDesMatieres[]>;
12
13
  }
13
14
  export default CrispMarkdown;
@@ -31,7 +31,7 @@ class CrispMarkdown {
31
31
  aDejaParse = false;
32
32
  tdm = [];
33
33
  marked;
34
- constructor(contenuMarkdown) {
34
+ constructor(contenuMarkdown, adaptateurHttp) {
35
35
  this.contenuMarkdown = contenuMarkdown;
36
36
  const boiteAide = extensionBoite(/^\|([^|\n]+)/, 'boiteAide', 'aide');
37
37
  const boiteInfo = extensionBoite(/^\|\|([^||\n]+)/, 'boiteInfo', 'information');
@@ -57,7 +57,10 @@ class CrispMarkdown {
57
57
  return false;
58
58
  },
59
59
  renderer(token) {
60
- return `<div class='conteneur-video'><video src='${token.text}' controls></video><p class='legende'>${token.legende}</p></div>`;
60
+ const elementPiste = token.lienPisteSousTitres
61
+ ? `<track kind='captions' src='${token.lienPisteSousTitres}' srclang='fr' default />`
62
+ : '';
63
+ return `<div class='conteneur-video'><video src='${token.text}' controls>${elementPiste}</video><p class='legende'>${token.legende}</p></div>`;
61
64
  },
62
65
  };
63
66
  // Source d'inspiration pour la gestion des sections :
@@ -109,23 +112,33 @@ class CrispMarkdown {
109
112
  },
110
113
  });
111
114
  this.marked = new marked_1.Marked({
115
+ async: true,
112
116
  renderer: moteurDeRendu(this),
113
117
  extensions: [boiteAide, boiteInfo, boiteAlerte, video, section],
118
+ walkTokens: async (token) => {
119
+ if (token.type === 'video') {
120
+ const lienPisteSousTitres = token.text.replace('.mp4', '.vtt');
121
+ const pisteSousTitresExiste = await adaptateurHttp.ressourceExiste(lienPisteSousTitres);
122
+ token.lienPisteSousTitres = pisteSousTitresExiste
123
+ ? lienPisteSousTitres
124
+ : undefined;
125
+ }
126
+ },
114
127
  });
115
128
  }
116
- parseLeMarkdown() {
117
- const avecCorrectionLigneHorizontale = this.contenuMarkdown.replaceAll("\n---", "\n\n---");
118
- this.contenuHTML = this.marked.parse(avecCorrectionLigneHorizontale);
129
+ async parseLeMarkdown() {
130
+ const avecCorrectionLigneHorizontale = this.contenuMarkdown.replaceAll('\n---', '\n\n---');
131
+ this.contenuHTML = (await this.marked.parse(avecCorrectionLigneHorizontale));
119
132
  this.aDejaParse = true;
120
133
  }
121
- versHTML() {
134
+ async versHTML() {
122
135
  if (!this.aDejaParse)
123
- this.parseLeMarkdown();
136
+ await this.parseLeMarkdown();
124
137
  return this.contenuHTML;
125
138
  }
126
- tableDesMatieres() {
139
+ async tableDesMatieres() {
127
140
  if (!this.aDejaParse)
128
- this.parseLeMarkdown();
141
+ await this.parseLeMarkdown();
129
142
  return this.tdm;
130
143
  }
131
144
  }
package/dist/index.d.ts CHANGED
@@ -2,6 +2,4 @@ export { type EntreeTableDesMatieres, type PageHtmlCrisp, type ResumeArticleCris
2
2
  export { CmsCrisp } from './cms/cmsCrisp';
3
3
  export { AdaptateurProfilAnssi } from './profilAnssi/adaptateurProfilAnssi';
4
4
  export { ErreurArticleCrispIntrouvable } from './erreurs';
5
- export { type ConfigurationServeurLab } from './serveur/serveurLab';
6
- export { creeServeurLab } from './serveur/serveurLab';
7
- export { adaptateurEnvironnementServeurLab } from './serveur/adaptateurEnvironnementServeurLab';
5
+ export { type ConfigurationServeurLab, creeServeurLab, configurationServeurLabEnvironnement, } from './serveur/serveurLab';
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.adaptateurEnvironnementServeurLab = exports.creeServeurLab = exports.ErreurArticleCrispIntrouvable = exports.AdaptateurProfilAnssi = exports.CmsCrisp = void 0;
3
+ exports.configurationServeurLabEnvironnement = exports.creeServeurLab = exports.ErreurArticleCrispIntrouvable = exports.AdaptateurProfilAnssi = exports.CmsCrisp = void 0;
4
4
  var cmsCrisp_1 = require("./cms/cmsCrisp");
5
5
  Object.defineProperty(exports, "CmsCrisp", { enumerable: true, get: function () { return cmsCrisp_1.CmsCrisp; } });
6
6
  var adaptateurProfilAnssi_1 = require("./profilAnssi/adaptateurProfilAnssi");
@@ -9,5 +9,4 @@ var erreurs_1 = require("./erreurs");
9
9
  Object.defineProperty(exports, "ErreurArticleCrispIntrouvable", { enumerable: true, get: function () { return erreurs_1.ErreurArticleCrispIntrouvable; } });
10
10
  var serveurLab_1 = require("./serveur/serveurLab");
11
11
  Object.defineProperty(exports, "creeServeurLab", { enumerable: true, get: function () { return serveurLab_1.creeServeurLab; } });
12
- var adaptateurEnvironnementServeurLab_1 = require("./serveur/adaptateurEnvironnementServeurLab");
13
- Object.defineProperty(exports, "adaptateurEnvironnementServeurLab", { enumerable: true, get: function () { return adaptateurEnvironnementServeurLab_1.adaptateurEnvironnementServeurLab; } });
12
+ Object.defineProperty(exports, "configurationServeurLabEnvironnement", { enumerable: true, get: function () { return serveurLab_1.configurationServeurLabEnvironnement; } });
@@ -1,9 +1,11 @@
1
1
  import { Express } from 'express';
2
- export declare const creeServeurLab: (config: ConfigurationServeurLab) => Express;
3
- export type ConfigurationServeurLab = {
2
+ declare const creeServeurLab: (config: ConfigurationServeurLab) => Express;
3
+ type ConfigurationServeurLab = {
4
4
  reseau: {
5
5
  trustProxy: number | string;
6
6
  maxRequetesParMinute: number;
7
7
  ipAutorisees: string[] | false;
8
8
  };
9
9
  };
10
+ declare const configurationServeurLabEnvironnement: () => ConfigurationServeurLab;
11
+ export { configurationServeurLabEnvironnement, creeServeurLab, ConfigurationServeurLab, };
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.creeServeurLab = void 0;
6
+ exports.creeServeurLab = exports.configurationServeurLabEnvironnement = void 0;
7
7
  const express_ipfilter_1 = require("express-ipfilter");
8
8
  const express_rate_limit_1 = __importDefault(require("express-rate-limit"));
9
9
  const creeServeurLab = (config) => {
@@ -46,3 +46,34 @@ const creeServeurLab = (config) => {
46
46
  return app;
47
47
  };
48
48
  exports.creeServeurLab = creeServeurLab;
49
+ const configurationServeurLabEnvironnement = () => {
50
+ return {
51
+ reseau: {
52
+ trustProxy: trustProxy(),
53
+ maxRequetesParMinute: maxRequetesParMinute(),
54
+ ipAutorisees: process.env.SERVEUR_ADRESSES_IP_AUTORISEES?.split(',') ?? false,
55
+ },
56
+ };
57
+ };
58
+ exports.configurationServeurLabEnvironnement = configurationServeurLabEnvironnement;
59
+ const trustProxy = () => {
60
+ const trustProxyEnChaine = process.env.SERVEUR_TRUST_PROXY || '0';
61
+ const trustProxyEnNombre = Number(trustProxyEnChaine);
62
+ if (isNaN(trustProxyEnNombre)) {
63
+ console.warn(`Attention ! SERVEUR_TRUST_PROXY positionné à ${trustProxyEnChaine}`);
64
+ return trustProxyEnChaine;
65
+ }
66
+ else {
67
+ return trustProxyEnNombre;
68
+ }
69
+ };
70
+ const maxRequetesParMinute = () => {
71
+ const maxEnChaine = process.env.SERVEUR_MAX_REQUETES_PAR_MINUTE || '600';
72
+ const maxEnNombre = Number(maxEnChaine);
73
+ if (isNaN(maxEnNombre)) {
74
+ throw new Error(`SERVEUR_MAX_REQUETES_PAR_MINUTE n'est pas un nombre : ${maxEnChaine}`);
75
+ }
76
+ else {
77
+ return maxEnNombre;
78
+ }
79
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lab-anssi/lib",
3
- "version": "1.5.0",
3
+ "version": "2.1.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/betagouv/lab-anssi-lib.git"
@@ -44,4 +44,4 @@
44
44
  "peerDependencies": {
45
45
  "express": "^4.21.2"
46
46
  }
47
- }
47
+ }
@@ -1,2 +0,0 @@
1
- import { ConfigurationServeurLab } from './serveurLab';
2
- export declare const adaptateurEnvironnementServeurLab: () => ConfigurationServeurLab;
@@ -1,34 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.adaptateurEnvironnementServeurLab = void 0;
4
- const trustProxy = () => {
5
- const trustProxyEnChaine = process.env.SERVEUR_TRUST_PROXY || '0';
6
- const trustProxyEnNombre = Number(trustProxyEnChaine);
7
- if (isNaN(trustProxyEnNombre)) {
8
- console.warn(`Attention ! SERVEUR_TRUST_PROXY positionné à ${trustProxyEnChaine}`);
9
- return trustProxyEnChaine;
10
- }
11
- else {
12
- return trustProxyEnNombre;
13
- }
14
- };
15
- const maxRequetesParMinute = () => {
16
- const maxEnChaine = process.env.SERVEUR_MAX_REQUETES_PAR_MINUTE || '600';
17
- const maxEnNombre = Number(maxEnChaine);
18
- if (isNaN(maxEnNombre)) {
19
- throw new Error(`SERVEUR_MAX_REQUETES_PAR_MINUTE n'est pas un nombre : ${maxEnChaine}`);
20
- }
21
- else {
22
- return maxEnNombre;
23
- }
24
- };
25
- const adaptateurEnvironnementServeurLab = () => {
26
- return {
27
- reseau: {
28
- trustProxy: trustProxy(),
29
- maxRequetesParMinute: maxRequetesParMinute(),
30
- ipAutorisees: process.env.SERVEUR_ADRESSES_IP_AUTORISEES?.split(',') ?? false,
31
- },
32
- };
33
- };
34
- exports.adaptateurEnvironnementServeurLab = adaptateurEnvironnementServeurLab;