Skip to content

Commit 1009db3

Browse files
authored
Merge pull request #2437 from bugsnag/PLAT-13698-metadata-delegate
Convert @bugsnag/core/lib/metadata-delegate to TypeScript
2 parents b3d5c1d + 45ef2af commit 1009db3

7 files changed

Lines changed: 78 additions & 68 deletions

File tree

packages/core/package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
"./lib/es-utils/reduce": "./src/lib/es-utils/reduce.js",
1616
"./lib/es-utils/keys": "./src/lib/es-utils/keys.js",
1717
"./lib/derecursify": "./src/lib/derecursify.js",
18-
"./lib/metadata-delegate": "./src/lib/metadata-delegate.js",
1918
"./lib/callback-runner": "./src/lib/callback-runner.js",
2019
"./lib/path-normalizer": "./src/lib/path-normalizer.js",
2120
"./lib/validators/string-with-length": "./src/lib/validators/string-with-length.js",

packages/core/src/client.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -116,15 +116,15 @@ export default class Client<T extends Config = Config> {
116116
}
117117
}
118118

119-
addMetadata (section: string, keyOrObj: any, maybeVal?: any) {
119+
addMetadata (section: string, keyOrObj: object | string, maybeVal?: any) {
120120
return metadataDelegate.add(this._metadata, section, keyOrObj, maybeVal)
121121
}
122122

123-
getMetadata (section: string, key?: any) {
123+
getMetadata (section: string, key?: string) {
124124
return metadataDelegate.get(this._metadata, section, key)
125125
}
126126

127-
clearMetadata (section: string, key?: any) {
127+
clearMetadata (section: string, key?: string) {
128128
return metadataDelegate.clear(this._metadata, section, key)
129129
}
130130

packages/core/src/event.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ export default class Event {
8585
/* this.attemptImmediateDelivery, default: true */
8686
}
8787

88-
addMetadata (section: string, keyOrObj?: any, maybeVal?: any) {
88+
addMetadata (section: string, keyOrObj?: object | string, maybeVal?: any) {
8989
return metadataDelegate.add(this._metadata, section, keyOrObj, maybeVal)
9090
}
9191

packages/core/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ export { default as cloneClient } from './lib/clone-client'
77
export { default as jsonPayload } from './lib/json-payload'
88
export { default as intRange } from './lib/validators/int-range'
99
export { default as isError } from './lib/iserror'
10+
export { default as metadataDelegate } from './lib/metadata-delegate'
1011
export { default as nodeFallbackStack } from './lib/node-fallback-stack'
1112
export { default as runSyncCallbacks } from './lib/sync-callback-runner'
1213

packages/core/src/lib/metadata-delegate.js

Lines changed: 0 additions & 60 deletions
This file was deleted.
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import assign from './es-utils/assign'
2+
3+
interface MetadataDelegate {
4+
add: (state: { [key: string]: any }, section: string, keyOrObj?: object | string, maybeVal?: any) => any
5+
get: (state: { [key: string]: any }, section: string, key?: string) => any
6+
clear: (state: { [key: string]: any }, section: string, key?: string) => any
7+
}
8+
9+
const metadataDelegate: MetadataDelegate = {
10+
add: (state, section, keyOrObj, maybeVal) => {
11+
if (!section) return
12+
let updates
13+
14+
// addMetadata("section", null) -> clears section
15+
if (keyOrObj === null) return metadataDelegate.clear(state, section);
16+
17+
// normalise the two supported input types into object form
18+
if (typeof keyOrObj === 'object') updates = keyOrObj
19+
if (typeof keyOrObj === 'string') updates = { [keyOrObj]: maybeVal }
20+
21+
// exit if we don't have an updates object at this point
22+
if (!updates) return
23+
24+
// preventing the __proto__ property from being used as a key
25+
if (section === '__proto__' || section === 'constructor' || section === 'prototype') {
26+
return
27+
}
28+
29+
// ensure a section with this name exists
30+
if (!state[section]) state[section] = {}
31+
32+
// merge the updates with the existing section
33+
state[section] = assign({}, state[section], updates)
34+
},
35+
36+
get: (state, section, key) => {
37+
if (typeof section !== 'string') return undefined
38+
if (!key) {
39+
return state[section]
40+
}
41+
if (state[section]) {
42+
return state[section][key]
43+
}
44+
return undefined
45+
},
46+
47+
clear: (state, section, key) => {
48+
if (typeof section !== 'string') return
49+
50+
// clear an entire section
51+
if (!key) {
52+
// eslint-disable-next-line @typescript-eslint/no-dynamic-delete
53+
delete state[section]
54+
return
55+
}
56+
57+
// preventing the __proto__ property from being used as a key
58+
if (section === '__proto__' || section === 'constructor' || section === 'prototype') {
59+
return
60+
}
61+
62+
// clear a single value from a section
63+
if (state[section]) {
64+
// eslint-disable-next-line @typescript-eslint/no-dynamic-delete
65+
delete state[section][key]
66+
}
67+
}
68+
}
69+
70+
export default metadataDelegate;

packages/core/test/metadata-delegate.test.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { add, clear } from '../src/lib/metadata-delegate'
1+
import metadataDelegate from '../src/lib/metadata-delegate'
22

33
// it doesn't seem easy or even impossible to check whether __proto__ keys can be overwritten
44
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/proto
@@ -17,7 +17,7 @@ describe('metadata delegate', () => {
1717
}
1818
])('should not add $key keys', ({ key, expected }) => {
1919
const state = {}
20-
add(state, key, 'foo', 'bar')
20+
metadataDelegate.add(state, key, "foo", "bar");
2121
expect(state).toEqual(expected)
2222
})
2323
})
@@ -51,7 +51,7 @@ describe('metadata delegate', () => {
5151
}
5252
}
5353
])('should not overwrite $key keys', ({ key, state, expected }) => {
54-
clear(state, key, 'foo')
54+
metadataDelegate.clear(state, key, "foo");
5555
expect(state).toEqual(expected)
5656
})
5757
})

0 commit comments

Comments
 (0)