Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(typescript): Add TypeScript compatibility #13786

Merged
merged 44 commits into from
Jul 22, 2019
Merged

feat(typescript): Add TypeScript compatibility #13786

merged 44 commits into from
Jul 22, 2019

Conversation

HazAT
Copy link
Member

@HazAT HazAT commented Jun 24, 2019

This PR is intended to serve as a demonstration for how we could write TypeScript code in Sentry. It migrates the following code to TypeScript:

  • all Discover functionality
  • some utility functions

It depends on:

@dashed
Copy link
Member

dashed commented Jun 24, 2019

At the time of this message, Typescript doesn't support optional chaining proposal (https://github.com/tc39/proposal-optional-chaining), which is stage 2 microsoft/TypeScript#16 .

Some suggestions:

@dashed
Copy link
Member

dashed commented Jun 24, 2019

tslint is going to be deprecated:

@lynnagara lynnagara force-pushed the typescript branch 2 times, most recently from e38d0db to 289b539 Compare June 24, 2019 20:39
lynnagara added a commit that referenced this pull request Jun 24, 2019
Uses withConfig HoC instead of connecting to the ConfigStore directly

This is required for #13786
lynnagara added a commit that referenced this pull request Jun 24, 2019
.eslintrc.js Outdated
'@typescript-eslint/no-unused-vars': 'off',
},
},
],
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@typescript-eslint/no-unused-vars rule was causing issues for imported types. see: typescript-eslint/typescript-eslint#363

I've added this as per https://43081j.com/2019/02/using-eslint-with-typescript

.eslintrc.js Outdated
'@typescript-eslint/no-unused-vars': 'off',

// https://github.com/yannickcr/eslint-plugin-react/issues/2066
'react/sort-comp': 'warn',
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@dashed dashed added the WIP label Jun 25, 2019
lynnagara added a commit that referenced this pull request Jun 25, 2019
Uses withConfig HoC instead of connecting to the ConfigStore directly

This is required for #13786
lynnagara added a commit that referenced this pull request Jun 25, 2019
pull bot pushed a commit to Mattlk13/sentry-1 that referenced this pull request Jun 25, 2019
@lynnagara lynnagara force-pushed the typescript branch 2 times, most recently from 66506af to aac7d03 Compare June 25, 2019 20:01
const type = SPECIAL_TAGS[tags.tags_key] || 'string';
.filter((tag: TagData) => !HIDDEN_TAGS.includes(tag.tags_key))
.map((tag: TagData) => {
const type = SPECIAL_TAGS[tag.tags_key] || 'string';
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was a good bug, TypeScript made it immediately obvious

@@ -409,7 +429,6 @@ export default class OrganizationDiscover extends React.Component {
isFetchingQuery={isFetchingQuery}
onUpdateField={this.updateField}
onRunQuery={this.runQuery}
onReset={this.reset}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 for errors on unused props

@lynnagara lynnagara removed the WIP label Jun 28, 2019
@lynnagara lynnagara changed the title [WIP] feat: Add typescript compatibility feat(typescript): Add TypeScript compatibility Jun 28, 2019
"@babel/runtime": "^7.0.0",
"@sentry/browser": "^5.4.2",
"@sentry/integrations": "^5.4.2",
"@sentry/typescript": "^5.3.0",
"@types/lodash": "^4.14.134",
"@types/react-dom": "^16.8.4",
"@types/moment-timezone": "^0.5.12",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@HazAT Do you know if/why these need to be dependencies? Would be really nice to move these to devDependencies?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry for the late reply. I thought we need this since we do different stuff if you call
make develop or yarn install.
make develop apparently on installs dependencies whereby yarn install installs all.

So if you do a prod build it would fail because of missing types.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Gotcha, thanks for the explanation

Copy link
Member

@dashed dashed left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I took the liberty to rebase this branch against master, and looked through the PR.

Looks good to me 👍

@@ -6,7 +6,8 @@
"strict": true,
"declaration": false,
"declarationMap": false,
"allowJs": true,
"allowJs": false,
"noImplicitAny": false,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@HazAT @lynnagara There are issues with importing React components from *.jsx files, and I don't think redeclaring them as const FooBarAny: any = FooBar; is the right approach to migrate Sentry to TypeScript in the long-term.

Since this file is extending @sentry/typescript/tsconfig.json (https://github.com/getsentry/sentry-javascript/blob/5d670a7781b6e2144809c002e9332e2cc9dd239c/packages/typescript/tsconfig.json), I'm proposing to provide the following overrides that are specific for this project:

    "allowJs": false,
    "noImplicitAny": false,

The behavioural changes are as follows:

  • Setting allowJs to be false prevents the TypeScript engine from processing *.jsx files and as well as inferring types of imported js code. This resolves cryptic proptype type issues for React components sourced in *.jsx files .

  • The implications of disabling allowJs means that imported modules from *.jsx files are implied to have an any type. Hence, we need noImplicitAny to be false.

@lynnagara
Copy link
Member

Deployed to staging, everything looks fine

@lynnagara lynnagara merged commit 7823ddb into master Jul 22, 2019
@lynnagara lynnagara deleted the typescript branch July 22, 2019 19:19
HazAT added a commit that referenced this pull request Jul 23, 2019
* master: (25 commits)
  ref(onboarding): Fix install promprt URL (#14106)
  fix(app-platform): Allow GET requests for published apps (#14109)
  feat: Update Group.get_latest_event to use Snuba event (#14039)
  ref(onboarding): Rename wizardNew -> onboarding (#14104)
  feat(apm): Update props to address proptype warnings for new transaction attributes (SEN-800) (#14040)
  ref(ui): Move and codesplit `ProjectPlugins` (#13952)
  feat(typescript): Add TypeScript compatibility (#13786)
  ref(templates): Remove unused content block default (#14090)
  ref(less): Remove unused admin.less (#14097)
  ref(onobarding): Remove old onboarding experience (#14066)
  fix(ui) Fix missing conditions in tag bars (#14063)
  ref(suspect-commits): Add hook (#14057)
  ref(frontend): Segment frontend web urls (#14096)
  feat(suspect-commits): Add analytics events (#14080)
  feat(servicehooks): Update servicehook URLs (#14093)
  license: Remove license headers (#14095)
  ref(templates): Remove unused account_nav (#14091)
  fix: Disable transaction events in store (#14088)
  fix(InstallWizard): Fix exception when InstallWizard completed (#14092)
  ref(admin): Fix thrashing on stat charts (#14094)
  ...
@github-actions github-actions bot locked and limited conversation to collaborators Dec 20, 2020
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants