UNPKG

@webdiscus/pug-loader

Version:

Pug loader renders Pug files into HTML or compiles them into a template function.

73 lines (59 loc) 2.07 kB
const fs = require('fs'); const path = require('path'); const { filterNotFoundException, filterLoadException, filterInitException, loadNodeModuleException, } = require('./Exeptions'); const filtersPath = path.join(__dirname, 'filters'); class Filter { /** * Load embedded pug filters. * * @param {{}} options Loader options. */ static loadFilters(options) { if (!options.embedFilters) return; if (!options.filters) options.filters = {}; const embedFilters = options.embedFilters; const loadedFilters = options.filters; for (const filterName in options.embedFilters) { const options = embedFilters[filterName]; if (options) { let filterPath = path.resolve(filtersPath, filterName + '.js'); let filter; try { filter = require(filterPath); } catch (error) { const message = error.toString(); const posEOL = message.indexOf('\n'); const messageFirstLine = message.slice(0, posEOL); if (messageFirstLine.indexOf('Cannot find module') >= 0) { if (messageFirstLine.indexOf(filterPath) > 0) { const entries = fs.readdirSync(filtersPath, { withFileTypes: true }); const files = entries .filter((file) => !file.isDirectory()) .map((file) => path.basename(file.name, '.js')); filterNotFoundException(filterName, files.join(', ')); } else { const [, module] = /Cannot find module '(.*?)' from/.exec(messageFirstLine); loadNodeModuleException(module); } } filterLoadException(filterName, filterPath, error); } try { // filter module may have the `init(options)` method if (filter.init != null) { filter.init(options); } loadedFilters[filterName] = filter.apply.bind(filter); } catch (error) { filterInitException(filterName, error); } } } } } module.exports = Filter;