-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathrollup.config.mjs
More file actions
129 lines (120 loc) · 4.33 KB
/
rollup.config.mjs
File metadata and controls
129 lines (120 loc) · 4.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import terser from "@rollup/plugin-terser";
import { string } from "rollup-plugin-string";
import fs from "fs";
import path from "path";
import postcss from "rollup-plugin-postcss";
import clean from "postcss-clean";
const ECMA_VERSION = 2018;
const appFolder = "app/";
const folderWithMarkdownFilesToCombine = appFolder + "data/";
const mainMdFileName = "index.md";
const warningAutomaticallyGeneratedFile =
"\n<!--Fichier généré automatiquement à partir des fichiers présents dans le dossier data/.\nAttention : les modifications faites manuellement dans ce fichier seront écrasées à la prochaine compilation de ChatMD -->\n";
// Pour récupérer tous les fichiers en Markdown dans un dossier, de manière récusrive
function getAllMdFiles(dir) {
const files = fs.readdirSync(dir, { withFileTypes: true });
let mdFiles = [];
for (const file of files) {
const res = path.resolve(dir, file.name);
if (file.isDirectory()) {
mdFiles = mdFiles.concat(getAllMdFiles(res));
} else if (file.name.endsWith(".md")) {
mdFiles.push(res);
}
}
return mdFiles;
}
// Pour concaténer le contenu d'un ensemble de fichiers
function combineFilesContent(files) {
const filesContent = files.map((file) => fs.readFileSync(file, "utf8"));
return [...filesContent].join("\n");
}
// Pour ajouter un message après l'en-tête YAML, s'il y en a un, dans un contenu en Markdown
function addMessageAfterYAML(initialMarkdown, message) {
let content = initialMarkdown.trim();
const yaml =
content.startsWith("---") && content.split("---").length > 2
? "---" + content.split("---")[1] + "---\n"
: "";
if (yaml) {
const contentWithoutYaml = content.replace(yaml, "");
content = yaml + message + contentWithoutYaml;
} else {
content = message + content;
}
return content;
}
// On regarde s'il existe un dossier de fichiers Markdown à concaténer pour créer le fichier index.md
if (fs.existsSync(folderWithMarkdownFilesToCombine)) {
// Si ce dossier existe …
const mainMdFile = folderWithMarkdownFilesToCombine + mainMdFileName;
let mainMdContent = fs.readFileSync(mainMdFile, "utf8");
// … on fait la concaténation des fichiers Markdown dans ce dossier
const mdFiles = getAllMdFiles(appFolder + "data").filter(
(file) => !file.endsWith(mainMdFile),
);
if (mdFiles) {
// … puis on crée le fichier index.md à partir de ces fichiers
const combinedContent = combineFilesContent(mdFiles);
mainMdContent = [mainMdContent, ...combinedContent].join("\n");
// On ajoute un message d'avertissement dans le fichier, juste après l'en-tête YAML
// afin de préciser que le contenu de ce fichier a été généré automatiquement
// à partir d'un dossier de fichiers en Markdown
mainMdContent = addMessageAfterYAML(
mainMdContent,
warningAutomaticallyGeneratedFile,
);
fs.writeFileSync(appFolder + "index.md", mainMdContent);
}
} else {
// Si le dossier n'existe pas, on utilise le fichier index.md pour définir le contenu principal, mais si ce fichier n'existe pas, on crée un fichier index.md avec un contenu par défaut
if (!fs.existsSync(appFolder + mainMdFileName)) {
const defaultContent =
"# Chatbot\nAucun chatbot par défaut n'a été configuré.\nIl faut créer un fichier index.md dans votre dépôt pour définir le chatbot par défaut.";
fs.writeFileSync(appFolder + "index.md", defaultContent);
}
}
// On supprime certains messages d'erreurs qu'affiche Rollup et qui ne sont pas très utiles
const onwarn = (warning) => {
if (warning.code === "THIS_IS_UNDEFINED") {
// On désactive le message d'erreur affiché à cause du module showdown
return;
}
console.warn(`(!) ${warning.message}`);
};
// En mode DEBUG, on ne change pas le nom des variables, afin de pouvoir les vérifier
const optionsTerser =
// eslint-disable-next-line no-undef
process.env.DEBUG == "true"
? { mangle: false, ecma: ECMA_VERSION }
: { ecma: ECMA_VERSION };
// Configuration de la compilation avec Rollup
export default {
input: appFolder + "js/main.mjs",
onwarn,
output: {
file: appFolder + "script.min.js",
format: "iife",
plugins: [terser(optionsTerser)],
sourcemap: true,
},
plugins: [
string({
include: appFolder + "*.md",
}),
postcss({
extensions: [".css"],
extract: "css/styles.min.css",
minimize: true,
plugins: [
clean({
level: {
2: {
all: true,
},
},
}),
],
}),
],
};