-
-
Notifications
You must be signed in to change notification settings - Fork 1.6k
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
Typescript Core/Browser implementation #1149
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Seriously, awesome work Daniel! 🥇
Due to the size of this PR, I have a higher number of comments as well. Most of this is opinionated and or just minor stuff, but I'd like to discuss the bigger ones before this gets merged.
.vscode/settings.json
Outdated
@@ -0,0 +1,18 @@ | |||
{ | |||
"[typescript]": { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'd also add editor.rulers
and editor.tabSize
here.
packages/browser/package.json
Outdated
"clean": "rm -rf ./dist", | ||
"dist": "npm run clean && tsc -p tsconfig.json && npm run build-browser", | ||
"test": "npm run dist && jest --forceExit", | ||
"test:watch": "npm run dist && jest --watch --notify" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This doesn't really make sense as you have to re-run dist on changes, no?
packages/browser/package.json
Outdated
"engines": { | ||
"node": ">=6.9.5 <9.0.0", | ||
"npm": ">=3.10.7 <6.0.0", | ||
"yarn": ">=1.0.2 <2.0.0" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pinning npm and yarn this restrictively might cause pain once they release a new major version and there are no incompatibilities. Same goes for node - v9 and v10 are already in development and should actually work perfectly fine... Is there a specific reason you specify an upper bound?
packages/browser/__tests__/index.ts
Outdated
|
||
describe('Browser Interface', () => { | ||
test('sending a message', async done => { | ||
let countExcpects = 0; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Typo: countExpects
packages/browser/lib/Browser.ts
Outdated
|
||
constructor(client: Client, public options: IBrowserOptions = {}) { | ||
this.client = client; | ||
return this; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
No need to return this
here.
context[key] = value; | ||
} | ||
|
||
export function merge<T extends IContext, K extends keyof T>( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Just a suggestion: I'd call it mergeIn
, as merge
usually refers to shallow-merging all keys of two or more objects.
set(context, key, {}); | ||
} | ||
if (value === undefined) { | ||
delete context[key]; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Are you sure you want this behavior? Usually merge
or assign
functions as well as the object spread operator ignore sources that are falsy.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
So I took this merge function basically from raven-js and I guess we want to keep the same logic.
} | ||
|
||
export class SentryError implements Error { | ||
public name = 'SentryError'; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Isn't this implicitly defined if you extend Error
?
packages/core/package.json
Outdated
"test": "npm run dist && jest", | ||
"test:watch": "jest --watch --notify" | ||
}, | ||
"jest": { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
By default, jest applies the "jsdom"
environment which essentially polyfills some browser APIs. However, this means that even though your tests pass, the code might not run in an actual node process. However, since you want to run it in both the browser and node, it might make sense to run tests in both environments and use the --env
option to switch between them. If you don't want to do this, declare "testEnvironment": "node"
here as this is more of a common demeanor.
Example for running both (needs npm-run-all
as devDependency):
{
"dist": "npm run clean && tsc -p tsconfig.json",
"test:browser": "jest --env=jsdom",
"test:node": "jest --env=node",
"test": "npm-run-all dist test:browser test:node"
}
packages/browser/tsconfig.json
Outdated
], | ||
"lib": ["es2015", "dom"], | ||
"declaration": false, | ||
"allowJs": true, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@sentry/core
uses false
here. Purpose?
Note:
|
I don't know why but travis has a hard time with this PR |
🚀 it |
🎉 🎆 |
Proposal
This should become our Core for all our javascript related SDKs.
It's written in typescript to provide type safety BUT the javascript
API should also be easily human readable/usable.
You can take a look at
core/lib/Client.ts
for the implementation of the public API.Also
core/__tests__/client.ts
shows a way of how to use it.Structure
There is our core package called
@sentry/core
.@sentry/browser
is one adapter to use with the core.Currently it's just wrapping
raven-js
until we decide to rewrite it.Also, our
react-native
or the newCordova
SDK should build on this architecture.@sentry/core
@sentry/browser
@sentry/browser
package.json dependency.npmignore
to exclude packages fromraven-js