import * as parsingLib from "meriyah" ; import { Program } from "./nodeTypes" ; import { Range } from "./types" ; export type Parser = ( source : string , options ? : ParserOptions , cache ? : ParseCache , module ? : boolean ) => Program ; interface ParseErrorDetail { message : string ; lineNumber : number ; description : string ; index : number ; column : number ; } export class ParseError extends Error { constructor ( public error ) { super ( error . message ) ; } } type ParserOptions = { range ? : boolean ; comment ? : boolean ; attachComment ? : boolean ; loc ? : boolean ; } ; function parseWithLib ( source , options = { } , module = false ) { try { const { parse , parseModule } = parsingLib ; return ( module ? parseModule : parse ) ( source , { range : true , ranges : true , comment : true , next : true , attachComment : true , loc : true , ... options } ) ; } catch ( e ) { throw new ParseError ( e ) ; } } export const parse = ( source , options = { } , cache ? , module = false ) => { let ast ; if ( cache ) { if ( ( ast = cache . get ( source ) ) ) { return ast ; } else { return cache . set ( source , parseWithLib ( source , options , module ) as Program ) ; } } else { return parseWithLib ( source , options , module ) ; } } ; export let defaultSource = ( source ) => ( range ) => source . substring ( range [ 0 ] , range [ 1 ] ) ; export type ParseCache = ReturnType < typeof createCache > ; export function createCache ( ) { const cache = { } ; return { get ( source ) { return cache [ source ] ; } , set ( source , value ) { return ( cache [ source ] = value ) ; } } ; }