routes.tsx 81 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430
  1. import React from 'react';
  2. import {
  3. EnterHook,
  4. IndexRedirect,
  5. IndexRoute as BaseIndexRoute,
  6. IndexRouteProps,
  7. Redirect,
  8. Route as BaseRoute,
  9. RouteProps,
  10. } from 'react-router';
  11. import LazyLoad from 'app/components/lazyLoad';
  12. import {EXPERIMENTAL_SPA} from 'app/constants';
  13. import {t} from 'app/locale';
  14. import HookStore from 'app/stores/hookStore';
  15. import {HookName} from 'app/types/hooks';
  16. import errorHandler from 'app/utils/errorHandler';
  17. import App from 'app/views/app';
  18. import AuthLayout from 'app/views/auth/layout';
  19. import IssueListContainer from 'app/views/issueList/container';
  20. import IssueListOverview from 'app/views/issueList/overview';
  21. import OrganizationContext from 'app/views/organizationContext';
  22. import OrganizationDetails, {
  23. LightWeightOrganizationDetails,
  24. } from 'app/views/organizationDetails';
  25. import {TAB} from 'app/views/organizationGroupDetails/header';
  26. import OrganizationRoot from 'app/views/organizationRoot';
  27. import ProjectEventRedirect from 'app/views/projectEventRedirect';
  28. import redirectDeprecatedProjectRoute from 'app/views/projects/redirectDeprecatedProjectRoute';
  29. import RouteNotFound from 'app/views/routeNotFound';
  30. import SettingsProjectProvider from 'app/views/settings/components/settingsProjectProvider';
  31. import SettingsWrapper from 'app/views/settings/components/settingsWrapper';
  32. const appendTrailingSlash: EnterHook = (nextState, replace) => {
  33. const lastChar = nextState.location.pathname.slice(-1);
  34. if (lastChar !== '/') {
  35. replace(nextState.location.pathname + '/');
  36. }
  37. };
  38. type CustomProps = {
  39. name?: string;
  40. componentPromise?: () => Promise<any>;
  41. };
  42. /**
  43. * We add some additional props to our routes
  44. */
  45. const Route = BaseRoute as React.ComponentClass<RouteProps & CustomProps>;
  46. const IndexRoute = BaseIndexRoute as React.ComponentClass<IndexRouteProps & CustomProps>;
  47. type ComponentCallback = Parameters<NonNullable<RouteProps['getComponent']>>[1];
  48. /**
  49. * Use react-router to lazy load a route. Use this for codesplitting containers (e.g. SettingsLayout)
  50. *
  51. * The method for lazy loading a route leaf node is using the <LazyLoad> component + `componentPromise`.
  52. * The reason for this is because react-router handles the route tree better and if we use <LazyLoad> it will end
  53. * up having to re-render more components than necessary.
  54. */
  55. const lazyLoad = (cb: ComponentCallback) => (m: {default: any}) => cb(null, m.default);
  56. const hook = (name: HookName) => HookStore.get(name).map(cb => cb());
  57. function routes() {
  58. const accountSettingsRoutes = (
  59. <React.Fragment>
  60. <IndexRedirect to="details/" />
  61. <Route
  62. path="details/"
  63. name="Details"
  64. componentPromise={() =>
  65. import(
  66. /* webpackChunkName: "AccountDetails" */ 'app/views/settings/account/accountDetails'
  67. )
  68. }
  69. component={errorHandler(LazyLoad)}
  70. />
  71. <Route path="notifications/" name="Notifications">
  72. <IndexRoute
  73. componentPromise={() =>
  74. import(
  75. /* webpackChunkName: "AccountNotifications" */ 'app/views/settings/account/accountNotifications'
  76. )
  77. }
  78. component={errorHandler(LazyLoad)}
  79. />
  80. <Route
  81. path=":fineTuneType/"
  82. name="Fine Tune Alerts"
  83. componentPromise={() =>
  84. import(
  85. /* webpackChunkName: "AccountNotificationsFineTuning" */ 'app/views/settings/account/accountNotificationFineTuning'
  86. )
  87. }
  88. component={errorHandler(LazyLoad)}
  89. />
  90. </Route>
  91. <Route
  92. path="emails/"
  93. name="Emails"
  94. componentPromise={() =>
  95. import(
  96. /* webpackChunkName: "AccountEmails" */ 'app/views/settings/account/accountEmails'
  97. )
  98. }
  99. component={errorHandler(LazyLoad)}
  100. />
  101. <Route
  102. path="authorizations/"
  103. componentPromise={() =>
  104. import(
  105. /* webpackChunkName: "AccountAuthorizations" */ 'app/views/settings/account/accountAuthorizations'
  106. )
  107. }
  108. component={errorHandler(LazyLoad)}
  109. />
  110. <Route name="Security" path="security/">
  111. <Route
  112. componentPromise={() =>
  113. import(
  114. /* webpackChunkName: "AccountSecurityWrapper" */ 'app/views/settings/account/accountSecurity/accountSecurityWrapper'
  115. )
  116. }
  117. component={errorHandler(LazyLoad)}
  118. >
  119. <IndexRoute
  120. componentPromise={() =>
  121. import(
  122. /* webpackChunkName: "AccountSecurity" */ 'app/views/settings/account/accountSecurity'
  123. )
  124. }
  125. component={errorHandler(LazyLoad)}
  126. />
  127. <Route
  128. path="session-history/"
  129. name="Session History"
  130. componentPromise={() =>
  131. import(
  132. /* webpackChunkName: "SessionHistory" */ 'app/views/settings/account/accountSecurity/sessionHistory'
  133. )
  134. }
  135. component={errorHandler(LazyLoad)}
  136. />
  137. <Route
  138. path="mfa/:authId/"
  139. name="Details"
  140. componentPromise={() =>
  141. import(
  142. /* webpackChunkName: "AccountSecurityDetails" */ 'app/views/settings/account/accountSecurity/accountSecurityDetails'
  143. )
  144. }
  145. component={errorHandler(LazyLoad)}
  146. />
  147. </Route>
  148. <Route
  149. path="mfa/:authId/enroll/"
  150. name="Enroll"
  151. componentPromise={() =>
  152. import(
  153. /* webpackChunkName: "AccountSecurityEnroll" */ 'app/views/settings/account/accountSecurity/accountSecurityEnroll'
  154. )
  155. }
  156. component={errorHandler(LazyLoad)}
  157. />
  158. </Route>
  159. <Route
  160. path="subscriptions/"
  161. name="Subscriptions"
  162. componentPromise={() =>
  163. import(
  164. /* webpackChunkName: "AccountSubscriptions" */ 'app/views/settings/account/accountSubscriptions'
  165. )
  166. }
  167. component={errorHandler(LazyLoad)}
  168. />
  169. <Route
  170. path="identities/"
  171. name="Identities"
  172. componentPromise={() =>
  173. import(
  174. /* webpackChunkName: "AccountSocialIdentities" */ 'app/views/settings/account/accountIdentities'
  175. )
  176. }
  177. component={errorHandler(LazyLoad)}
  178. />
  179. <Route path="api/" name="API">
  180. <IndexRedirect to="auth-tokens/" />
  181. <Route path="auth-tokens/" name="Auth Tokens">
  182. <IndexRoute
  183. componentPromise={() =>
  184. import(
  185. /* webpackChunkName: "ApiTokensIndex" */ 'app/views/settings/account/apiTokens'
  186. )
  187. }
  188. component={errorHandler(LazyLoad)}
  189. />
  190. <Route
  191. path="new-token/"
  192. name="Create New Token"
  193. componentPromise={() =>
  194. import(
  195. /* webpackChunkName: "ApiTokenCreate" */ 'app/views/settings/account/apiNewToken'
  196. )
  197. }
  198. component={errorHandler(LazyLoad)}
  199. />
  200. </Route>
  201. <Route path="applications/" name="Applications">
  202. <IndexRoute
  203. componentPromise={() =>
  204. import(
  205. /* webpackChunkName: "ApiApplications" */ 'app/views/settings/account/apiApplications'
  206. )
  207. }
  208. component={errorHandler(LazyLoad)}
  209. />
  210. <Route
  211. path=":appId/"
  212. name="Details"
  213. componentPromise={() =>
  214. import(
  215. /* webpackChunkName: "ApiApplicationDetails" */ 'app/views/settings/account/apiApplications/details'
  216. )
  217. }
  218. component={errorHandler(LazyLoad)}
  219. />
  220. </Route>
  221. {hook('routes:api')}
  222. </Route>
  223. <Route
  224. path="close-account/"
  225. name="Close Account"
  226. componentPromise={() =>
  227. import(
  228. /* webpackChunkName: "AccountClose" */ 'app/views/settings/account/accountClose'
  229. )
  230. }
  231. component={errorHandler(LazyLoad)}
  232. />
  233. </React.Fragment>
  234. );
  235. const projectSettingsRoutes = (
  236. <React.Fragment>
  237. <IndexRoute
  238. name="General"
  239. componentPromise={() =>
  240. import(
  241. /* webpackChunkName: "ProjectGeneralSettings" */ 'app/views/settings/projectGeneralSettings'
  242. )
  243. }
  244. component={errorHandler(LazyLoad)}
  245. />
  246. <Route
  247. path="teams/"
  248. name="Teams"
  249. componentPromise={() =>
  250. import(
  251. /* webpackChunkName: "ProjectTeams" */ 'app/views/settings/project/projectTeams'
  252. )
  253. }
  254. component={errorHandler(LazyLoad)}
  255. />
  256. <Route
  257. name="Alerts"
  258. path="alerts/"
  259. component={errorHandler(LazyLoad)}
  260. componentPromise={() =>
  261. import(
  262. /* webpackChunkName: "ProjectAlerts" */ 'app/views/settings/projectAlerts'
  263. )
  264. }
  265. >
  266. <IndexRoute
  267. component={errorHandler(LazyLoad)}
  268. componentPromise={() =>
  269. import(
  270. /* webpackChunkName: "ProjectAlertsSettings" */ 'app/views/settings/projectAlerts/settings'
  271. )
  272. }
  273. />
  274. <Redirect from="new/" to="/organizations/:orgId/alerts/:projectId/new/" />
  275. <Redirect from="rules/" to="/organizations/:orgId/alerts/rules/" />
  276. <Redirect from="rules/new/" to="/organizations/:orgId/alerts/:projectId/new/" />
  277. <Redirect
  278. from="metric-rules/new/"
  279. to="/organizations/:orgId/alerts/:projectId/new/"
  280. />
  281. <Redirect
  282. from="rules/:ruleId/"
  283. to="/organizations/:orgId/alerts/rules/:projectId/:ruleId/"
  284. />
  285. <Redirect
  286. from="metric-rules/:ruleId/"
  287. to="/organizations/:orgId/alerts/metric-rules/:projectId/:ruleId/"
  288. />
  289. </Route>
  290. <Route
  291. name="Environments"
  292. path="environments/"
  293. componentPromise={() =>
  294. import(
  295. /* webpackChunkName: "ProjectEnvironments" */ 'app/views/settings/project/projectEnvironments'
  296. )
  297. }
  298. component={errorHandler(LazyLoad)}
  299. >
  300. <IndexRoute />
  301. <Route path="hidden/" />
  302. </Route>
  303. <Route
  304. name="Tags"
  305. path="tags/"
  306. componentPromise={() =>
  307. import(/* webpackChunkName: "ProjectTags" */ 'app/views/settings/projectTags')
  308. }
  309. component={errorHandler(LazyLoad)}
  310. />
  311. <Redirect from="issue-tracking/" to="/settings/:orgId/:projectId/plugins/" />
  312. <Route
  313. path="release-tracking/"
  314. name="Release Tracking"
  315. componentPromise={() =>
  316. import(
  317. /* webpackChunkName: "ProjectReleaseTracking" */ 'app/views/settings/project/projectReleaseTracking'
  318. )
  319. }
  320. component={errorHandler(LazyLoad)}
  321. />
  322. <Route
  323. path="ownership/"
  324. name="Issue Owners"
  325. componentPromise={() =>
  326. import(
  327. /* webpackChunkName: "ProjectOwnership" */ 'app/views/settings/project/projectOwnership'
  328. )
  329. }
  330. component={errorHandler(LazyLoad)}
  331. />
  332. <Route
  333. path="data-forwarding/"
  334. name="Data Forwarding"
  335. componentPromise={() =>
  336. import(
  337. /* webpackChunkName: "ProjectDataForwarding" */ 'app/views/settings/projectDataForwarding'
  338. )
  339. }
  340. component={errorHandler(LazyLoad)}
  341. />
  342. <Route
  343. name={t('Security & Privacy')}
  344. path="security-and-privacy/"
  345. component={errorHandler(LazyLoad)}
  346. componentPromise={() =>
  347. import(
  348. /* webpackChunkName: "ProjectSecurityAndPrivacy" */ 'app/views/settings/projectSecurityAndPrivacy'
  349. )
  350. }
  351. />
  352. <Route
  353. path="debug-symbols/"
  354. name="Debug Information Files"
  355. componentPromise={() =>
  356. import(
  357. /* webpackChunkName: "ProjectDebugFiles" */ 'app/views/settings/projectDebugFiles'
  358. )
  359. }
  360. component={errorHandler(LazyLoad)}
  361. />
  362. <Route
  363. path="proguard/"
  364. name={t('ProGuard Mappings')}
  365. componentPromise={() =>
  366. import(
  367. /* webpackChunkName: "ProjectProguard" */ 'app/views/settings/projectProguard'
  368. )
  369. }
  370. component={errorHandler(LazyLoad)}
  371. />
  372. <Route
  373. path="source-maps/"
  374. name={t('Source Maps')}
  375. componentPromise={() =>
  376. import(
  377. /* webpackChunkName: "ProjectSourceMaps" */ 'app/views/settings/projectSourceMaps'
  378. )
  379. }
  380. component={errorHandler(LazyLoad)}
  381. >
  382. <IndexRoute
  383. componentPromise={() =>
  384. import(
  385. /* webpackChunkName: "ProjectSourceMapsList" */ 'app/views/settings/projectSourceMaps/list'
  386. )
  387. }
  388. component={errorHandler(LazyLoad)}
  389. />
  390. <Route
  391. path=":name/"
  392. name={t('Archive')}
  393. componentPromise={() =>
  394. import(
  395. /* webpackChunkName: "ProjectSourceMapsDetail" */ 'app/views/settings/projectSourceMaps/detail'
  396. )
  397. }
  398. component={errorHandler(LazyLoad)}
  399. />
  400. </Route>
  401. <Route
  402. path="processing-issues/"
  403. name="Processing Issues"
  404. componentPromise={() =>
  405. import(
  406. /* webpackChunkName: "ProjectProcessingIssues" */ 'app/views/settings/project/projectProcessingIssues'
  407. )
  408. }
  409. component={errorHandler(LazyLoad)}
  410. />
  411. <Route
  412. path="filters/"
  413. name="Inbound Filters"
  414. componentPromise={() =>
  415. import(
  416. /* webpackChunkName: "ProjectFilters" */ 'app/views/settings/project/projectFilters'
  417. )
  418. }
  419. component={errorHandler(LazyLoad)}
  420. >
  421. <IndexRedirect to="data-filters/" />
  422. <Route path=":filterType/" />
  423. </Route>
  424. <Route
  425. name={t('Filters & Sampling')}
  426. path="filters-and-sampling/"
  427. componentPromise={() =>
  428. import(
  429. /* webpackChunkName: "ProjectFiltersAndSampling" */ 'app/views/settings/project/filtersAndSampling'
  430. )
  431. }
  432. component={errorHandler(LazyLoad)}
  433. />
  434. <Route
  435. path="issue-grouping/"
  436. name={t('Issue Grouping')}
  437. componentPromise={() =>
  438. import(
  439. /* webpackChunkName: "ProjectIssueGrouping" */ 'app/views/settings/projectIssueGrouping'
  440. )
  441. }
  442. component={errorHandler(LazyLoad)}
  443. />
  444. <Route
  445. path="hooks/"
  446. name="Service Hooks"
  447. componentPromise={() =>
  448. import(
  449. /* webpackChunkName: "ProjectServiceHooks" */ 'app/views/settings/project/projectServiceHooks'
  450. )
  451. }
  452. component={errorHandler(LazyLoad)}
  453. />
  454. <Route
  455. path="hooks/new/"
  456. name="Create Service Hook"
  457. componentPromise={() =>
  458. import(
  459. /* webpackChunkName: "ProjectCreateServiceHook" */ 'app/views/settings/project/projectCreateServiceHook'
  460. )
  461. }
  462. component={errorHandler(LazyLoad)}
  463. />
  464. <Route
  465. path="hooks/:hookId/"
  466. name="Service Hook Details"
  467. componentPromise={() =>
  468. import(
  469. /* webpackChunkName: "ProjectServiceHookDetails" */ 'app/views/settings/project/projectServiceHookDetails'
  470. )
  471. }
  472. component={errorHandler(LazyLoad)}
  473. />
  474. <Route path="keys/" name="Client Keys">
  475. <IndexRoute
  476. componentPromise={() =>
  477. import(
  478. /* webpackChunkName: "ProjectKeys" */ 'app/views/settings/project/projectKeys/list'
  479. )
  480. }
  481. component={errorHandler(LazyLoad)}
  482. />
  483. <Route
  484. path=":keyId/"
  485. name="Details"
  486. componentPromise={() =>
  487. import(
  488. /* webpackChunkName: "ProjectKeyDetails" */ 'app/views/settings/project/projectKeys/details'
  489. )
  490. }
  491. component={errorHandler(LazyLoad)}
  492. />
  493. </Route>
  494. <Route
  495. path="user-feedback/"
  496. name="User Feedback"
  497. componentPromise={() =>
  498. import(
  499. /* webpackChunkName: "ProjectUserFeedbackSettings" */ 'app/views/settings/project/projectUserFeedback'
  500. )
  501. }
  502. component={errorHandler(LazyLoad)}
  503. />
  504. <Redirect from="csp/" to="security-headers/" />
  505. <Route path="security-headers/" name="Security Headers">
  506. <IndexRoute
  507. componentPromise={() =>
  508. import(
  509. /* webpackChunkName: "ProjectSecurityHeaders" */ 'app/views/settings/projectSecurityHeaders'
  510. )
  511. }
  512. component={errorHandler(LazyLoad)}
  513. />
  514. <Route
  515. path="csp/"
  516. name="Content Security Policy"
  517. componentPromise={() =>
  518. import(
  519. /* webpackChunkName: "ProjectCspReports" */ 'app/views/settings/projectSecurityHeaders/csp'
  520. )
  521. }
  522. component={errorHandler(LazyLoad)}
  523. />
  524. <Route
  525. path="expect-ct/"
  526. name="Certificate Transparency"
  527. componentPromise={() =>
  528. import(
  529. /* webpackChunkName: "ProjectExpectCtReports" */ 'app/views/settings/projectSecurityHeaders/expectCt'
  530. )
  531. }
  532. component={errorHandler(LazyLoad)}
  533. />
  534. <Route
  535. path="hpkp/"
  536. name="HPKP"
  537. componentPromise={() =>
  538. import(
  539. /* webpackChunkName: "ProjectHpkpReports" */ 'app/views/settings/projectSecurityHeaders/hpkp'
  540. )
  541. }
  542. component={errorHandler(LazyLoad)}
  543. />
  544. </Route>
  545. <Route path="plugins/" name="Legacy Integrations">
  546. <IndexRoute
  547. componentPromise={() =>
  548. import(
  549. /* webpackChunkName: "ProjectPlugins" */ 'app/views/settings/projectPlugins'
  550. )
  551. }
  552. component={errorHandler(LazyLoad)}
  553. />
  554. <Route
  555. path=":pluginId/"
  556. name="Integration Details"
  557. componentPromise={() =>
  558. import(
  559. /* webpackChunkName: "ProjectPluginDetails" */ 'app/views/settings/projectPlugins/details'
  560. )
  561. }
  562. component={errorHandler(LazyLoad)}
  563. />
  564. </Route>
  565. <Route path="install/" name="Configuration">
  566. <IndexRoute
  567. componentPromise={() =>
  568. import(
  569. /* webpackChunkName: "ProjectInstallOverview" */ 'app/views/projectInstall/overview'
  570. )
  571. }
  572. component={errorHandler(LazyLoad)}
  573. />
  574. <Route
  575. path=":platform/"
  576. name="Docs"
  577. componentPromise={() =>
  578. import(
  579. /* webpackChunkName: "PlatformOrIntegration" */ 'app/views/projectInstall/platformOrIntegration'
  580. )
  581. }
  582. component={errorHandler(LazyLoad)}
  583. />
  584. </Route>
  585. </React.Fragment>
  586. );
  587. // This is declared in the routes() function because some routes need the
  588. // hook store which is not available at import time.
  589. const orgSettingsRoutes = (
  590. <React.Fragment>
  591. <IndexRoute
  592. name="General"
  593. componentPromise={() =>
  594. import(
  595. /* webpackChunkName: "OrganizationGeneralSettings" */ 'app/views/settings/organizationGeneralSettings'
  596. )
  597. }
  598. component={errorHandler(LazyLoad)}
  599. />
  600. <Route
  601. path="projects/"
  602. name="Projects"
  603. componentPromise={() =>
  604. import(
  605. /* webpackChunkName: "OrganizationProjects" */ 'app/views/settings/organizationProjects'
  606. )
  607. }
  608. component={errorHandler(LazyLoad)}
  609. />
  610. <Route path="api-keys/" name="API Key">
  611. <IndexRoute
  612. componentPromise={() =>
  613. import(
  614. /* webpackChunkName: "OrganizationApiKeys" */ 'app/views/settings/organizationApiKeys'
  615. )
  616. }
  617. component={errorHandler(LazyLoad)}
  618. />
  619. <Route
  620. path=":apiKey/"
  621. name="Details"
  622. componentPromise={() =>
  623. import(
  624. /* webpackChunkName: "OrganizationApiKeyDetails" */ 'app/views/settings/organizationApiKeys/organizationApiKeyDetails'
  625. )
  626. }
  627. component={errorHandler(LazyLoad)}
  628. />
  629. </Route>
  630. <Route
  631. path="audit-log/"
  632. name="Audit Log"
  633. componentPromise={() =>
  634. import(
  635. /* webpackChunkName: "OrganizationAuditLog" */ 'app/views/settings/organizationAuditLog'
  636. )
  637. }
  638. component={errorHandler(LazyLoad)}
  639. />
  640. <Route
  641. path="auth/"
  642. name="Auth Providers"
  643. componentPromise={() =>
  644. import(
  645. /* webpackChunkName: "OrganizationAuth" */ 'app/views/settings/organizationAuth'
  646. )
  647. }
  648. component={errorHandler(LazyLoad)}
  649. />
  650. <Route path="members/" name="Members">
  651. <Route
  652. componentPromise={() =>
  653. import(
  654. /* webpackChunkName: "OrganizationMembersWrapper" */ 'app/views/settings/organizationMembers/organizationMembersWrapper'
  655. )
  656. }
  657. component={errorHandler(LazyLoad)}
  658. >
  659. <IndexRoute
  660. componentPromise={() =>
  661. import(
  662. /* webpackChunkName: "OrganizationMembersList" */ 'app/views/settings/organizationMembers/organizationMembersList'
  663. )
  664. }
  665. component={errorHandler(LazyLoad)}
  666. />
  667. <Route
  668. path="requests/"
  669. name="Requests"
  670. componentPromise={() =>
  671. import(
  672. /* webpackChunkName: "OrganizationRequestsView" */ 'app/views/settings/organizationMembers/organizationRequestsView'
  673. )
  674. }
  675. component={errorHandler(LazyLoad)}
  676. />
  677. </Route>
  678. <Route
  679. path=":memberId/"
  680. name="Details"
  681. componentPromise={() =>
  682. import(
  683. /* webpackChunkName: "OrganizationMemberDetail" */ 'app/views/settings/organizationMembers/organizationMemberDetail'
  684. )
  685. }
  686. component={errorHandler(LazyLoad)}
  687. />
  688. </Route>
  689. <Route
  690. path="rate-limits/"
  691. name="Rate Limits"
  692. componentPromise={() =>
  693. import(
  694. /* webpackChunkName: "OrganizationRateLimits" */ 'app/views/settings/organizationRateLimits'
  695. )
  696. }
  697. component={errorHandler(LazyLoad)}
  698. />
  699. <Route
  700. name={t('Relay')}
  701. path="relay/"
  702. componentPromise={() =>
  703. import(
  704. /* webpackChunkName: "organizationRelay" */ 'app/views/settings/organizationRelay'
  705. )
  706. }
  707. component={errorHandler(LazyLoad)}
  708. />
  709. <Route
  710. path="repos/"
  711. name="Repositories"
  712. componentPromise={() =>
  713. import(
  714. /* webpackChunkName: "OrganizationRepositories" */ 'app/views/settings/organizationRepositories'
  715. )
  716. }
  717. component={errorHandler(LazyLoad)}
  718. />
  719. <Route
  720. path="performance/"
  721. name={t('Performance')}
  722. componentPromise={() =>
  723. import(
  724. /* webpackChunkName: "OrganizationPerformance" */ 'app/views/settings/organizationPerformance'
  725. )
  726. }
  727. component={errorHandler(LazyLoad)}
  728. />
  729. <Route
  730. path="settings/"
  731. componentPromise={() =>
  732. import(
  733. /* webpackChunkName: "OrganizationGeneralSettings" */ 'app/views/settings/organizationGeneralSettings'
  734. )
  735. }
  736. component={errorHandler(LazyLoad)}
  737. />
  738. <Route
  739. name={t('Security & Privacy')}
  740. path="security-and-privacy/"
  741. componentPromise={() =>
  742. import(
  743. /* webpackChunkName: "OrganizationSecurityAndPrivacy" */ 'app/views/settings/organizationSecurityAndPrivacy'
  744. )
  745. }
  746. component={errorHandler(LazyLoad)}
  747. />
  748. <Route name="Teams" path="teams/">
  749. <IndexRoute
  750. componentPromise={() =>
  751. import(
  752. /* webpackChunkName: "OrganizationTeams" */ 'app/views/settings/organizationTeams'
  753. )
  754. }
  755. component={errorHandler(LazyLoad)}
  756. />
  757. <Route
  758. name="Team"
  759. path=":teamId/"
  760. componentPromise={() =>
  761. import(
  762. /* webpackChunkName: "TeamDetails" */ 'app/views/settings/organizationTeams/teamDetails'
  763. )
  764. }
  765. component={errorHandler(LazyLoad)}
  766. >
  767. <IndexRedirect to="members/" />
  768. <Route
  769. path="members/"
  770. name="Members"
  771. componentPromise={() =>
  772. import(
  773. /* webpackChunkName: "TeamMembers" */ 'app/views/settings/organizationTeams/teamMembers'
  774. )
  775. }
  776. component={errorHandler(LazyLoad)}
  777. />
  778. <Route
  779. path="projects/"
  780. name="Projects"
  781. componentPromise={() =>
  782. import(
  783. /* webpackChunkName: "TeamProjects" */ 'app/views/settings/organizationTeams/teamProjects'
  784. )
  785. }
  786. component={errorHandler(LazyLoad)}
  787. />
  788. <Route
  789. path="settings/"
  790. name="settings"
  791. componentPromise={() =>
  792. import(
  793. /* webpackChunkName: "TeamSettings" */ 'app/views/settings/organizationTeams/teamSettings'
  794. )
  795. }
  796. component={errorHandler(LazyLoad)}
  797. />
  798. </Route>
  799. </Route>
  800. <Redirect from="plugins/" to="integrations/" />
  801. <Route name="Integrations" path="plugins/">
  802. <Route
  803. name="Integration Details"
  804. path=":integrationSlug/"
  805. componentPromise={() =>
  806. import(
  807. /* webpackChunkName: "PluginDetailedView" */ 'app/views/organizationIntegrations/pluginDetailedView'
  808. )
  809. }
  810. component={errorHandler(LazyLoad)}
  811. />
  812. </Route>
  813. <Redirect from="sentry-apps/" to="integrations/" />
  814. <Route name="Integrations" path="sentry-apps/">
  815. <Route
  816. name="Details"
  817. path=":integrationSlug"
  818. componentPromise={() =>
  819. import(
  820. /* webpackChunkName: "SentryAppDetailedView" */ 'app/views/organizationIntegrations/sentryAppDetailedView'
  821. )
  822. }
  823. component={errorHandler(LazyLoad)}
  824. />
  825. </Route>
  826. <Redirect from="document-integrations/" to="integrations/" />
  827. <Route name="Integrations" path="document-integrations/">
  828. <Route
  829. name="Details"
  830. path=":integrationSlug"
  831. componentPromise={() =>
  832. import(
  833. /* webpackChunkName: "DocIntegrationDetailedView" */ 'app/views/organizationIntegrations/docIntegrationDetailedView'
  834. )
  835. }
  836. component={errorHandler(LazyLoad)}
  837. />
  838. </Route>
  839. <Route name="Integrations" path="integrations/">
  840. <IndexRoute
  841. componentPromise={() =>
  842. import(
  843. /* webpackChunkName: "IntegrationListDirectory" */ 'app/views/organizationIntegrations/integrationListDirectory'
  844. )
  845. }
  846. component={errorHandler(LazyLoad)}
  847. />
  848. <Route
  849. name="Integration Details"
  850. path=":integrationSlug"
  851. componentPromise={() =>
  852. import(
  853. /* webpackChunkName: "IntegrationDetailedView" */ 'app/views/organizationIntegrations/integrationDetailedView'
  854. )
  855. }
  856. component={errorHandler(LazyLoad)}
  857. />
  858. <Route
  859. name="Configure Integration"
  860. path=":providerKey/:integrationId/"
  861. componentPromise={() =>
  862. import(
  863. /* webpackChunkName: "ConfigureIntegration" */ 'app/views/settings/organizationIntegrations/configureIntegration'
  864. )
  865. }
  866. component={errorHandler(LazyLoad)}
  867. />
  868. </Route>
  869. <Route name="Developer Settings" path="developer-settings/">
  870. <IndexRoute
  871. componentPromise={() =>
  872. import(
  873. /* webpackChunkName: "OrganizationDeveloperSettings" */ 'app/views/settings/organizationDeveloperSettings'
  874. )
  875. }
  876. component={errorHandler(LazyLoad)}
  877. />
  878. <Route
  879. name="New Public Integration"
  880. path="new-public/"
  881. componentPromise={() =>
  882. import(
  883. /* webpackChunkName: "sentryApplicationDetails" */ 'app/views/settings/organizationDeveloperSettings/sentryApplicationDetails'
  884. )
  885. }
  886. component={errorHandler(LazyLoad)}
  887. />
  888. <Route
  889. name="New Internal Integration"
  890. path="new-internal/"
  891. componentPromise={() =>
  892. import(
  893. /* webpackChunkName: "sentryApplicationDetails" */ 'app/views/settings/organizationDeveloperSettings/sentryApplicationDetails'
  894. )
  895. }
  896. component={errorHandler(LazyLoad)}
  897. />
  898. <Route
  899. name="Edit Integration"
  900. path=":appSlug/"
  901. componentPromise={() =>
  902. import(
  903. /* webpackChunkName: "sentryApplicationDetails" */ 'app/views/settings/organizationDeveloperSettings/sentryApplicationDetails'
  904. )
  905. }
  906. component={errorHandler(LazyLoad)}
  907. />
  908. <Route
  909. name="Integration Dashboard"
  910. path=":appSlug/dashboard/"
  911. componentPromise={() =>
  912. import(
  913. /* webpackChunkName: "SentryApplicationDashboard" */ 'app/views/settings/organizationDeveloperSettings/sentryApplicationDashboard'
  914. )
  915. }
  916. component={errorHandler(LazyLoad)}
  917. />
  918. </Route>
  919. </React.Fragment>
  920. );
  921. return (
  922. <Route>
  923. {EXPERIMENTAL_SPA && (
  924. <Route path="/auth/login/" component={errorHandler(AuthLayout)}>
  925. <IndexRoute
  926. componentPromise={() =>
  927. import(/* webpackChunkName: "AuthLogin" */ 'app/views/auth/login')
  928. }
  929. component={errorHandler(LazyLoad)}
  930. />
  931. </Route>
  932. )}
  933. <Route path="/" component={errorHandler(App)}>
  934. <IndexRoute
  935. componentPromise={() =>
  936. import(/* webpackChunkName: "AppRoot" */ 'app/views/app/root')
  937. }
  938. component={errorHandler(LazyLoad)}
  939. />
  940. <Route
  941. path="/accept/:memberId/:token/"
  942. componentPromise={() =>
  943. import(
  944. /* webpackChunkName: "AcceptOrganizationInvite" */ 'app/views/acceptOrganizationInvite'
  945. )
  946. }
  947. component={errorHandler(LazyLoad)}
  948. />
  949. <Route
  950. path="/accept-transfer/"
  951. componentPromise={() =>
  952. import(
  953. /* webpackChunkName: "AcceptProjectTransfer" */ 'app/views/acceptProjectTransfer'
  954. )
  955. }
  956. component={errorHandler(LazyLoad)}
  957. />
  958. <Route
  959. path="/extensions/external-install/:integrationSlug/:installationId"
  960. componentPromise={() =>
  961. import(
  962. /* webpackChunkName: "IntegrationOrganizationLink" */ 'app/views/integrationOrganizationLink'
  963. )
  964. }
  965. component={errorHandler(LazyLoad)}
  966. />
  967. <Route
  968. path="/extensions/:integrationSlug/link/"
  969. getComponent={(_loc, cb) =>
  970. import(
  971. /* webpackChunkName: "IntegrationOrganizationLink" */ 'app/views/integrationOrganizationLink'
  972. ).then(lazyLoad(cb))
  973. }
  974. />
  975. <Route
  976. path="/sentry-apps/:sentryAppSlug/external-install/"
  977. componentPromise={() =>
  978. import(
  979. /* webpackChunkName: "SentryAppExternalInstallation" */ 'app/views/sentryAppExternalInstallation'
  980. )
  981. }
  982. component={errorHandler(LazyLoad)}
  983. />
  984. <Redirect from="/account/" to="/settings/account/details/" />
  985. <Redirect from="/share/group/:shareId/" to="/share/issue/:shareId/" />
  986. <Route
  987. path="/share/issue/:shareId/"
  988. componentPromise={() =>
  989. import(
  990. /* webpackChunkName: "SharedGroupDetails" */ 'app/views/sharedGroupDetails'
  991. )
  992. }
  993. component={errorHandler(LazyLoad)}
  994. />
  995. <Route
  996. path="/organizations/new/"
  997. componentPromise={() =>
  998. import(
  999. /* webpackChunkName: "OrganizationCreate" */ 'app/views/organizationCreate'
  1000. )
  1001. }
  1002. component={errorHandler(LazyLoad)}
  1003. />
  1004. <Route
  1005. path="/organizations/:orgId/data-export/:dataExportId"
  1006. componentPromise={() =>
  1007. import(
  1008. /* webpackChunkName: "DataDownloadView" */ 'app/views/dataExport/dataDownload'
  1009. )
  1010. }
  1011. component={errorHandler(LazyLoad)}
  1012. />
  1013. <Route
  1014. path="/join-request/:orgId/"
  1015. componentPromise={() =>
  1016. import(
  1017. /* webpackChunkName: "OrganizationJoinRequest" */ 'app/views/organizationJoinRequest'
  1018. )
  1019. }
  1020. component={errorHandler(LazyLoad)}
  1021. />
  1022. <Route path="/onboarding/:orgId/" component={errorHandler(OrganizationContext)}>
  1023. <IndexRedirect to="welcome/" />
  1024. <Route
  1025. path=":step/"
  1026. componentPromise={() =>
  1027. import(
  1028. /* webpackChunkName: "Onboarding" */ 'app/views/onboarding/onboarding'
  1029. )
  1030. }
  1031. component={errorHandler(LazyLoad)}
  1032. />
  1033. </Route>
  1034. {/* Settings routes */}
  1035. <Route component={errorHandler(OrganizationDetails)}>
  1036. <Route path="/settings/" name="Settings" component={SettingsWrapper}>
  1037. <IndexRoute
  1038. getComponent={(_loc, cb) =>
  1039. import(
  1040. /* webpackChunkName: "SettingsIndex" */ 'app/views/settings/settingsIndex'
  1041. ).then(lazyLoad(cb))
  1042. }
  1043. />
  1044. <Route
  1045. path="account/"
  1046. name="Account"
  1047. getComponent={(_loc, cb) =>
  1048. import(
  1049. /* webpackChunkName: "AccountSettingsLayout" */ 'app/views/settings/account/accountSettingsLayout'
  1050. ).then(lazyLoad(cb))
  1051. }
  1052. >
  1053. {accountSettingsRoutes}
  1054. </Route>
  1055. <Route name="Organization" path=":orgId/">
  1056. <Route
  1057. getComponent={(_loc, cb) =>
  1058. import(
  1059. /* webpackChunkName: "OrganizationSettingsLayout" */ 'app/views/settings/organization/organizationSettingsLayout'
  1060. ).then(lazyLoad(cb))
  1061. }
  1062. >
  1063. {hook('routes:organization')}
  1064. {orgSettingsRoutes}
  1065. </Route>
  1066. <Route
  1067. name="Project"
  1068. path="projects/:projectId/"
  1069. getComponent={(_loc, cb) =>
  1070. import(
  1071. /* webpackChunkName: "ProjectSettingsLayout" */ 'app/views/settings/project/projectSettingsLayout'
  1072. ).then(lazyLoad(cb))
  1073. }
  1074. >
  1075. <Route component={errorHandler(SettingsProjectProvider)}>
  1076. {projectSettingsRoutes}
  1077. </Route>
  1078. </Route>
  1079. <Redirect from=":projectId/" to="projects/:projectId/" />
  1080. <Redirect from=":projectId/alerts/" to="projects/:projectId/alerts/" />
  1081. <Redirect
  1082. from=":projectId/alerts/rules/"
  1083. to="projects/:projectId/alerts/rules/"
  1084. />
  1085. <Redirect
  1086. from=":projectId/alerts/rules/:ruleId/"
  1087. to="projects/:projectId/alerts/rules/:ruleId/"
  1088. />
  1089. </Route>
  1090. </Route>
  1091. </Route>
  1092. {/* A route tree for lightweight organizational detail views. We place
  1093. this above the heavyweight organization detail views because there
  1094. exist some redirects from deprecated routes which should not take
  1095. precedence over these lightweight routes*/}
  1096. <Route component={errorHandler(LightWeightOrganizationDetails)}>
  1097. <Route
  1098. path="/organizations/:orgId/projects/"
  1099. componentPromise={() =>
  1100. import(
  1101. /* webpackChunkName: "ProjectsDashboard" */ 'app/views/projectsDashboard'
  1102. )
  1103. }
  1104. component={errorHandler(LazyLoad)}
  1105. />
  1106. <Route
  1107. path="/organizations/:orgId/dashboards/manage/"
  1108. componentPromise={() =>
  1109. import(
  1110. /* webpackChunkName: "ManageDashboards" */ 'app/views/dashboardsV2/manage'
  1111. )
  1112. }
  1113. component={errorHandler(LazyLoad)}
  1114. />
  1115. <Route
  1116. path="/organizations/:orgId/dashboards/"
  1117. componentPromise={() =>
  1118. import(
  1119. /* webpackChunkName: "DashboardsV2Container" */ 'app/views/dashboardsV2'
  1120. )
  1121. }
  1122. component={errorHandler(LazyLoad)}
  1123. >
  1124. <IndexRoute
  1125. componentPromise={() =>
  1126. import(
  1127. /* webpackChunkName: "DashboardDetail" */ 'app/views/dashboardsV2/detail'
  1128. )
  1129. }
  1130. component={errorHandler(LazyLoad)}
  1131. />
  1132. </Route>
  1133. <Route
  1134. path="/organizations/:orgId/user-feedback/"
  1135. componentPromise={() =>
  1136. import(/* webpackChunkName: "UserFeedback" */ 'app/views/userFeedback')
  1137. }
  1138. component={errorHandler(LazyLoad)}
  1139. />
  1140. <Route
  1141. path="/organizations/:orgId/issues/"
  1142. component={errorHandler(IssueListContainer)}
  1143. >
  1144. <Redirect from="/organizations/:orgId/" to="/organizations/:orgId/issues/" />
  1145. <IndexRoute component={errorHandler(IssueListOverview)} />
  1146. <Route
  1147. path="searches/:searchId/"
  1148. component={errorHandler(IssueListOverview)}
  1149. />
  1150. </Route>
  1151. {/* Once org issues is complete, these routes can be nested under
  1152. /organizations/:orgId/issues */}
  1153. <Route
  1154. path="/organizations/:orgId/issues/:groupId/"
  1155. componentPromise={() =>
  1156. import(
  1157. /* webpackChunkName: "GroupDetails" */ 'app/views/organizationGroupDetails'
  1158. )
  1159. }
  1160. component={errorHandler(LazyLoad)}
  1161. >
  1162. <IndexRoute
  1163. componentPromise={() =>
  1164. import(
  1165. /* webpackChunkName: "GroupEventDetails" */ 'app/views/organizationGroupDetails/groupEventDetails'
  1166. )
  1167. }
  1168. component={errorHandler(LazyLoad)}
  1169. props={{
  1170. currentTab: TAB.DETAILS,
  1171. isEventRoute: false,
  1172. }}
  1173. />
  1174. <Route
  1175. path="/organizations/:orgId/issues/:groupId/activity/"
  1176. componentPromise={() =>
  1177. import(
  1178. /* webpackChunkName: "GroupActivity" */ 'app/views/organizationGroupDetails/groupActivity'
  1179. )
  1180. }
  1181. component={errorHandler(LazyLoad)}
  1182. props={{
  1183. currentTab: TAB.ACTIVITY,
  1184. isEventRoute: false,
  1185. }}
  1186. />
  1187. <Route
  1188. path="/organizations/:orgId/issues/:groupId/events/"
  1189. componentPromise={() =>
  1190. import(
  1191. /* webpackChunkName: "GroupEvents" */ 'app/views/organizationGroupDetails/groupEvents'
  1192. )
  1193. }
  1194. component={errorHandler(LazyLoad)}
  1195. props={{
  1196. currentTab: TAB.EVENTS,
  1197. isEventRoute: false,
  1198. }}
  1199. />
  1200. <Route
  1201. path="/organizations/:orgId/issues/:groupId/tags/"
  1202. componentPromise={() =>
  1203. import(
  1204. /* webpackChunkName: "GroupTags" */ 'app/views/organizationGroupDetails/groupTags'
  1205. )
  1206. }
  1207. component={errorHandler(LazyLoad)}
  1208. props={{
  1209. currentTab: TAB.TAGS,
  1210. isEventRoute: false,
  1211. }}
  1212. />
  1213. <Route
  1214. path="/organizations/:orgId/issues/:groupId/tags/:tagKey/"
  1215. componentPromise={() =>
  1216. import(
  1217. /* webpackChunkName: "GroupTagsValues" */ 'app/views/organizationGroupDetails/groupTagValues'
  1218. )
  1219. }
  1220. component={errorHandler(LazyLoad)}
  1221. props={{
  1222. currentTab: TAB.TAGS,
  1223. isEventRoute: false,
  1224. }}
  1225. />
  1226. <Route
  1227. path="/organizations/:orgId/issues/:groupId/feedback/"
  1228. componentPromise={() =>
  1229. import(
  1230. /* webpackChunkName: "GroupUserFeedback" */ 'app/views/organizationGroupDetails/groupUserFeedback'
  1231. )
  1232. }
  1233. component={errorHandler(LazyLoad)}
  1234. props={{
  1235. currentTab: TAB.USER_FEEDBACK,
  1236. isEventRoute: false,
  1237. }}
  1238. />
  1239. <Route
  1240. path="/organizations/:orgId/issues/:groupId/attachments/"
  1241. componentPromise={() =>
  1242. import(
  1243. /* webpackChunkName: "GroupEventAttachments" */ 'app/views/organizationGroupDetails/groupEventAttachments'
  1244. )
  1245. }
  1246. component={errorHandler(LazyLoad)}
  1247. props={{
  1248. currentTab: TAB.ATTACHMENTS,
  1249. isEventRoute: false,
  1250. }}
  1251. />
  1252. <Route
  1253. path="/organizations/:orgId/issues/:groupId/similar/"
  1254. componentPromise={() =>
  1255. import(
  1256. /* webpackChunkName: "GroupSimilarIssues" */ 'app/views/organizationGroupDetails/groupSimilarIssues'
  1257. )
  1258. }
  1259. component={errorHandler(LazyLoad)}
  1260. props={{
  1261. currentTab: TAB.SIMILAR_ISSUES,
  1262. isEventRoute: false,
  1263. }}
  1264. />
  1265. <Route
  1266. path="/organizations/:orgId/issues/:groupId/merged/"
  1267. componentPromise={() =>
  1268. import(
  1269. /* webpackChunkName: "GroupMerged" */ 'app/views/organizationGroupDetails/groupMerged'
  1270. )
  1271. }
  1272. component={errorHandler(LazyLoad)}
  1273. props={{
  1274. currentTab: TAB.MERGED,
  1275. isEventRoute: false,
  1276. }}
  1277. />
  1278. <Route path="/organizations/:orgId/issues/:groupId/events/:eventId/">
  1279. <IndexRoute
  1280. componentPromise={() =>
  1281. import(
  1282. /* webpackChunkName: "GroupEventDetails" */ 'app/views/organizationGroupDetails/groupEventDetails'
  1283. )
  1284. }
  1285. component={errorHandler(LazyLoad)}
  1286. props={{
  1287. currentTab: TAB.DETAILS,
  1288. isEventRoute: true,
  1289. }}
  1290. />
  1291. <Route
  1292. path="activity/"
  1293. componentPromise={() =>
  1294. import(
  1295. /* webpackChunkName: "GroupActivity" */ 'app/views/organizationGroupDetails/groupActivity'
  1296. )
  1297. }
  1298. component={errorHandler(LazyLoad)}
  1299. props={{
  1300. currentTab: TAB.ACTIVITY,
  1301. isEventRoute: true,
  1302. }}
  1303. />
  1304. <Route
  1305. path="events/"
  1306. componentPromise={() =>
  1307. import(
  1308. /* webpackChunkName: "GroupEvents" */ 'app/views/organizationGroupDetails/groupEvents'
  1309. )
  1310. }
  1311. component={errorHandler(LazyLoad)}
  1312. props={{
  1313. currentTab: TAB.EVENTS,
  1314. isEventRoute: true,
  1315. }}
  1316. />
  1317. <Route
  1318. path="similar/"
  1319. componentPromise={() =>
  1320. import(
  1321. /* webpackChunkName: "GroupSimilarIssues" */ 'app/views/organizationGroupDetails/groupSimilarIssues'
  1322. )
  1323. }
  1324. component={errorHandler(LazyLoad)}
  1325. props={{
  1326. currentTab: TAB.SIMILAR_ISSUES,
  1327. isEventRoute: true,
  1328. }}
  1329. />
  1330. <Route
  1331. path="tags/"
  1332. componentPromise={() =>
  1333. import(
  1334. /* webpackChunkName: "GroupTags" */ 'app/views/organizationGroupDetails/groupTags'
  1335. )
  1336. }
  1337. component={errorHandler(LazyLoad)}
  1338. props={{
  1339. currentTab: TAB.TAGS,
  1340. isEventRoute: true,
  1341. }}
  1342. />
  1343. <Route
  1344. path="tags/:tagKey/"
  1345. componentPromise={() =>
  1346. import(
  1347. /* webpackChunkName: "GroupTagsValues" */ 'app/views/organizationGroupDetails/groupTagValues'
  1348. )
  1349. }
  1350. component={errorHandler(LazyLoad)}
  1351. props={{
  1352. currentTab: TAB.TAGS,
  1353. isEventRoute: true,
  1354. }}
  1355. />
  1356. <Route
  1357. path="feedback/"
  1358. componentPromise={() =>
  1359. import(
  1360. /* webpackChunkName: "GroupUserFeedback" */ 'app/views/organizationGroupDetails/groupUserFeedback'
  1361. )
  1362. }
  1363. component={errorHandler(LazyLoad)}
  1364. props={{
  1365. currentTab: TAB.USER_FEEDBACK,
  1366. isEventRoute: true,
  1367. }}
  1368. />
  1369. <Route
  1370. path="attachments/"
  1371. componentPromise={() =>
  1372. import(
  1373. /* webpackChunkName: "GroupEventAttachments" */ 'app/views/organizationGroupDetails/groupEventAttachments'
  1374. )
  1375. }
  1376. component={errorHandler(LazyLoad)}
  1377. props={{
  1378. currentTab: TAB.ATTACHMENTS,
  1379. isEventRoute: true,
  1380. }}
  1381. />
  1382. <Route
  1383. path="merged/"
  1384. componentPromise={() =>
  1385. import(
  1386. /* webpackChunkName: "GroupMerged" */ 'app/views/organizationGroupDetails/groupMerged'
  1387. )
  1388. }
  1389. component={errorHandler(LazyLoad)}
  1390. props={{
  1391. currentTab: TAB.MERGED,
  1392. isEventRoute: true,
  1393. }}
  1394. />
  1395. </Route>
  1396. </Route>
  1397. <Route
  1398. path="/organizations/:orgId/alerts/"
  1399. componentPromise={() =>
  1400. import(/* webpackChunkName: "AlertsContainer" */ 'app/views/alerts')
  1401. }
  1402. component={errorHandler(LazyLoad)}
  1403. >
  1404. <IndexRoute
  1405. componentPromise={() =>
  1406. import(/* webpackChunkName: "AlertsList" */ 'app/views/alerts/list')
  1407. }
  1408. component={errorHandler(LazyLoad)}
  1409. />
  1410. <Route
  1411. path="rules/details/:ruleId/"
  1412. name="Alert Rule Details"
  1413. component={errorHandler(LazyLoad)}
  1414. componentPromise={() =>
  1415. import(
  1416. /* webpackChunkName: "AlertRulesDetails" */ 'app/views/alerts/rules/details'
  1417. )
  1418. }
  1419. />
  1420. <Route path="rules/">
  1421. <IndexRoute
  1422. component={errorHandler(LazyLoad)}
  1423. componentPromise={() =>
  1424. import(/* webpackChunkName: "AlertsDetails" */ 'app/views/alerts/rules')
  1425. }
  1426. />
  1427. <Route
  1428. path=":projectId/"
  1429. componentPromise={() =>
  1430. import(
  1431. /* webpackChunkName: "AlertsProjectProvider" */ 'app/views/alerts/builder/projectProvider'
  1432. )
  1433. }
  1434. component={errorHandler(LazyLoad)}
  1435. >
  1436. <IndexRedirect to="/organizations/:orgId/alerts/rules/" />
  1437. <Route
  1438. path=":ruleId/"
  1439. name="Edit Alert Rule"
  1440. componentPromise={() =>
  1441. import(
  1442. /* webpackChunkName: "ProjectAlertsEdit" */ 'app/views/settings/projectAlerts/edit'
  1443. )
  1444. }
  1445. component={errorHandler(LazyLoad)}
  1446. />
  1447. </Route>
  1448. </Route>
  1449. <Route path="metric-rules/">
  1450. <IndexRedirect to="/organizations/:orgId/alerts/rules/" />
  1451. <Route
  1452. path=":projectId/"
  1453. componentPromise={() =>
  1454. import(
  1455. /* webpackChunkName: "AlertsProjectProvider" */ 'app/views/alerts/builder/projectProvider'
  1456. )
  1457. }
  1458. component={errorHandler(LazyLoad)}
  1459. >
  1460. <IndexRedirect to="/organizations/:orgId/alerts/rules/" />
  1461. <Route
  1462. path=":ruleId/"
  1463. name="Edit Alert Rule"
  1464. componentPromise={() =>
  1465. import(
  1466. /* webpackChunkName: "ProjectAlertsEdit" */ 'app/views/settings/projectAlerts/edit'
  1467. )
  1468. }
  1469. component={errorHandler(LazyLoad)}
  1470. />
  1471. </Route>
  1472. </Route>
  1473. <Route
  1474. path="rules/"
  1475. componentPromise={() =>
  1476. import(/* webpackChunkName: "AlertsDetails" */ 'app/views/alerts/rules')
  1477. }
  1478. component={errorHandler(LazyLoad)}
  1479. />
  1480. <Route
  1481. path=":alertId/"
  1482. componentPromise={() =>
  1483. import(/* webpackChunkName: "AlertsDetails" */ 'app/views/alerts/details')
  1484. }
  1485. component={errorHandler(LazyLoad)}
  1486. />
  1487. <Route
  1488. path=":projectId/"
  1489. componentPromise={() =>
  1490. import(
  1491. /* webpackChunkName: "AlertsProjectProvider" */ 'app/views/alerts/builder/projectProvider'
  1492. )
  1493. }
  1494. component={errorHandler(LazyLoad)}
  1495. >
  1496. <Route
  1497. path="new/"
  1498. name="New Alert Rule"
  1499. component={errorHandler(LazyLoad)}
  1500. componentPromise={() =>
  1501. import(
  1502. /* webpackChunkName: "ProjectAlertsCreate" */ 'app/views/settings/projectAlerts/create'
  1503. )
  1504. }
  1505. />
  1506. <Route
  1507. path="wizard/"
  1508. name="Alert Creation Wizard"
  1509. component={errorHandler(LazyLoad)}
  1510. componentPromise={() =>
  1511. import(
  1512. /* webpackChunkName: "ProjectAlertsWizard" */ 'app/views/alerts/wizard'
  1513. )
  1514. }
  1515. />
  1516. </Route>
  1517. </Route>
  1518. <Route
  1519. path="/organizations/:orgId/monitors/"
  1520. componentPromise={() =>
  1521. import(/* webpackChunkName: "MonitorsContainer" */ 'app/views/monitors')
  1522. }
  1523. component={errorHandler(LazyLoad)}
  1524. >
  1525. <IndexRoute
  1526. componentPromise={() =>
  1527. import(/* webpackChunkName: "Monitors" */ 'app/views/monitors/monitors')
  1528. }
  1529. component={errorHandler(LazyLoad)}
  1530. />
  1531. <Route
  1532. path="/organizations/:orgId/monitors/create/"
  1533. componentPromise={() =>
  1534. import(
  1535. /* webpackChunkName: "MonitorCreate" */ 'app/views/monitors/create'
  1536. )
  1537. }
  1538. component={errorHandler(LazyLoad)}
  1539. />
  1540. <Route
  1541. path="/organizations/:orgId/monitors/:monitorId/"
  1542. componentPromise={() =>
  1543. import(
  1544. /* webpackChunkName: "MonitorDetails" */ 'app/views/monitors/details'
  1545. )
  1546. }
  1547. component={errorHandler(LazyLoad)}
  1548. />
  1549. <Route
  1550. path="/organizations/:orgId/monitors/:monitorId/edit/"
  1551. componentPromise={() =>
  1552. import(/* webpackChunkName: "MonitorEdit" */ 'app/views/monitors/edit')
  1553. }
  1554. component={errorHandler(LazyLoad)}
  1555. />
  1556. </Route>
  1557. <Route
  1558. path="/organizations/:orgId/releases/"
  1559. componentPromise={() =>
  1560. import(/* webpackChunkName: "ReleasesContainer" */ 'app/views/releases')
  1561. }
  1562. component={errorHandler(LazyLoad)}
  1563. >
  1564. <IndexRoute
  1565. componentPromise={() =>
  1566. import(/* webpackChunkName: "ReleasesList" */ 'app/views/releases/list')
  1567. }
  1568. component={errorHandler(LazyLoad)}
  1569. />
  1570. <Route
  1571. path=":release/"
  1572. componentPromise={() =>
  1573. import(
  1574. /* webpackChunkName: "ReleasesDetail" */ 'app/views/releases/detail'
  1575. )
  1576. }
  1577. component={errorHandler(LazyLoad)}
  1578. >
  1579. <IndexRoute
  1580. componentPromise={() =>
  1581. import(
  1582. /* webpackChunkName: "ReleasesDetailOverview" */ 'app/views/releases/detail/overview'
  1583. )
  1584. }
  1585. component={errorHandler(LazyLoad)}
  1586. />
  1587. <Route
  1588. path="commits/"
  1589. componentPromise={() =>
  1590. import(
  1591. /* webpackChunkName: "ReleasesDetailCommits" */ 'app/views/releases/detail/commits'
  1592. )
  1593. }
  1594. component={errorHandler(LazyLoad)}
  1595. />
  1596. <Route
  1597. path="files-changed/"
  1598. componentPromise={() =>
  1599. import(
  1600. /* webpackChunkName: "ReleasesDetailFilesChanged" */ 'app/views/releases/detail/filesChanged'
  1601. )
  1602. }
  1603. component={errorHandler(LazyLoad)}
  1604. />
  1605. <Redirect
  1606. from="new-events/"
  1607. to="/organizations/:orgId/releases/:release/"
  1608. />
  1609. <Redirect
  1610. from="all-events/"
  1611. to="/organizations/:orgId/releases/:release/"
  1612. />
  1613. </Route>
  1614. </Route>
  1615. <Route
  1616. path="/organizations/:orgId/activity/"
  1617. componentPromise={() =>
  1618. import(
  1619. /* webpackChunkName: "OrganizationActivity" */ 'app/views/organizationActivity'
  1620. )
  1621. }
  1622. component={errorHandler(LazyLoad)}
  1623. />
  1624. <Route
  1625. path="/organizations/:orgId/stats/"
  1626. componentPromise={() =>
  1627. import(
  1628. /* webpackChunkName: "OrganizationStats" */ 'app/views/organizationStats'
  1629. )
  1630. }
  1631. component={errorHandler(LazyLoad)}
  1632. />
  1633. <Route
  1634. path="/organizations/:orgId/projects/:projectId/events/:eventId/"
  1635. component={errorHandler(ProjectEventRedirect)}
  1636. />
  1637. {/*
  1638. TODO(mark) Long term this /queries route should go away and /discover should be the
  1639. canoncial route for discover2. We have a redirect right now as /discover was for
  1640. discover 1 and most of the application is linking to /discover/queries and not /discover
  1641. */}
  1642. <Redirect
  1643. from="/organizations/:orgId/discover/"
  1644. to="/organizations/:orgId/discover/queries/"
  1645. />
  1646. <Route
  1647. path="/organizations/:orgId/discover/"
  1648. componentPromise={() =>
  1649. import(/* webpackChunkName: "DiscoverV2Container" */ 'app/views/eventsV2')
  1650. }
  1651. component={errorHandler(LazyLoad)}
  1652. >
  1653. <Route
  1654. path="queries/"
  1655. componentPromise={() =>
  1656. import(
  1657. /* webpackChunkName: "DiscoverV2Landing" */ 'app/views/eventsV2/landing'
  1658. )
  1659. }
  1660. component={errorHandler(LazyLoad)}
  1661. />
  1662. <Route
  1663. path="results/"
  1664. componentPromise={() =>
  1665. import(
  1666. /* webpackChunkName: "DiscoverV2Results" */ 'app/views/eventsV2/results'
  1667. )
  1668. }
  1669. component={errorHandler(LazyLoad)}
  1670. />
  1671. <Route
  1672. path=":eventSlug/"
  1673. componentPromise={() =>
  1674. import(
  1675. /* webpackChunkName: "DiscoverV2Details" */ 'app/views/eventsV2/eventDetails'
  1676. )
  1677. }
  1678. component={errorHandler(LazyLoad)}
  1679. />
  1680. </Route>
  1681. <Route
  1682. path="/organizations/:orgId/performance/"
  1683. componentPromise={() =>
  1684. import(
  1685. /* webpackChunkName: "PerformanceContainer" */ 'app/views/performance'
  1686. )
  1687. }
  1688. component={errorHandler(LazyLoad)}
  1689. >
  1690. <IndexRoute
  1691. componentPromise={() =>
  1692. import(
  1693. /* webpackChunkName: "PerformanceLanding" */ 'app/views/performance/landing'
  1694. )
  1695. }
  1696. component={errorHandler(LazyLoad)}
  1697. />
  1698. </Route>
  1699. <Route
  1700. path="/organizations/:orgId/performance/summary/"
  1701. componentPromise={() =>
  1702. import(
  1703. /* webpackChunkName: "PerformanceContainer" */ 'app/views/performance'
  1704. )
  1705. }
  1706. component={errorHandler(LazyLoad)}
  1707. >
  1708. <IndexRoute
  1709. componentPromise={() =>
  1710. import(
  1711. /* webpackChunkName: "PerformanceTransactionSummary" */ 'app/views/performance/transactionSummary'
  1712. )
  1713. }
  1714. component={errorHandler(LazyLoad)}
  1715. />
  1716. <Route
  1717. path="/organizations/:orgId/performance/summary/vitals/"
  1718. componentPromise={() =>
  1719. import(
  1720. /* webpackChunkName: "PerformanceTransactionVitals" */ 'app/views/performance/transactionVitals'
  1721. )
  1722. }
  1723. component={errorHandler(LazyLoad)}
  1724. />
  1725. </Route>
  1726. <Route
  1727. path="/organizations/:orgId/performance/vitaldetail/"
  1728. componentPromise={() =>
  1729. import(
  1730. /* webpackChunkName: "PerformanceContainer" */ 'app/views/performance'
  1731. )
  1732. }
  1733. component={errorHandler(LazyLoad)}
  1734. >
  1735. <IndexRoute
  1736. componentPromise={() =>
  1737. import(
  1738. /* webpackChunkName: "PerformanceVitalDetail" */ 'app/views/performance/vitalDetail'
  1739. )
  1740. }
  1741. component={errorHandler(LazyLoad)}
  1742. />
  1743. </Route>
  1744. <Route
  1745. path="/organizations/:orgId/performance/trace/:traceSlug/"
  1746. componentPromise={() =>
  1747. import(
  1748. /* webpackChunkName: "PerformanceContainer" */ 'app/views/performance'
  1749. )
  1750. }
  1751. component={errorHandler(LazyLoad)}
  1752. >
  1753. <IndexRoute
  1754. componentPromise={() =>
  1755. import(
  1756. /* webpackChunkName: "PerformanceTraceDetails" */ 'app/views/performance/traceDetails'
  1757. )
  1758. }
  1759. component={errorHandler(LazyLoad)}
  1760. />
  1761. </Route>
  1762. <Route
  1763. path="/organizations/:orgId/performance/:eventSlug/"
  1764. componentPromise={() =>
  1765. import(
  1766. /* webpackChunkName: "PerformanceContainer" */ 'app/views/performance'
  1767. )
  1768. }
  1769. component={errorHandler(LazyLoad)}
  1770. >
  1771. <IndexRoute
  1772. componentPromise={() =>
  1773. import(
  1774. /* webpackChunkName: "PerformanceTransactionDetails" */ 'app/views/performance/transactionDetails'
  1775. )
  1776. }
  1777. component={errorHandler(LazyLoad)}
  1778. />
  1779. </Route>
  1780. <Route
  1781. path="/organizations/:orgId/performance/compare/:baselineEventSlug/:regressionEventSlug/"
  1782. componentPromise={() =>
  1783. import(
  1784. /* webpackChunkName: "PerformanceContainer" */ 'app/views/performance'
  1785. )
  1786. }
  1787. component={errorHandler(LazyLoad)}
  1788. >
  1789. <IndexRoute
  1790. componentPromise={() =>
  1791. import(
  1792. /* webpackChunkName: "PerformanceCompareTransactions" */ 'app/views/performance/compare'
  1793. )
  1794. }
  1795. component={errorHandler(LazyLoad)}
  1796. />
  1797. </Route>
  1798. <Route
  1799. path="/organizations/:orgId/dashboards/:dashboardId/"
  1800. componentPromise={() =>
  1801. import(/* webpackChunkName: "DashboardsV2" */ 'app/views/dashboardsV2')
  1802. }
  1803. component={errorHandler(LazyLoad)}
  1804. >
  1805. <Route
  1806. path="widget/new/"
  1807. componentPromise={() =>
  1808. import(
  1809. /* webpackChunkName: "WidgetNew" */ 'app/views/dashboardsV2/widget/new'
  1810. )
  1811. }
  1812. component={errorHandler(LazyLoad)}
  1813. />
  1814. </Route>
  1815. {/* Admin/manage routes */}
  1816. <Route
  1817. name="Admin"
  1818. path="/manage/"
  1819. componentPromise={() =>
  1820. import(/* webpackChunkName: "AdminLayout" */ 'app/views/admin/adminLayout')
  1821. }
  1822. component={errorHandler(LazyLoad)}
  1823. >
  1824. <IndexRoute
  1825. componentPromise={() =>
  1826. import(
  1827. /* webpackChunkName: "AdminOverview" */ 'app/views/admin/adminOverview'
  1828. )
  1829. }
  1830. component={errorHandler(LazyLoad)}
  1831. />
  1832. <Route
  1833. name="Buffer"
  1834. path="buffer/"
  1835. componentPromise={() =>
  1836. import(
  1837. /* webpackChunkName: "AdminBuffer" */ 'app/views/admin/adminBuffer'
  1838. )
  1839. }
  1840. component={errorHandler(LazyLoad)}
  1841. />
  1842. <Route
  1843. name="Relays"
  1844. path="relays/"
  1845. componentPromise={() =>
  1846. import(
  1847. /* webpackChunkName: "AdminRelays" */ 'app/views/admin/adminRelays'
  1848. )
  1849. }
  1850. component={errorHandler(LazyLoad)}
  1851. />
  1852. <Route
  1853. name="Organizations"
  1854. path="organizations/"
  1855. componentPromise={() =>
  1856. import(
  1857. /* webpackChunkName: "AdminOrganizations" */ 'app/views/admin/adminOrganizations'
  1858. )
  1859. }
  1860. component={errorHandler(LazyLoad)}
  1861. />
  1862. <Route
  1863. name="Projects"
  1864. path="projects/"
  1865. componentPromise={() =>
  1866. import(
  1867. /* webpackChunkName: "AdminProjects" */ 'app/views/admin/adminProjects'
  1868. )
  1869. }
  1870. component={errorHandler(LazyLoad)}
  1871. />
  1872. <Route
  1873. name="Queue"
  1874. path="queue/"
  1875. componentPromise={() =>
  1876. import(/* webpackChunkName: "AdminQueue" */ 'app/views/admin/adminQueue')
  1877. }
  1878. component={errorHandler(LazyLoad)}
  1879. />
  1880. <Route
  1881. name="Quotas"
  1882. path="quotas/"
  1883. componentPromise={() =>
  1884. import(
  1885. /* webpackChunkName: "AdminQuotas" */ 'app/views/admin/adminQuotas'
  1886. )
  1887. }
  1888. component={errorHandler(LazyLoad)}
  1889. />
  1890. <Route
  1891. name="Settings"
  1892. path="settings/"
  1893. componentPromise={() =>
  1894. import(
  1895. /* webpackChunkName: "AdminSettings" */ 'app/views/admin/adminSettings'
  1896. )
  1897. }
  1898. component={errorHandler(LazyLoad)}
  1899. />
  1900. <Route name="Users" path="users/">
  1901. <IndexRoute
  1902. componentPromise={() =>
  1903. import(
  1904. /* webpackChunkName: "AdminUsers" */ 'app/views/admin/adminUsers'
  1905. )
  1906. }
  1907. component={errorHandler(LazyLoad)}
  1908. />
  1909. <Route
  1910. path=":id"
  1911. componentPromise={() =>
  1912. import(
  1913. /* webpackChunkName: "AdminUserEdit" */ 'app/views/admin/adminUserEdit'
  1914. )
  1915. }
  1916. component={errorHandler(LazyLoad)}
  1917. />
  1918. </Route>
  1919. <Route
  1920. name="Mail"
  1921. path="status/mail/"
  1922. componentPromise={() =>
  1923. import(/* webpackChunkName: "AdminMail" */ 'app/views/admin/adminMail')
  1924. }
  1925. component={errorHandler(LazyLoad)}
  1926. />
  1927. <Route
  1928. name="Environment"
  1929. path="status/environment/"
  1930. componentPromise={() =>
  1931. import(
  1932. /* webpackChunkName: "AdminEnvironment" */ 'app/views/admin/adminEnvironment'
  1933. )
  1934. }
  1935. component={errorHandler(LazyLoad)}
  1936. />
  1937. <Route
  1938. name="Packages"
  1939. path="status/packages/"
  1940. componentPromise={() =>
  1941. import(
  1942. /* webpackChunkName: "AdminPackages" */ 'app/views/admin/adminPackages'
  1943. )
  1944. }
  1945. component={errorHandler(LazyLoad)}
  1946. />
  1947. <Route
  1948. name="Warnings"
  1949. path="status/warnings/"
  1950. componentPromise={() =>
  1951. import(
  1952. /* webpackChunkName: "AdminWarnings" */ 'app/views/admin/adminWarnings'
  1953. )
  1954. }
  1955. component={errorHandler(LazyLoad)}
  1956. />
  1957. {hook('routes:admin')}
  1958. </Route>
  1959. </Route>
  1960. {/* The heavyweight organization detail views */}
  1961. <Route path="/:orgId/" component={errorHandler(OrganizationDetails)}>
  1962. <Route component={errorHandler(OrganizationRoot)}>
  1963. {hook('routes:organization-root')}
  1964. <Route
  1965. path="/organizations/:orgId/projects/:projectId/getting-started/"
  1966. componentPromise={() =>
  1967. import(
  1968. /* webpackChunkName: "ProjectGettingStarted" */ 'app/views/projectInstall/gettingStarted'
  1969. )
  1970. }
  1971. component={errorHandler(LazyLoad)}
  1972. >
  1973. <IndexRoute
  1974. componentPromise={() =>
  1975. import(
  1976. /* webpackChunkName: "ProjectInstallOverview" */ 'app/views/projectInstall/overview'
  1977. )
  1978. }
  1979. component={errorHandler(LazyLoad)}
  1980. />
  1981. <Route
  1982. path=":platform/"
  1983. componentPromise={() =>
  1984. import(
  1985. /* webpackChunkName: "PlatformOrIntegration" */ 'app/views/projectInstall/platformOrIntegration'
  1986. )
  1987. }
  1988. component={errorHandler(LazyLoad)}
  1989. />
  1990. </Route>
  1991. <Route
  1992. path="/organizations/:orgId/teams/new/"
  1993. componentPromise={() =>
  1994. import(/* webpackChunkName: "TeamCreate" */ 'app/views/teamCreate')
  1995. }
  1996. component={errorHandler(LazyLoad)}
  1997. />
  1998. <Route path="/organizations/:orgId/">
  1999. {hook('routes:organization')}
  2000. <Redirect
  2001. from="/organizations/:orgId/teams/"
  2002. to="/settings/:orgId/teams/"
  2003. />
  2004. <Redirect
  2005. from="/organizations/:orgId/teams/your-teams/"
  2006. to="/settings/:orgId/teams/"
  2007. />
  2008. <Redirect
  2009. from="/organizations/:orgId/teams/all-teams/"
  2010. to="/settings/:orgId/teams/"
  2011. />
  2012. <Redirect
  2013. from="/organizations/:orgId/teams/:teamId/"
  2014. to="/settings/:orgId/teams/:teamId/"
  2015. />
  2016. <Redirect
  2017. from="/organizations/:orgId/teams/:teamId/members/"
  2018. to="/settings/:orgId/teams/:teamId/members/"
  2019. />
  2020. <Redirect
  2021. from="/organizations/:orgId/teams/:teamId/projects/"
  2022. to="/settings/:orgId/teams/:teamId/projects/"
  2023. />
  2024. <Redirect
  2025. from="/organizations/:orgId/teams/:teamId/settings/"
  2026. to="/settings/:orgId/teams/:teamId/settings/"
  2027. />
  2028. <Redirect from="/organizations/:orgId/settings/" to="/settings/:orgId/" />
  2029. <Redirect
  2030. from="/organizations/:orgId/api-keys/"
  2031. to="/settings/:orgId/api-keys/"
  2032. />
  2033. <Redirect
  2034. from="/organizations/:orgId/api-keys/:apiKey/"
  2035. to="/settings/:orgId/api-keys/:apiKey/"
  2036. />
  2037. <Redirect
  2038. from="/organizations/:orgId/members/"
  2039. to="/settings/:orgId/members/"
  2040. />
  2041. <Redirect
  2042. from="/organizations/:orgId/members/:memberId/"
  2043. to="/settings/:orgId/members/:memberId/"
  2044. />
  2045. <Redirect
  2046. from="/organizations/:orgId/rate-limits/"
  2047. to="/settings/:orgId/rate-limits/"
  2048. />
  2049. <Redirect
  2050. from="/organizations/:orgId/repos/"
  2051. to="/settings/:orgId/repos/"
  2052. />
  2053. </Route>
  2054. <Route
  2055. path="/organizations/:orgId/projects/new/"
  2056. componentPromise={() =>
  2057. import(
  2058. /* webpackChunkName: "NewProject" */ 'app/views/projectInstall/newProject'
  2059. )
  2060. }
  2061. component={errorHandler(LazyLoad)}
  2062. />
  2063. </Route>
  2064. <Route
  2065. path=":projectId/getting-started/"
  2066. componentPromise={() =>
  2067. import(
  2068. /* webpackChunkName: "ProjectGettingStarted" */ 'app/views/projectInstall/gettingStarted'
  2069. )
  2070. }
  2071. component={errorHandler(LazyLoad)}
  2072. >
  2073. <IndexRoute
  2074. componentPromise={() =>
  2075. import(
  2076. /* webpackChunkName: "ProjectInstallOverview" */ 'app/views/projectInstall/overview'
  2077. )
  2078. }
  2079. component={errorHandler(LazyLoad)}
  2080. />
  2081. <Route
  2082. path=":platform/"
  2083. componentPromise={() =>
  2084. import(
  2085. /* webpackChunkName: "PlatformOrIntegration" */ 'app/views/projectInstall/platformOrIntegration'
  2086. )
  2087. }
  2088. component={errorHandler(LazyLoad)}
  2089. />
  2090. </Route>
  2091. </Route>
  2092. {/* A route tree for lightweight organizational detail views.
  2093. This is strictly for deprecated URLs that we need to maintain */}
  2094. <Route component={errorHandler(LightWeightOrganizationDetails)}>
  2095. {/* This is in the bottom lightweight group because "/organizations/:orgId/projects/new/" in heavyweight needs to be matched first */}
  2096. <Route
  2097. path="/organizations/:orgId/projects/:projectId/"
  2098. componentPromise={() =>
  2099. import(/* webpackChunkName: "ProjectDetail" */ 'app/views/projectDetail')
  2100. }
  2101. component={errorHandler(LazyLoad)}
  2102. />
  2103. <Route name="Organization" path="/:orgId/">
  2104. <Route path=":projectId/">
  2105. {/* Support for deprecated URLs (pre-Sentry 10). We just redirect users to new canonical URLs. */}
  2106. <IndexRoute
  2107. component={errorHandler(
  2108. redirectDeprecatedProjectRoute(
  2109. ({orgId, projectId}) =>
  2110. `/organizations/${orgId}/issues/?project=${projectId}`
  2111. )
  2112. )}
  2113. />
  2114. <Route
  2115. path="issues/"
  2116. component={errorHandler(
  2117. redirectDeprecatedProjectRoute(
  2118. ({orgId, projectId}) =>
  2119. `/organizations/${orgId}/issues/?project=${projectId}`
  2120. )
  2121. )}
  2122. />
  2123. <Route
  2124. path="dashboard/"
  2125. component={errorHandler(
  2126. redirectDeprecatedProjectRoute(
  2127. ({orgId, projectId}) =>
  2128. `/organizations/${orgId}/dashboards/?project=${projectId}`
  2129. )
  2130. )}
  2131. />
  2132. <Route
  2133. path="user-feedback/"
  2134. component={errorHandler(
  2135. redirectDeprecatedProjectRoute(
  2136. ({orgId, projectId}) =>
  2137. `/organizations/${orgId}/user-feedback/?project=${projectId}`
  2138. )
  2139. )}
  2140. />
  2141. <Route
  2142. path="releases/"
  2143. component={errorHandler(
  2144. redirectDeprecatedProjectRoute(
  2145. ({orgId, projectId}) =>
  2146. `/organizations/${orgId}/releases/?project=${projectId}`
  2147. )
  2148. )}
  2149. />
  2150. <Route
  2151. path="releases/:version/"
  2152. component={errorHandler(
  2153. redirectDeprecatedProjectRoute(
  2154. ({orgId, projectId, router}) =>
  2155. `/organizations/${orgId}/releases/${router.params.version}/?project=${projectId}`
  2156. )
  2157. )}
  2158. />
  2159. <Route
  2160. path="releases/:version/new-events/"
  2161. component={errorHandler(
  2162. redirectDeprecatedProjectRoute(
  2163. ({orgId, projectId, router}) =>
  2164. `/organizations/${orgId}/releases/${router.params.version}/new-events/?project=${projectId}`
  2165. )
  2166. )}
  2167. />
  2168. <Route
  2169. path="releases/:version/all-events/"
  2170. component={errorHandler(
  2171. redirectDeprecatedProjectRoute(
  2172. ({orgId, projectId, router}) =>
  2173. `/organizations/${orgId}/releases/${router.params.version}/all-events/?project=${projectId}`
  2174. )
  2175. )}
  2176. />
  2177. <Route
  2178. path="releases/:version/commits/"
  2179. component={errorHandler(
  2180. redirectDeprecatedProjectRoute(
  2181. ({orgId, projectId, router}) =>
  2182. `/organizations/${orgId}/releases/${router.params.version}/commits/?project=${projectId}`
  2183. )
  2184. )}
  2185. />
  2186. </Route>
  2187. </Route>
  2188. </Route>
  2189. <Route path="/:orgId/">
  2190. <Route path=":projectId/settings/">
  2191. <Redirect from="teams/" to="/settings/:orgId/projects/:projectId/teams/" />
  2192. <Redirect from="alerts/" to="/settings/:orgId/projects/:projectId/alerts/" />
  2193. <Redirect
  2194. from="alerts/rules/"
  2195. to="/settings/:orgId/projects/:projectId/alerts/rules/"
  2196. />
  2197. <Redirect
  2198. from="alerts/rules/new/"
  2199. to="/settings/:orgId/projects/:projectId/alerts/rules/new/"
  2200. />
  2201. <Redirect
  2202. from="alerts/rules/:ruleId/"
  2203. to="/settings/:orgId/projects/:projectId/alerts/rules/:ruleId/"
  2204. />
  2205. <Redirect
  2206. from="environments/"
  2207. to="/settings/:orgId/projects/:projectId/environments/"
  2208. />
  2209. <Redirect
  2210. from="environments/hidden/"
  2211. to="/settings/:orgId/projects/:projectId/environments/hidden/"
  2212. />
  2213. <Redirect
  2214. from="tags/"
  2215. to="/settings/projects/:orgId/projects/:projectId/tags/"
  2216. />
  2217. <Redirect
  2218. from="issue-tracking/"
  2219. to="/settings/:orgId/projects/:projectId/issue-tracking/"
  2220. />
  2221. <Redirect
  2222. from="release-tracking/"
  2223. to="/settings/:orgId/projects/:projectId/release-tracking/"
  2224. />
  2225. <Redirect
  2226. from="ownership/"
  2227. to="/settings/:orgId/projects/:projectId/ownership/"
  2228. />
  2229. <Redirect
  2230. from="data-forwarding/"
  2231. to="/settings/:orgId/projects/:projectId/data-forwarding/"
  2232. />
  2233. <Redirect
  2234. from="debug-symbols/"
  2235. to="/settings/:orgId/projects/:projectId/debug-symbols/"
  2236. />
  2237. <Redirect
  2238. from="processing-issues/"
  2239. to="/settings/:orgId/projects/:projectId/processing-issues/"
  2240. />
  2241. <Redirect
  2242. from="filters/"
  2243. to="/settings/:orgId/projects/:projectId/filters/"
  2244. />
  2245. <Redirect from="hooks/" to="/settings/:orgId/projects/:projectId/hooks/" />
  2246. <Redirect from="keys/" to="/settings/:orgId/projects/:projectId/keys/" />
  2247. <Redirect
  2248. from="keys/:keyId/"
  2249. to="/settings/:orgId/projects/:projectId/keys/:keyId/"
  2250. />
  2251. <Redirect
  2252. from="user-feedback/"
  2253. to="/settings/:orgId/projects/:projectId/user-feedback/"
  2254. />
  2255. <Redirect
  2256. from="security-headers/"
  2257. to="/settings/:orgId/projects/:projectId/security-headers/"
  2258. />
  2259. <Redirect
  2260. from="security-headers/csp/"
  2261. to="/settings/:orgId/projects/:projectId/security-headers/csp/"
  2262. />
  2263. <Redirect
  2264. from="security-headers/expect-ct/"
  2265. to="/settings/:orgId/projects/:projectId/security-headers/expect-ct/"
  2266. />
  2267. <Redirect
  2268. from="security-headers/hpkp/"
  2269. to="/settings/:orgId/projects/:projectId/security-headers/hpkp/"
  2270. />
  2271. <Redirect
  2272. from="plugins/"
  2273. to="/settings/:orgId/projects/:projectId/plugins/"
  2274. />
  2275. <Redirect
  2276. from="plugins/:pluginId/"
  2277. to="/settings/:orgId/projects/:projectId/plugins/:pluginId/"
  2278. />
  2279. <Redirect
  2280. from="integrations/:providerKey/"
  2281. to="/settings/:orgId/projects/:projectId/integrations/:providerKey/"
  2282. />
  2283. <Redirect
  2284. from="install/"
  2285. to="/settings/:orgId/projects/:projectId/install/"
  2286. />
  2287. <Redirect
  2288. from="install/:platform'"
  2289. to="/settings/:orgId/projects/:projectId/install/:platform/"
  2290. />
  2291. </Route>
  2292. <Redirect from=":projectId/group/:groupId/" to="issues/:groupId/" />
  2293. <Redirect
  2294. from=":projectId/issues/:groupId/"
  2295. to="/organizations/:orgId/issues/:groupId/"
  2296. />
  2297. <Redirect
  2298. from=":projectId/issues/:groupId/events/"
  2299. to="/organizations/:orgId/issues/:groupId/events/"
  2300. />
  2301. <Redirect
  2302. from=":projectId/issues/:groupId/events/:eventId/"
  2303. to="/organizations/:orgId/issues/:groupId/events/:eventId/"
  2304. />
  2305. <Redirect
  2306. from=":projectId/issues/:groupId/tags/"
  2307. to="/organizations/:orgId/issues/:groupId/tags/"
  2308. />
  2309. <Redirect
  2310. from=":projectId/issues/:groupId/tags/:tagKey/"
  2311. to="/organizations/:orgId/issues/:groupId/tags/:tagKey/"
  2312. />
  2313. <Redirect
  2314. from=":projectId/issues/:groupId/feedback/"
  2315. to="/organizations/:orgId/issues/:groupId/feedback/"
  2316. />
  2317. <Redirect
  2318. from=":projectId/issues/:groupId/similar/"
  2319. to="/organizations/:orgId/issues/:groupId/similar/"
  2320. />
  2321. <Redirect
  2322. from=":projectId/issues/:groupId/merged/"
  2323. to="/organizations/:orgId/issues/:groupId/merged/"
  2324. />
  2325. <Route
  2326. path=":projectId/events/:eventId/"
  2327. component={errorHandler(ProjectEventRedirect)}
  2328. />
  2329. </Route>
  2330. {hook('routes')}
  2331. <Route
  2332. path="*"
  2333. component={errorHandler(RouteNotFound)}
  2334. onEnter={appendTrailingSlash}
  2335. />
  2336. </Route>
  2337. </Route>
  2338. );
  2339. }
  2340. export default routes;