72 lines
2.8 KiB
JavaScript
72 lines
2.8 KiB
JavaScript
|
import {panic} from '@riotjs/util/misc'
|
||
|
import { transform } from './transformer'
|
||
|
/**
|
||
|
* Parsers that can be registered by users to preparse components fragments
|
||
|
* @type { Object }
|
||
|
*/
|
||
|
export const preprocessors = Object.freeze({
|
||
|
javascript: new Map(),
|
||
|
css: new Map(),
|
||
|
template: new Map().set('default', code => ({ code }))
|
||
|
})
|
||
|
|
||
|
// throw a processor type error
|
||
|
function preprocessorTypeError(type) {
|
||
|
panic(`No preprocessor of type "${type}" was found, please make sure to use one of these: 'javascript', 'css' or 'template'`)
|
||
|
}
|
||
|
|
||
|
// throw an error if the preprocessor was not registered
|
||
|
function preprocessorNameNotFoundError(name) {
|
||
|
panic(`No preprocessor named "${name}" was found, are you sure you have registered it?'`)
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Register a custom preprocessor
|
||
|
* @param { string } type - preprocessor type either 'js', 'css' or 'template'
|
||
|
* @param { string } name - unique preprocessor id
|
||
|
* @param { Function } preprocessor - preprocessor function
|
||
|
* @returns { Map } - the preprocessors map
|
||
|
*/
|
||
|
export function register(type, name, preprocessor) {
|
||
|
if (!type) panic('Please define the type of preprocessor you want to register \'javascript\', \'css\' or \'template\'')
|
||
|
if (!name) panic('Please define a name for your preprocessor')
|
||
|
if (!preprocessor) panic('Please provide a preprocessor function')
|
||
|
if (!preprocessors[type]) preprocessorTypeError(type)
|
||
|
if (preprocessors[type].has(name)) panic(`The preprocessor ${name} was already registered before`)
|
||
|
|
||
|
preprocessors[type].set(name, preprocessor)
|
||
|
|
||
|
return preprocessors
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Register a custom preprocessor
|
||
|
* @param { string } type - preprocessor type either 'js', 'css' or 'template'
|
||
|
* @param { string } name - unique preprocessor id
|
||
|
* @returns { Map } - the preprocessors map
|
||
|
*/
|
||
|
export function unregister(type, name) {
|
||
|
if (!type) panic('Please define the type of preprocessor you want to unregister \'javascript\', \'css\' or \'template\'')
|
||
|
if (!name) panic('Please define the name of the preprocessor you want to unregister')
|
||
|
if (!preprocessors[type]) preprocessorTypeError(type)
|
||
|
if (!preprocessors[type].has(name)) preprocessorNameNotFoundError(name)
|
||
|
|
||
|
preprocessors[type].delete(name)
|
||
|
|
||
|
return preprocessors
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Exec the compilation of a preprocessor
|
||
|
* @param { string } type - preprocessor type either 'js', 'css' or 'template'
|
||
|
* @param { string } name - unique preprocessor id
|
||
|
* @param { Object } meta - preprocessor meta information
|
||
|
* @param { string } source - source code
|
||
|
* @returns { Output } object containing a sourcemap and a code string
|
||
|
*/
|
||
|
export function execute(type, name, meta, source) {
|
||
|
if (!preprocessors[type]) preprocessorTypeError(type)
|
||
|
if (!preprocessors[type].has(name)) preprocessorNameNotFoundError(name)
|
||
|
|
||
|
return transform(preprocessors[type].get(name), meta, source)
|
||
|
}
|