Spaces:
Sleeping
Sleeping
| import crypto from 'crypto' | |
| import * as sharedState from './sharedState' | |
| /** | |
| * Calculate the hash of a string. | |
| * | |
| * This doesn't need to be cryptographically secure or | |
| * anything like that since it's used only to detect | |
| * when the CSS changes to invalidate the context. | |
| * | |
| * This is wrapped in a try/catch because it's really dependent | |
| * on how Node itself is build and the environment and OpenSSL | |
| * version / build that is installed on the user's machine. | |
| * | |
| * Based on the environment this can just outright fail. | |
| * | |
| * See https://github.com/nodejs/node/issues/40455 | |
| * | |
| * @param {string} str | |
| */ | |
| function getHash(str) { | |
| try { | |
| return crypto.createHash('md5').update(str, 'utf-8').digest('binary') | |
| } catch (err) { | |
| return '' | |
| } | |
| } | |
| /** | |
| * Determine if the CSS tree is different from the | |
| * previous version for the given `sourcePath`. | |
| * | |
| * @param {string} sourcePath | |
| * @param {import('postcss').Node} root | |
| */ | |
| export function hasContentChanged(sourcePath, root) { | |
| let css = root.toString() | |
| // We only care about files with @tailwind directives | |
| // Other files use an existing context | |
| if (!css.includes('@tailwind')) { | |
| return false | |
| } | |
| let existingHash = sharedState.sourceHashMap.get(sourcePath) | |
| let rootHash = getHash(css) | |
| let didChange = existingHash !== rootHash | |
| sharedState.sourceHashMap.set(sourcePath, rootHash) | |
| return didChange | |
| } | |