@riotjs/compiler
Version:
Compiler for Riot.js .riot files
85 lines (74 loc) • 2.89 kB
JavaScript
import { panic } from '@riotjs/util/misc'
import { transform } from './transformer.js'
/**
* 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)
}