@lipemat/postcss-boilerplate
Version:
Dependencies and scripts for a no config grunt postcss compiler.
67 lines (57 loc) • 1.88 kB
text/typescript
import {EnumModules, getEnumFilePath} from '../helpers/enum-modules';
import {JsonModules} from '../helpers/get-json';
import tinylr from 'tiny-lr';
import type {Environment} from '../helpers/config';
import {getPackageConfig} from '@lipemat/js-boilerplate-shared/helpers/package-config.js';
export type CachingGruntTasks = {
reset: {}
reload: {}
writeModules: {}
}
let lastCssClasses: string[] = [];
export const config: CachingGruntTasks = {
reset: {},
reload: {},
writeModules: {},
};
function isEnvironment( env: string | undefined ): env is Environment {
return 'development' === env || 'production' === env;
}
/**
* Use the same interface as the grunt watch task
* to trigger a reload.
*
* @link https://github.com/gruntjs/grunt-contrib-watch?tab=readme-ov-file#rolling-your-own-live-reload
*/
function triggerReload() {
tinylr.changed( getEnumFilePath( 'development' ), () => {
console.debug( 'CSS Modules updated, reloading browser.' );
} );
}
/**
* Cache management for Enums and JSON
*
* `caching:reset` - Reset the content of the Enums and JSON files.
* `caching:reload` - Reload the browser if a CSS modules classname changes.
* `caching:writeModules` - Write contents if JSON or PHP Enums for CSS modules.
*
*/
export default function cachingTask<K extends keyof CachingGruntTasks>( task: K, env: Environment | undefined ) {
if ( 'reset' === task ) {
EnumModules._resetContent();
JsonModules._resetContent();
}
if ( 'reload' === task && getPackageConfig().cssEnums ) {
if ( lastCssClasses.sort().toString() === EnumModules.getCssClasses().sort().toString() ) {
return;
}
lastCssClasses = EnumModules.getCssClasses();
triggerReload();
}
if ( 'writeModules' === task && isEnvironment( env ) ) {
JsonModules.flushToDisk( env );
if ( getPackageConfig().cssEnums ) {
EnumModules.flushToDisk( env );
}
}
}