react-email 4.0.0-alpha.3 → 4.0.0-alpha.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/cli/index.js +7 -5
  3. package/dist/cli/index.mjs +11 -6
  4. package/dist/preview/.next/BUILD_ID +1 -1
  5. package/dist/preview/.next/app-build-manifest.json +31 -34
  6. package/dist/preview/.next/build-manifest.json +14 -14
  7. package/dist/preview/.next/cache/.rscinfo +1 -1
  8. package/dist/preview/.next/cache/images/TcyzHbFXGFjrOu3wEMvDoSmqCh3qP3iiNqJf0QbED9Y/60.1741728556140.cQ5qicbpvoXZ7leVmWqG2ElLwXB1ynYeSv8MBSA-QeM.Vy8iMWM3MGUtMTk1ODcxYmIyNzMi.webp +0 -0
  9. package/dist/preview/.next/cache/webpack/client-development/0.pack.gz +0 -0
  10. package/dist/preview/.next/cache/webpack/client-development/1.pack.gz +0 -0
  11. package/dist/preview/.next/cache/webpack/client-development/10.pack.gz +0 -0
  12. package/dist/preview/.next/cache/webpack/client-development/11.pack.gz +0 -0
  13. package/dist/preview/.next/cache/webpack/client-development/12.pack.gz +0 -0
  14. package/dist/preview/.next/cache/webpack/client-development/13.pack.gz +0 -0
  15. package/dist/preview/.next/cache/webpack/client-development/2.pack.gz +0 -0
  16. package/dist/preview/.next/cache/webpack/client-development/3.pack.gz +0 -0
  17. package/dist/preview/.next/cache/webpack/client-development/4.pack.gz +0 -0
  18. package/dist/preview/.next/cache/webpack/client-development/5.pack.gz +0 -0
  19. package/dist/preview/.next/cache/webpack/client-development/6.pack.gz +0 -0
  20. package/dist/preview/.next/cache/webpack/client-development/7.pack.gz +0 -0
  21. package/dist/preview/.next/cache/webpack/client-development/8.pack.gz +0 -0
  22. package/dist/preview/.next/cache/webpack/client-development/9.pack.gz +0 -0
  23. package/dist/preview/.next/cache/webpack/client-development/index.pack.gz +0 -0
  24. package/dist/preview/.next/cache/webpack/client-development/index.pack.gz.old +0 -0
  25. package/dist/preview/.next/cache/webpack/client-production/0.pack +0 -0
  26. package/dist/preview/.next/cache/webpack/client-production/index.pack +0 -0
  27. package/dist/preview/.next/cache/webpack/edge-server-production/index.pack +0 -0
  28. package/dist/preview/.next/cache/webpack/server-development/0.pack.gz +0 -0
  29. package/dist/preview/.next/cache/webpack/server-development/1.pack.gz +0 -0
  30. package/dist/preview/.next/cache/webpack/server-development/2.pack.gz +0 -0
  31. package/dist/preview/.next/cache/webpack/server-development/3.pack.gz +0 -0
  32. package/dist/preview/.next/cache/webpack/server-development/4.pack.gz +0 -0
  33. package/dist/preview/.next/cache/webpack/server-development/5.pack.gz +0 -0
  34. package/dist/preview/.next/cache/webpack/server-development/6.pack.gz +0 -0
  35. package/dist/preview/.next/cache/webpack/server-development/7.pack.gz +0 -0
  36. package/dist/preview/.next/cache/webpack/server-development/8.pack.gz +0 -0
  37. package/dist/preview/.next/cache/webpack/server-development/9.pack.gz +0 -0
  38. package/dist/preview/.next/cache/webpack/server-development/index.pack.gz +0 -0
  39. package/dist/preview/.next/cache/webpack/server-development/index.pack.gz.old +0 -0
  40. package/dist/preview/.next/cache/webpack/server-production/0.pack +0 -0
  41. package/dist/preview/.next/cache/webpack/server-production/index.pack +0 -0
  42. package/dist/preview/.next/diagnostics/framework.json +1 -1
  43. package/dist/preview/.next/next-minimal-server.js.nft.json +1 -1
  44. package/dist/preview/.next/next-server.js.nft.json +1 -1
  45. package/dist/preview/.next/prerender-manifest.json +1 -1
  46. package/dist/preview/.next/required-server-files.json +1 -1
  47. package/dist/preview/.next/server/app/_not-found/page.js +1 -1
  48. package/dist/preview/.next/server/app/_not-found/page.js.nft.json +1 -1
  49. package/dist/preview/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  50. package/dist/preview/.next/server/app/favicon.ico/route.js +1 -1
  51. package/dist/preview/.next/server/app/favicon.ico/route.js.nft.json +1 -1
  52. package/dist/preview/.next/server/app/page.js +1 -1
  53. package/dist/preview/.next/server/app/page.js.nft.json +1 -1
  54. package/dist/preview/.next/server/app/page_client-reference-manifest.js +1 -1
  55. package/dist/preview/.next/server/app/preview/[...slug]/page.js +9 -8
  56. package/dist/preview/.next/server/app/preview/[...slug]/page.js.nft.json +1 -1
  57. package/dist/preview/.next/server/app/preview/[...slug]/page_client-reference-manifest.js +1 -1
  58. package/dist/preview/.next/server/chunks/143.js +6 -0
  59. package/dist/preview/.next/server/chunks/409.js +5 -0
  60. package/dist/preview/.next/server/chunks/46.js +1 -0
  61. package/dist/preview/.next/server/chunks/478.js +14 -0
  62. package/dist/preview/.next/server/chunks/707.js +13 -0
  63. package/dist/preview/.next/server/middleware-build-manifest.js +1 -1
  64. package/dist/preview/.next/server/next-font-manifest.js +1 -1
  65. package/dist/preview/.next/server/next-font-manifest.json +1 -1
  66. package/dist/preview/.next/server/pages/500.html +1 -1
  67. package/dist/preview/.next/server/pages/_app.js +1 -1
  68. package/dist/preview/.next/server/pages/_app.js.nft.json +1 -1
  69. package/dist/preview/.next/server/pages/_document.js +1 -1
  70. package/dist/preview/.next/server/pages/_document.js.nft.json +1 -1
  71. package/dist/preview/.next/server/pages/_error.js +1 -1
  72. package/dist/preview/.next/server/pages/_error.js.nft.json +1 -1
  73. package/dist/preview/.next/server/server-reference-manifest.js +1 -1
  74. package/dist/preview/.next/server/server-reference-manifest.json +1 -1
  75. package/dist/preview/.next/static/{iP6qiNn8FML_AvKcxGPhM → B4EYZiVzdylEG9lAIl-aO}/_buildManifest.js +1 -1
  76. package/dist/preview/.next/static/chunks/575-bc52750855c25df4.js +2 -0
  77. package/dist/preview/.next/static/chunks/684-0f1ef7361c499798.js +1 -0
  78. package/dist/preview/.next/static/chunks/684c6b30-0c65da32762fc4ee.js +1 -0
  79. package/dist/preview/.next/static/chunks/81-e7539b08d9d3fb4d.js +1 -0
  80. package/dist/preview/.next/static/chunks/883-70c8267c50bc4133.js +1 -0
  81. package/dist/preview/.next/static/chunks/921-d1dc8c63f49e85d6.js +1 -0
  82. package/dist/preview/.next/static/chunks/{afa401a5-9ebf2515b1397993.js → afa401a5-a600c227dacf3ab4.js} +1 -1
  83. package/dist/preview/.next/static/chunks/app/_not-found/{page-96d3eac723be3ee2.js → page-03ce767859c36d4e.js} +1 -1
  84. package/dist/preview/.next/static/chunks/app/layout-7cf14e28880544f1.js +1 -0
  85. package/dist/preview/.next/static/chunks/app/page-065cb49b0a078541.js +1 -0
  86. package/dist/preview/.next/static/chunks/app/preview/[...slug]/page-656510fd180c803c.js +1 -0
  87. package/dist/preview/.next/static/chunks/{framework-e7cae9cecd5c9ba2.js → framework-2a724981073c3a29.js} +1 -1
  88. package/dist/preview/.next/static/chunks/main-552b9719bbc3a274.js +1 -0
  89. package/dist/preview/.next/static/chunks/main-app-914a73336fd45af5.js +1 -0
  90. package/dist/preview/.next/static/chunks/pages/_app-77ca34bce25ac75c.js +1 -0
  91. package/dist/preview/.next/static/chunks/pages/_error-73f611c46abbb495.js +1 -0
  92. package/dist/preview/.next/static/chunks/{webpack-9255716c9496e606.js → webpack-2eb145a20ee6cb77.js} +1 -1
  93. package/dist/preview/.next/static/css/2df96d9ee014e8de.css +3 -0
  94. package/dist/preview/.next/static/media/05613964ce6c782e-s.p.otf +0 -0
  95. package/dist/preview/.next/static/media/11c6126b9369e85e-s.p.otf +0 -0
  96. package/dist/preview/.next/static/media/26cb97734d8cb717-s.p.otf +0 -0
  97. package/dist/preview/.next/static/media/bb6462617151f6b7-s.p.otf +0 -0
  98. package/dist/preview/.next/static/media/cf6daef822ab0142-s.p.otf +0 -0
  99. package/dist/preview/.next/static/media/e4051546b3043204-s.p.otf +0 -0
  100. package/dist/preview/.next/trace +22 -22
  101. package/dist/preview/.next/types/app/layout.ts +1 -1
  102. package/dist/preview/.next/types/app/preview/[...slug]/page.ts +1 -1
  103. package/package.json +7 -5
  104. package/src/actions/email-validation/check-images.spec.tsx +23 -14
  105. package/src/actions/email-validation/check-images.ts +89 -87
  106. package/src/actions/email-validation/check-links.spec.tsx +27 -17
  107. package/src/actions/email-validation/check-links.ts +60 -57
  108. package/src/app/fonts/SFMono/SFMonoBold.otf +0 -0
  109. package/src/app/fonts/SFMono/SFMonoBoldItalic.otf +0 -0
  110. package/src/app/fonts/SFMono/SFMonoHeavy.otf +0 -0
  111. package/src/app/fonts/SFMono/SFMonoHeavyItalic.otf +0 -0
  112. package/src/app/fonts/SFMono/SFMonoLight.otf +0 -0
  113. package/src/app/fonts/SFMono/SFMonoLightItalic.otf +0 -0
  114. package/src/app/fonts/SFMono/SFMonoMedium.otf +0 -0
  115. package/src/app/fonts/SFMono/SFMonoMediumItalic.otf +0 -0
  116. package/src/app/fonts/SFMono/SFMonoRegular.otf +0 -0
  117. package/src/app/fonts/SFMono/SFMonoRegularItalic.otf +0 -0
  118. package/src/app/fonts/SFMono/SFMonoSemibold.otf +0 -0
  119. package/src/app/fonts/SFMono/SFMonoSemiboldItalic.otf +0 -0
  120. package/src/app/fonts.ts +39 -0
  121. package/src/app/layout.tsx +5 -2
  122. package/src/app/page.tsx +3 -3
  123. package/src/app/preview/[...slug]/preview.tsx +50 -31
  124. package/src/components/icons/icon-base.tsx +4 -2
  125. package/src/components/icons/icon-bug.tsx +19 -0
  126. package/src/components/icons/icon-reload.tsx +19 -0
  127. package/src/components/icons/icon-scanner.tsx +19 -0
  128. package/src/components/icons/icon-scissors.tsx +19 -0
  129. package/src/components/icons/icon-warning.tsx +31 -0
  130. package/src/components/send.tsx +1 -2
  131. package/src/components/shell.tsx +52 -85
  132. package/src/components/sidebar/file-tree-directory-children.tsx +15 -12
  133. package/src/components/sidebar/file-tree.tsx +1 -1
  134. package/src/components/sidebar/sidebar.tsx +23 -344
  135. package/src/components/toolbar/linter.tsx +167 -0
  136. package/src/components/toolbar/results-table.tsx +0 -0
  137. package/src/components/toolbar/results.tsx +48 -0
  138. package/src/components/toolbar/spam-assassin.tsx +155 -0
  139. package/src/components/toolbar.tsx +189 -0
  140. package/src/components/tooltip-content.tsx +1 -2
  141. package/src/components/topbar.tsx +28 -41
  142. package/src/utils/__snapshots__/get-email-component.spec.ts.snap +1 -1
  143. package/tailwind.config.ts +1 -0
  144. package/tsconfig.json +1 -1
  145. package/vitest.config.ts +5 -3
  146. package/dist/preview/.next/server/chunks/196.js +0 -5
  147. package/dist/preview/.next/server/chunks/300.js +0 -13
  148. package/dist/preview/.next/server/chunks/509.js +0 -1
  149. package/dist/preview/.next/server/chunks/631.js +0 -6
  150. package/dist/preview/.next/server/chunks/734.js +0 -15
  151. package/dist/preview/.next/static/chunks/285-dbf6306a0d45c33d.js +0 -1
  152. package/dist/preview/.next/static/chunks/447-886131c35ca42b91.js +0 -1
  153. package/dist/preview/.next/static/chunks/490-0db0db14b377daca.js +0 -1
  154. package/dist/preview/.next/static/chunks/5fec7a0a-5179023f3f5a9421.js +0 -1
  155. package/dist/preview/.next/static/chunks/603-36207c8905355e23.js +0 -1
  156. package/dist/preview/.next/static/chunks/797-46f6c20952f0a280.js +0 -2
  157. package/dist/preview/.next/static/chunks/app/layout-f6f64b817a2cf938.js +0 -1
  158. package/dist/preview/.next/static/chunks/app/page-f5f96bd66526060f.js +0 -1
  159. package/dist/preview/.next/static/chunks/app/preview/[...slug]/page-fb2bf0253c2dada4.js +0 -1
  160. package/dist/preview/.next/static/chunks/main-app-d1b0aa870bcfb13e.js +0 -1
  161. package/dist/preview/.next/static/chunks/main-df761fde212f9cda.js +0 -1
  162. package/dist/preview/.next/static/chunks/pages/_app-203a61b355820ccf.js +0 -1
  163. package/dist/preview/.next/static/chunks/pages/_error-1764ca54938748c8.js +0 -1
  164. package/dist/preview/.next/static/css/778d574c88a1db3c.css +0 -3
  165. package/dist/preview/.next/static/css/ec5d7e66bd3b6cb8.css +0 -1
  166. package/src/app/inter.ts +0 -7
  167. package/src/components/icons/icon-circle-check.tsx +0 -21
  168. package/src/components/icons/icon-circle-close.tsx +0 -17
  169. package/src/components/icons/icon-circle-warning.tsx +0 -17
  170. package/src/components/sidebar/image-checker.tsx +0 -161
  171. package/src/components/sidebar/link-checker.tsx +0 -151
  172. package/tsconfig.test.json +0 -8
  173. /package/dist/preview/.next/static/{iP6qiNn8FML_AvKcxGPhM → B4EYZiVzdylEG9lAIl-aO}/_ssgManifest.js +0 -0
  174. /package/src/components/{sidebar → toolbar}/checking-results.tsx +0 -0
@@ -1,161 +0,0 @@
1
- import prettyBytes from 'pretty-bytes';
2
- import * as React from 'react';
3
- import {
4
- type ImageCheckingResult,
5
- checkImages,
6
- } from '../../actions/email-validation/check-images';
7
- import { Button } from '../button';
8
- import { Result, ResultList, type ResultStatus } from './checking-results';
9
-
10
- interface ImageCheckerResultsProps {
11
- label: string;
12
- status: ResultStatus;
13
- results: ImageCheckingResult[];
14
-
15
- justLoadedIn: boolean;
16
- }
17
-
18
- const ImageCheckerResults = ({
19
- label,
20
- status,
21
- results,
22
-
23
- justLoadedIn,
24
- }: ImageCheckerResultsProps) => {
25
- return (
26
- <ResultList
27
- label={
28
- <>
29
- <span>{label}</span>
30
- <span>({results.length})</span>
31
- </>
32
- }
33
- defaultOpen={justLoadedIn}
34
- status={status}
35
- disabled={results.length === 0}
36
- >
37
- {results.map(({ source, status, checks }) => (
38
- <Result className="flex gap-2" key={source} status={status}>
39
- <img
40
- width="24px"
41
- className="my-auto rounded-sm"
42
- src={source}
43
- // biome-ignore lint/a11y/noRedundantAlt: The word image does fit in with the context and thus is not redundant
44
- alt="image checked"
45
- />
46
- <div className="flex w-[calc(100%-.5rem-24px)] flex-col">
47
- <Result.Title>
48
- <span className="block overflow-hidden truncate text-ellipsis whitespace-nowrap">
49
- {source}
50
- </span>
51
- </Result.Title>
52
- <Result.StatusDescription>
53
- {checks
54
- .map((check) => {
55
- if (check.type === 'syntax' && !check.passed)
56
- return 'Invalid URL';
57
- if (check.type === 'accessibility' && !check.passed)
58
- return 'Missing alt';
59
- if (check.type === 'security')
60
- return check.passed ? 'Secure' : 'Insecure';
61
- if (
62
- check.type === 'fetch_attempt' &&
63
- check.metadata.fetchStatusCode
64
- )
65
- return `${check.metadata.fetchStatusCode}`;
66
- if (check.type === 'image_size' && check.metadata.byteCount)
67
- return `${prettyBytes(check.metadata.byteCount)}`;
68
- return null;
69
- })
70
- .filter(Boolean)
71
- .join(' - ')}
72
- </Result.StatusDescription>
73
- </div>
74
- </Result>
75
- ))}
76
- </ResultList>
77
- );
78
- };
79
-
80
- interface ImageCheckerProps {
81
- emailSlug: string;
82
- emailMarkup: string;
83
- }
84
-
85
- export const ImageChecker = ({ emailSlug, emailMarkup }: ImageCheckerProps) => {
86
- const cacheKey = `image-checking-results-${emailSlug.replaceAll('/', '-')}`;
87
-
88
- const [results, setResults] = React.useState<
89
- ImageCheckingResult[] | undefined
90
- >();
91
-
92
- React.useEffect(() => {
93
- const cachedValue =
94
- 'localStorage' in global ? global.localStorage.getItem(cacheKey) : null;
95
- if (cachedValue) {
96
- setResults(JSON.parse(cachedValue));
97
- }
98
- }, [cacheKey]);
99
-
100
- const [justLoadedIn, setJustLoadedIn] = React.useState(false);
101
- const [loading, setLoading] = React.useState(false);
102
-
103
- const handleRun = () => {
104
- setLoading(true);
105
- checkImages(emailMarkup, `${location.protocol}//${location.host}`)
106
- .then((newResults) => {
107
- setResults(newResults);
108
- setJustLoadedIn(true);
109
- localStorage.setItem(cacheKey, JSON.stringify(newResults));
110
- })
111
- .catch(console.error)
112
- .finally(() => setLoading(false));
113
- };
114
-
115
- const errorResults = React.useMemo(
116
- () => results?.filter((r) => r.status === 'error') || [],
117
- [results],
118
- );
119
- const warningResults = React.useMemo(
120
- () => results?.filter((r) => r.status === 'warning') || [],
121
- [results],
122
- );
123
- const successResults = React.useMemo(
124
- () => results?.filter((r) => r.status === 'success') || [],
125
- [results],
126
- );
127
-
128
- return (
129
- <div className="mt-4 flex w-full flex-col gap-2 text-pretty">
130
- {results ? (
131
- <>
132
- <ImageCheckerResults
133
- label="Errors"
134
- results={errorResults}
135
- justLoadedIn={justLoadedIn}
136
- status="error"
137
- />
138
- <ImageCheckerResults
139
- label="Warnings"
140
- results={warningResults}
141
- justLoadedIn={justLoadedIn}
142
- status="warning"
143
- />
144
- <ImageCheckerResults
145
- label="Success"
146
- results={successResults}
147
- justLoadedIn={justLoadedIn}
148
- status="success"
149
- />
150
- </>
151
- ) : (
152
- <span className="text-xs leading-relaxed">
153
- Check if all links are valid and redirect to the correct pages.
154
- </span>
155
- )}
156
- <Button loading={loading} onClick={handleRun}>
157
- {results ? 'Re-run' : 'Run'}
158
- </Button>
159
- </div>
160
- );
161
- };
@@ -1,151 +0,0 @@
1
- import * as React from 'react';
2
- import {
3
- type LinkCheckingResult,
4
- checkLinks,
5
- } from '../../actions/email-validation/check-links';
6
- import { Button } from '../button';
7
- import { Result, ResultList, type ResultStatus } from './checking-results';
8
-
9
- interface LinkCheckerResultsProps {
10
- label: string;
11
- status: ResultStatus;
12
- results: LinkCheckingResult[];
13
-
14
- justLoadedIn: boolean;
15
- }
16
-
17
- const LinkCheckerResults = ({
18
- label,
19
- status,
20
- results,
21
-
22
- justLoadedIn,
23
- }: LinkCheckerResultsProps) => {
24
- return (
25
- <ResultList
26
- label={
27
- <>
28
- <span>{label}</span>
29
- <span>({results.length})</span>
30
- </>
31
- }
32
- defaultOpen={justLoadedIn}
33
- status={status}
34
- disabled={results.length === 0}
35
- >
36
- {results.map(({ link, status, checks }) => (
37
- <Result key={link} status={status}>
38
- <a
39
- href={link}
40
- target="_blank"
41
- rel="noopener noreferrer"
42
- className="w-full"
43
- >
44
- <Result.Title>
45
- <span className="block overflow-hidden truncate text-ellipsis whitespace-nowrap">
46
- {link}
47
- </span>
48
- </Result.Title>
49
- <Result.StatusDescription>
50
- {checks
51
- .map((check) => {
52
- if (check.type === 'syntax' && !check.passed)
53
- return 'Invalid URL';
54
- if (check.type === 'fetch_attempt')
55
- return `${check.metadata.fetchStatusCode}`;
56
- if (check.type === 'security')
57
- return check.passed ? 'Secure' : 'Insecure';
58
- return null;
59
- })
60
- .filter(Boolean)
61
- .join(' - ')}
62
- </Result.StatusDescription>
63
- </a>
64
- </Result>
65
- ))}
66
- </ResultList>
67
- );
68
- };
69
-
70
- interface LinkCheckerProps {
71
- emailSlug: string;
72
- emailMarkup: string;
73
- }
74
-
75
- export const LinkChecker = ({ emailSlug, emailMarkup }: LinkCheckerProps) => {
76
- const cacheKey = `link-checking-results-${emailSlug.replaceAll('/', '-')}`;
77
-
78
- const [results, setResults] = React.useState<
79
- LinkCheckingResult[] | undefined
80
- >();
81
-
82
- React.useEffect(() => {
83
- const cachedValue =
84
- 'localStorage' in global ? global.localStorage.getItem(cacheKey) : null;
85
- if (cachedValue) {
86
- setResults(JSON.parse(cachedValue));
87
- }
88
- }, [cacheKey]);
89
-
90
- const [justLoadedIn, setJustLoadedIn] = React.useState(false);
91
- const [loading, setLoading] = React.useState(false);
92
-
93
- const handleRun = () => {
94
- setLoading(true);
95
- checkLinks(emailMarkup)
96
- .then((newResults) => {
97
- setResults(newResults);
98
- setJustLoadedIn(true);
99
- localStorage.setItem(cacheKey, JSON.stringify(newResults));
100
- })
101
- .catch(console.error)
102
- .finally(() => setLoading(false));
103
- };
104
-
105
- const errorResults = React.useMemo(
106
- () => results?.filter((r) => r.status === 'error') || [],
107
- [results],
108
- );
109
- const warningResults = React.useMemo(
110
- () => results?.filter((r) => r.status === 'warning') || [],
111
- [results],
112
- );
113
- const successResults = React.useMemo(
114
- () => results?.filter((r) => r.status === 'success') || [],
115
- [results],
116
- );
117
-
118
- return (
119
- <div className="mt-4 flex w-full flex-col gap-2 text-pretty">
120
- {results ? (
121
- <>
122
- <LinkCheckerResults
123
- label="Errors"
124
- results={errorResults}
125
- justLoadedIn={justLoadedIn}
126
- status="error"
127
- />
128
- <LinkCheckerResults
129
- label="Warnings"
130
- results={warningResults}
131
- justLoadedIn={justLoadedIn}
132
- status="warning"
133
- />
134
- <LinkCheckerResults
135
- label="Success"
136
- results={successResults}
137
- justLoadedIn={justLoadedIn}
138
- status="success"
139
- />
140
- </>
141
- ) : (
142
- <span className="text-xs leading-relaxed">
143
- Check if all links are valid and redirect to the correct pages.
144
- </span>
145
- )}
146
- <Button loading={loading} onClick={handleRun}>
147
- {results ? 'Re-run' : 'Run'}
148
- </Button>
149
- </div>
150
- );
151
- };
@@ -1,8 +0,0 @@
1
- {
2
- "extends": "./tsconfig.json",
3
- "compilerOptions": {
4
- "jsx": "react-jsx"
5
- },
6
- "include": ["**/*.spec.tsx", "**/*.spec.ts"],
7
- "exclude": ["node_modules"]
8
- }