-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathrollup.config.mjs
122 lines (113 loc) · 4.14 KB
/
rollup.config.mjs
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
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 cssnano from "cssnano";
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 ce fichier n'existe pas, on crée un fichier index.md avec un contenu par défaut
if (!fs.existsSync(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 === "CIRCULAR_DEPENDENCY" ||
warning.code === "THIS_IS_UNDEFINED"
) {
return;
}
console.warn(`(!) ${warning.message}`);
};
// En mode DEBUG, on ne change pas le nom des variables, afin de pouvoir les vérifier
const optionsTerser = process.env.DEBUG == "true" ? { mangle: false } : {};
// 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: [
cssnano({
preset: "default",
}),
],
}),
],
};