|
@@ -1,8 +1,10 @@
|
|
|
-import {useEffect, useMemo, useState} from 'react';
|
|
|
+import {useCallback, useEffect, useMemo, useState} from 'react';
|
|
|
import * as Sentry from '@sentry/react';
|
|
|
import Prism from 'prismjs';
|
|
|
|
|
|
+import {trackAnalytics} from 'sentry/utils/analytics';
|
|
|
import {loadPrismLanguage, prismLanguageMap} from 'sentry/utils/prism';
|
|
|
+import useOrganization from 'sentry/utils/useOrganization';
|
|
|
|
|
|
type PrismHighlightParams = {
|
|
|
code: string;
|
|
@@ -22,21 +24,23 @@ type IntermediateToken = {
|
|
|
};
|
|
|
|
|
|
const useLoadPrismLanguage = (language: string, {onLoad}: {onLoad: () => void}) => {
|
|
|
+ const organization = useOrganization({allowNull: true});
|
|
|
+
|
|
|
useEffect(() => {
|
|
|
if (!language) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- loadPrismLanguage(language, {
|
|
|
- onLoad,
|
|
|
- onError: () => {
|
|
|
- Sentry.captureException(
|
|
|
- new Error('Prism.js failed to load language for stack trace'),
|
|
|
- {extra: {language}}
|
|
|
- );
|
|
|
- },
|
|
|
- });
|
|
|
- }, [language, onLoad]);
|
|
|
+ if (!prismLanguageMap[language.toLowerCase()]) {
|
|
|
+ trackAnalytics('stack_trace.prism_missing_language', {
|
|
|
+ organization,
|
|
|
+ attempted_language: language.toLowerCase(),
|
|
|
+ });
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ loadPrismLanguage(language, {onLoad});
|
|
|
+ }, [language, onLoad, organization]);
|
|
|
};
|
|
|
|
|
|
const getPrismGrammar = (language: string) => {
|
|
@@ -138,11 +142,12 @@ export const usePrismTokens = ({
|
|
|
const [grammar, setGrammar] = useState<Prism.Grammar | null>(() =>
|
|
|
getPrismGrammar(language)
|
|
|
);
|
|
|
- useLoadPrismLanguage(language, {
|
|
|
- onLoad: () => {
|
|
|
- setGrammar(getPrismGrammar(language));
|
|
|
- },
|
|
|
- });
|
|
|
+
|
|
|
+ const onLoad = useCallback(() => {
|
|
|
+ setGrammar(getPrismGrammar(language));
|
|
|
+ }, [language]);
|
|
|
+ useLoadPrismLanguage(language, {onLoad});
|
|
|
+
|
|
|
const lines = useMemo(() => {
|
|
|
try {
|
|
|
if (!grammar) {
|