export const parseCache = createCache<SFCParseResult>()
+function genCacheKey(source: string, options: SFCParseOptions): string {
+ return (
+ source +
+ JSON.stringify(
+ {
+ ...options,
+ compiler: { parse: options.compiler?.parse },
+ },
+ (_, val) => (typeof val === 'function' ? val.toString() : val),
+ )
+ )
+}
+
export function parse(
source: string,
- {
+ options: SFCParseOptions = {},
+): SFCParseResult {
+ const sourceKey = genCacheKey(source, options)
+ const cache = parseCache.get(sourceKey)
+ if (cache) {
+ return cache
+ }
+
+ const {
sourceMap = true,
filename = DEFAULT_FILENAME,
sourceRoot = '',
compiler = CompilerDOM,
templateParseOptions = {},
parseExpressions = true,
- }: SFCParseOptions = {},
-): SFCParseResult {
- const sourceKey =
- source + sourceMap + filename + sourceRoot + pad + compiler.parse
- const cache = parseCache.get(sourceKey)
- if (cache) {
- return cache
- }
+ } = options
const descriptor: SFCDescriptor = {
filename,