| 
									
										
										
										
											2017-11-23 16:22:54 +08:00
										 |  |  | #!/usr/bin/env node
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*! | 
					
						
							|  |  |  |  * Script to generate SRI hashes for use in our docs. | 
					
						
							|  |  |  |  * Remember to use the same vendor files as the CDN ones, | 
					
						
							|  |  |  |  * otherwise the hashes won't match! | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2024-02-06 04:39:38 +08:00
										 |  |  |  * Copyright 2017-2024 The Bootstrap Authors | 
					
						
							| 
									
										
										
										
											2020-06-17 02:41:47 +08:00
										 |  |  |  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
 | 
					
						
							| 
									
										
										
										
											2017-11-23 16:22:54 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-06 12:37:24 +08:00
										 |  |  | import crypto from 'node:crypto' | 
					
						
							|  |  |  | import fs from 'node:fs' | 
					
						
							|  |  |  | import path from 'node:path' | 
					
						
							|  |  |  | import { fileURLToPath } from 'node:url' | 
					
						
							|  |  |  | import sh from 'shelljs' | 
					
						
							| 
									
										
										
										
											2018-11-28 19:03:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-06 12:37:24 +08:00
										 |  |  | const __dirname = path.dirname(fileURLToPath(import.meta.url)) | 
					
						
							| 
									
										
										
										
											2017-11-23 16:22:54 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | sh.config.fatal = true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-17 12:18:01 +08:00
										 |  |  | const configFile = path.join(__dirname, '../hugo.yml') | 
					
						
							| 
									
										
										
										
											2017-11-23 16:22:54 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | // Array of objects which holds the files to generate SRI hashes for.
 | 
					
						
							|  |  |  | // `file` is the path from the root folder
 | 
					
						
							| 
									
										
										
										
											2023-05-17 12:18:01 +08:00
										 |  |  | // `configPropertyName` is the hugo.yml variable's name of the file
 | 
					
						
							| 
									
										
										
										
											2017-11-23 16:22:54 +08:00
										 |  |  | const files = [ | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     file: 'dist/css/bootstrap.min.css', | 
					
						
							|  |  |  |     configPropertyName: 'css_hash' | 
					
						
							|  |  |  |   }, | 
					
						
							| 
									
										
										
										
											2020-06-08 23:19:14 +08:00
										 |  |  |   { | 
					
						
							|  |  |  |     file: 'dist/css/bootstrap.rtl.min.css', | 
					
						
							|  |  |  |     configPropertyName: 'css_rtl_hash' | 
					
						
							|  |  |  |   }, | 
					
						
							| 
									
										
										
										
											2017-11-23 16:22:54 +08:00
										 |  |  |   { | 
					
						
							|  |  |  |     file: 'dist/js/bootstrap.min.js', | 
					
						
							|  |  |  |     configPropertyName: 'js_hash' | 
					
						
							|  |  |  |   }, | 
					
						
							|  |  |  |   { | 
					
						
							| 
									
										
										
										
											2018-09-28 23:09:49 +08:00
										 |  |  |     file: 'dist/js/bootstrap.bundle.min.js', | 
					
						
							|  |  |  |     configPropertyName: 'js_bundle_hash' | 
					
						
							| 
									
										
										
										
											2018-09-28 22:45:05 +08:00
										 |  |  |   }, | 
					
						
							|  |  |  |   { | 
					
						
							| 
									
										
										
										
											2020-06-19 16:17:01 +08:00
										 |  |  |     file: 'node_modules/@popperjs/core/dist/umd/popper.min.js', | 
					
						
							| 
									
										
										
										
											2018-09-28 22:45:05 +08:00
										 |  |  |     configPropertyName: 'popper_hash' | 
					
						
							| 
									
										
										
										
											2017-11-23 16:22:54 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | ] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-10 01:13:08 +08:00
										 |  |  | for (const { file, configPropertyName } of files) { | 
					
						
							|  |  |  |   fs.readFile(file, 'utf8', (error, data) => { | 
					
						
							| 
									
										
										
										
											2021-10-29 15:38:35 +08:00
										 |  |  |     if (error) { | 
					
						
							|  |  |  |       throw error | 
					
						
							| 
									
										
										
										
											2017-11-23 16:22:54 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-06 12:37:24 +08:00
										 |  |  |     const algorithm = 'sha384' | 
					
						
							|  |  |  |     const hash = crypto.createHash(algorithm).update(data, 'utf8').digest('base64') | 
					
						
							|  |  |  |     const integrity = `${algorithm}-${hash}` | 
					
						
							| 
									
										
										
										
											2017-11-23 16:22:54 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-10 01:13:08 +08:00
										 |  |  |     console.log(`${configPropertyName}: ${integrity}`) | 
					
						
							| 
									
										
										
										
											2017-11-23 16:22:54 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-10 01:13:08 +08:00
										 |  |  |     sh.sed('-i', new RegExp(`^(\\s+${configPropertyName}:\\s+["'])\\S*(["'])`), `$1${integrity}$2`, configFile) | 
					
						
							| 
									
										
										
										
											2017-11-23 16:22:54 +08:00
										 |  |  |   }) | 
					
						
							| 
									
										
										
										
											2021-07-30 14:28:51 +08:00
										 |  |  | } |