@starterlib/cli 0.10.3 → 0.10.4

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@starterlib/cli",
3
- "version": "0.10.3",
3
+ "version": "0.10.4",
4
4
  "description": "Chaine de verification et de construction des SPA du socle frontal starter : starter-web verify, construire, sprite, manifeste, precompresser. Jamais en dependance de production.",
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",
@@ -157,6 +157,9 @@ export function ecrireLeManifeste(projet) {
157
157
  routes: source.routes,
158
158
  i18n: { perimetres: source.i18n?.perimetres, catalogues },
159
159
  sprite: `${prefixe}/icones/${sprite}`,
160
+ // Les politiques Trusted Types que le remote cree lui-meme (lot 270), comparees par le BFF a sa
161
+ // CSP : recopiees telles que declarees, absentes si le remote n'en cree aucune.
162
+ ...(source.trustedTypes === undefined ? {} : { trustedTypes: source.trustedTypes }),
160
163
  apiExigee: source.apiExigee,
161
164
  };
162
165
  writeFileSync(join(projet.sortie, 'manifest.json'), `${JSON.stringify(manifeste, null, 2)}\n`);
@@ -6,7 +6,8 @@
6
6
  * Pour tout fichier livre, cadre compris :
7
7
  * - eval, new Function, stockage du navigateur, lecture de cookie ;
8
8
  * - politiques Trusted Types comparees a la liste EXACTE du BFF
9
- * (`platform.web.headers.csp.trusted-types-policies`) ;
9
+ * (`platform.web.headers.csp.trusted-types-policies`), augmentee de celles que le remote
10
+ * declare (`trustedTypes` de `manifest.source.json`, lot 270) ;
10
11
  * - cartes de source (et leurs variantes compressees), script dans un SVG ;
11
12
  * - dans une page HTML : balise meta de politique de securite, script ou feuille EN LIGNE.
12
13
  *
@@ -28,7 +29,7 @@ import { join } from 'node:path';
28
29
  import { fichiers, lireJson, relatif } from '../commun.mjs';
29
30
  import { natureDesFichiers } from '../livraison.mjs';
30
31
 
31
- /** Les politiques que la CSP du BFF laisse creer (application.yml du BFF). */
32
+ /** Les politiques que la CSP du BFF laisse creer par defaut (application.yml du BFF). */
32
33
  export const POLITIQUES_ADMISES = ['angular', 'angular#components', 'es-module-shims', 'nfo'];
33
34
 
34
35
  const CREATION_DE_POLITIQUE = /trustedTypes\s*\.\s*createPolicy\(\s*['"]([^'"]*)['"]/g;
@@ -165,7 +166,11 @@ function jugerUnePage(nom, contenu) {
165
166
  * Les defauts d'un fichier livre `nom` (relatif au dossier livre) de contenu `contenu`. `role` :
166
167
  * `remote` ou `hote` ; `partage` : le fichier est du code du cadre, partage par la federation.
167
168
  */
168
- export function jugerUnFichierLivre(nom, contenu, { role = 'remote', partage = false } = {}) {
169
+ export function jugerUnFichierLivre(
170
+ nom,
171
+ contenu,
172
+ { role = 'remote', partage = false, declarees = [] } = {},
173
+ ) {
169
174
  // Une carte, ou sa variante compressee : `/x.js.map.br` se servirait aussi bien que l'original.
170
175
  if (/\.map(?:\.br|\.gz)?$/.test(nom)) {
171
176
  return [`${nom} : carte de source livree (sourceMap doit rester false en production).`];
@@ -190,10 +195,11 @@ export function jugerUnFichierLivre(nom, contenu, { role = 'remote', partage = f
190
195
  const duCadre = POLITIQUES_DU_CADRE.some(
191
196
  (exception) => exception.fichier.test(nom) && exception.politique === politique,
192
197
  );
193
- if (!POLITIQUES_ADMISES.includes(politique) && !duCadre) {
198
+ if (!POLITIQUES_ADMISES.includes(politique) && !declarees.includes(politique) && !duCadre) {
194
199
  defauts.push(
195
200
  `${nom} : politique Trusted Types hors liste ("${politique}" ; admises : ` +
196
- `${POLITIQUES_ADMISES.join(', ')}). La declarer au BFF avant livraison.`,
201
+ `${[...POLITIQUES_ADMISES, ...declarees].join(', ')}). La declarer dans ` +
202
+ 'manifest.source.json (trustedTypes) et a la CSP du BFF avant livraison.',
197
203
  );
198
204
  }
199
205
  }
@@ -223,16 +229,31 @@ export default {
223
229
  };
224
230
  }
225
231
  const { partages } = natureDesFichiers(lireJson(join(projet.sortie, 'remoteEntry.json')));
232
+ // Les politiques que le remote declare (lot 270) ; le BFF retire celui qui en exige une que sa
233
+ // CSP n'admet pas : l'etape le dit des la construction.
234
+ const declarees = projet.role === 'remote' ? (projet.source?.trustedTypes ?? []) : [];
235
+ const avertissements = declarees
236
+ .filter((politique) => !POLITIQUES_ADMISES.includes(politique))
237
+ .map(
238
+ (politique) =>
239
+ `trustedTypes : "${politique}" absente de la liste par defaut du BFF ` +
240
+ '(PLATFORM_WEB_CSP_TRUSTED_TYPES) : le BFF retire le remote tant qu elle n y est pas.',
241
+ );
226
242
  const defauts = [];
227
243
  for (const chemin of livres) {
228
244
  const nom = relatif(projet.sortie, chemin);
229
245
  const contenu = /\.(?:m?js|html|svg|css)$/.test(nom) ? readFileSync(chemin, 'utf8') : '';
230
246
  defauts.push(
231
- ...jugerUnFichierLivre(nom, contenu, { role: projet.role, partage: partages.has(nom) }),
247
+ ...jugerUnFichierLivre(nom, contenu, {
248
+ role: projet.role,
249
+ partage: partages.has(nom),
250
+ declarees,
251
+ }),
232
252
  );
233
253
  }
234
254
  return {
235
255
  defauts,
256
+ avertissements,
236
257
  resume: `${String(livres.length)} fichier(s) livre(s) dont ${String(partages.size)} du cadre partage, rien a signaler.`,
237
258
  };
238
259
  },