@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 +1 -1
- package/dist/cms/adaptateurHttp.d.ts +4 -0
- package/dist/cms/adaptateurHttp.js +10 -0
- package/dist/cms/cmsCrisp.js +5 -4
- package/dist/cms/crispMarkdown.d.ts +5 -4
- package/dist/cms/crispMarkdown.js +22 -9
- package/dist/index.d.ts +1 -3
- package/dist/index.js +2 -3
- package/dist/serveur/serveurLab.d.ts +4 -2
- package/dist/serveur/serveurLab.js +32 -1
- package/package.json +2 -2
- package/dist/serveur/adaptateurEnvironnementServeurLab.d.ts +0 -2
- package/dist/serveur/adaptateurEnvironnementServeurLab.js +0 -34
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 =
|
|
32
|
+
const config = configurationServeurLabEnvironnement();
|
|
33
33
|
const app = creeServeurLab(config);
|
|
34
34
|
app.get('/', (req, res) => {res.json({})});
|
|
35
35
|
```
|
|
@@ -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;
|
package/dist/cms/cmsCrisp.js
CHANGED
|
@@ -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
|
-
|
|
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(
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
3
|
-
|
|
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,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;
|