{"version":3,"file":"shared_highlighter.js","names":["highlighter: CachedOrLoadingHighlighterType","languageLoaders: Promise<ResolvedLanguage>[]","themeLoaders: Promise<ThemeRegistrationResolved>[]","themes"],"sources":["../../src/highlighter/shared_highlighter.ts"],"sourcesContent":["import {\n  createHighlighter,\n  createJavaScriptRegexEngine,\n  createOnigurumaEngine,\n} from 'shiki';\n\nimport type {\n  DiffsHighlighter,\n  DiffsThemeNames,\n  HighlighterTypes,\n  SupportedLanguages,\n  ThemeRegistrationResolved,\n} from '../types';\nimport type { ResolvedLanguage } from '../worker/types';\nimport { attachResolvedLanguages } from './languages/attachResolvedLanguages';\nimport { cleanUpResolvedLanguages } from './languages/cleanUpResolvedLanguages';\nimport { getResolvedOrResolveLanguage } from './languages/getResolvedOrResolveLanguage';\nimport { attachResolvedThemes } from './themes/attachResolvedThemes';\nimport { cleanUpResolvedThemes } from './themes/cleanUpResolvedThemes';\nimport { getResolvedOrResolveTheme } from './themes/getResolvedOrResolveTheme';\nimport { registerCustomTheme } from './themes/registerCustomTheme';\n\ntype CachedOrLoadingHighlighterType =\n  | Promise<DiffsHighlighter>\n  | DiffsHighlighter\n  | undefined;\n\nlet highlighter: CachedOrLoadingHighlighterType;\n\ninterface HighlighterOptions {\n  themes: DiffsThemeNames[];\n  langs: SupportedLanguages[];\n  preferredHighlighter?: HighlighterTypes;\n}\n\nexport async function getSharedHighlighter({\n  themes,\n  langs,\n  preferredHighlighter = 'shiki-js',\n}: HighlighterOptions): Promise<DiffsHighlighter> {\n  highlighter ??= createHighlighter({\n    themes: [],\n    langs: ['text'],\n    engine:\n      preferredHighlighter === 'shiki-wasm'\n        ? createOnigurumaEngine(import('shiki/wasm'))\n        : createJavaScriptRegexEngine(),\n  }) as Promise<DiffsHighlighter>;\n\n  const instance = isHighlighterLoading(highlighter)\n    ? await highlighter\n    : highlighter;\n  highlighter = instance;\n\n  const languageLoaders: Promise<ResolvedLanguage>[] = [];\n  for (const language of langs) {\n    if (language === 'text' || language === 'ansi') continue;\n    const maybeResolvedLanguage = getResolvedOrResolveLanguage(language);\n    if ('then' in maybeResolvedLanguage) {\n      languageLoaders.push(maybeResolvedLanguage);\n    } else {\n      attachResolvedLanguages(maybeResolvedLanguage, instance);\n    }\n  }\n\n  const themeLoaders: Promise<ThemeRegistrationResolved>[] = [];\n  for (const themeName of themes) {\n    const maybeResolvedTheme = getResolvedOrResolveTheme(themeName);\n    if ('then' in maybeResolvedTheme) {\n      themeLoaders.push(maybeResolvedTheme);\n    } else {\n      attachResolvedThemes(maybeResolvedTheme, highlighter);\n    }\n  }\n\n  // If we need to load any languages or themes, lets do that now\n  if (languageLoaders.length > 0 || themeLoaders.length > 0) {\n    await Promise.all([\n      Promise.all(languageLoaders).then((languages) => {\n        attachResolvedLanguages(languages, instance);\n      }),\n      Promise.all(themeLoaders).then((themes) => {\n        attachResolvedThemes(themes, instance);\n      }),\n    ]);\n  }\n\n  return instance;\n}\n\nexport function isHighlighterLoaded(\n  h: CachedOrLoadingHighlighterType = highlighter\n): h is DiffsHighlighter {\n  return h != null && !('then' in h);\n}\n\nexport function getHighlighterIfLoaded(): DiffsHighlighter | undefined {\n  if (highlighter != null && !('then' in highlighter)) {\n    return highlighter;\n  }\n  return undefined;\n}\n\nexport function isHighlighterLoading(\n  h: CachedOrLoadingHighlighterType = highlighter\n): h is Promise<DiffsHighlighter> {\n  return h != null && 'then' in h;\n}\n\nexport function isHighlighterNull(\n  h: CachedOrLoadingHighlighterType = highlighter\n): h is undefined {\n  return h == null;\n}\n\nexport async function preloadHighlighter(\n  options: HighlighterOptions\n): Promise<void> {\n  return void (await getSharedHighlighter(options));\n}\n\nexport async function disposeHighlighter(): Promise<void> {\n  if (highlighter == null) return;\n  (await highlighter).dispose();\n  cleanUpResolvedLanguages();\n  cleanUpResolvedThemes();\n  highlighter = undefined;\n}\n\nregisterCustomTheme('pierre-dark', async () => {\n  const { default: theme } = await import('@pierre/theme/pierre-dark');\n  return { ...theme, name: 'pierre-dark' } as ThemeRegistrationResolved;\n});\n\nregisterCustomTheme('pierre-light', async () => {\n  const { default: theme } = await import('@pierre/theme/pierre-light');\n  return { ...theme, name: 'pierre-light' } as ThemeRegistrationResolved;\n});\n"],"mappings":";;;;;;;;;;AA2BA,IAAIA;AAQJ,eAAsB,qBAAqB,EACzC,QACA,OACA,uBAAuB,cACyB;AAChD,iBAAgB,kBAAkB;EAChC,QAAQ,EAAE;EACV,OAAO,CAAC,OAAO;EACf,QACE,yBAAyB,eACrB,sBAAsB,OAAO,cAAc,GAC3C,6BAA6B;EACpC,CAAC;CAEF,MAAM,WAAW,qBAAqB,YAAY,GAC9C,MAAM,cACN;AACJ,eAAc;CAEd,MAAMC,kBAA+C,EAAE;AACvD,MAAK,MAAM,YAAY,OAAO;AAC5B,MAAI,aAAa,UAAU,aAAa,OAAQ;EAChD,MAAM,wBAAwB,6BAA6B,SAAS;AACpE,MAAI,UAAU,sBACZ,iBAAgB,KAAK,sBAAsB;MAE3C,yBAAwB,uBAAuB,SAAS;;CAI5D,MAAMC,eAAqD,EAAE;AAC7D,MAAK,MAAM,aAAa,QAAQ;EAC9B,MAAM,qBAAqB,0BAA0B,UAAU;AAC/D,MAAI,UAAU,mBACZ,cAAa,KAAK,mBAAmB;MAErC,sBAAqB,oBAAoB,YAAY;;AAKzD,KAAI,gBAAgB,SAAS,KAAK,aAAa,SAAS,EACtD,OAAM,QAAQ,IAAI,CAChB,QAAQ,IAAI,gBAAgB,CAAC,MAAM,cAAc;AAC/C,0BAAwB,WAAW,SAAS;GAC5C,EACF,QAAQ,IAAI,aAAa,CAAC,MAAM,aAAW;AACzC,uBAAqBC,UAAQ,SAAS;GACtC,CACH,CAAC;AAGJ,QAAO;;AAGT,SAAgB,oBACd,IAAoC,aACb;AACvB,QAAO,KAAK,QAAQ,EAAE,UAAU;;AAGlC,SAAgB,yBAAuD;AACrE,KAAI,eAAe,QAAQ,EAAE,UAAU,aACrC,QAAO;;AAKX,SAAgB,qBACd,IAAoC,aACJ;AAChC,QAAO,KAAK,QAAQ,UAAU;;AAGhC,SAAgB,kBACd,IAAoC,aACpB;AAChB,QAAO,KAAK;;AAGd,eAAsB,mBACpB,SACe;AACR,CAAM,MAAM,qBAAqB,QAAQ;;AAGlD,eAAsB,qBAAoC;AACxD,KAAI,eAAe,KAAM;AACzB,EAAC,MAAM,aAAa,SAAS;AAC7B,2BAA0B;AAC1B,wBAAuB;AACvB,eAAc;;AAGhB,oBAAoB,eAAe,YAAY;CAC7C,MAAM,EAAE,SAAS,UAAU,MAAM,OAAO;AACxC,QAAO;EAAE,GAAG;EAAO,MAAM;EAAe;EACxC;AAEF,oBAAoB,gBAAgB,YAAY;CAC9C,MAAM,EAAE,SAAS,UAAU,MAAM,OAAO;AACxC,QAAO;EAAE,GAAG;EAAO,MAAM;EAAgB;EACzC"}