| // Copyright 2021 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| const cssnano = require('cssnano'); |
| const fs = require('fs'); |
| const path = require('path'); |
| const postcss = require('postcss'); |
| |
| const {writeIfChanged} = require('./ninja/write-if-changed.js'); |
| |
| async function runCSSMinification(input, fileName) { |
| // postcss needs to be given a fileName, even though it doesn't read from it nor write to it. |
| // So we pass in the correct name, even though it has no impact on the resulting code. |
| const result = await postcss([cssnano({preset: require('cssnano-preset-lite')})]).process(input, {from: fileName}); |
| return result.css; |
| } |
| |
| async function codeForFile({srcDir, fileName, input, isDebug, buildTimestamp}) { |
| input = input.replace(/\`/g, '\\\''); |
| input = input.replace(/\\/g, '\\\\'); |
| |
| const stylesheetContents = isDebug ? input : await runCSSMinification(input, fileName); |
| |
| return `// Copyright ${ |
| new Date(Number(buildTimestamp) * 1000).getUTCFullYear()} The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| // IMPORTANT: this file is auto generated. Please do not edit this file. |
| /* istanbul ignore file */ |
| export default { |
| cssContent: \`${stylesheetContents} |
| /*# sourceURL=\${import.meta.resolve('./${fileName}')} */ |
| \` |
| };`; |
| } |
| |
| // Exported only so it can be unit tested. |
| exports.codeForFile = codeForFile; |
| |
| async function runMain() { |
| const [, , buildTimestamp, isDebugString, targetName, srcDir, targetGenDir, files] = process.argv; |
| |
| const filenames = files.split(','); |
| const configFiles = []; |
| const isDebug = isDebugString === 'true'; |
| |
| for (const fileName of filenames) { |
| const contents = fs.readFileSync(path.join(srcDir, fileName), {encoding: 'utf8', flag: 'r'}); |
| const newContents = await codeForFile({srcDir, fileName, isDebug, input: contents, buildTimestamp}); |
| const generatedFileName = `${fileName}.js`; |
| const generatedFileLocation = path.join(targetGenDir, generatedFileName); |
| |
| writeIfChanged(generatedFileLocation, newContents); |
| |
| configFiles.push(`\"${generatedFileName}\"`); |
| } |
| |
| writeIfChanged(path.join(targetGenDir, `${targetName}-tsconfig.json`), `{ |
| "compilerOptions": { |
| "composite": true, |
| "outDir": "." |
| }, |
| "files": [ |
| ${configFiles.join(',\n ')} |
| ] |
| } |
| `); |
| } |
| |
| if (require.main === module) { |
| runMain(); |
| } |