diff --git a/package.json b/package.json index c404367..04738b8 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "grim", "version": "2.0.3", "description": "Log usage of deprecated methods", - "main": "./lib/grim", + "main": "./src/grim.js", "scripts": { "prepublish": "grunt clean lint coffee", "test": "grunt test" diff --git a/src/deprecation.coffee b/src/deprecation.coffee deleted file mode 100644 index 4fa4603..0000000 --- a/src/deprecation.coffee +++ /dev/null @@ -1,93 +0,0 @@ -SourceMapCache = {} - -module.exports = -class Deprecation - @getFunctionNameFromCallsite: (callsite) -> - - @deserialize: ({message, fileName, lineNumber, stacks}) -> - deprecation = new Deprecation(message, fileName, lineNumber) - deprecation.addStack(stack, stack.metadata) for stack in stacks - deprecation - - constructor: (@message, @fileName, @lineNumber) -> - @callCount = 0 - @stackCount = 0 - @stacks = {} - @stackCallCounts = {} - - getFunctionNameFromCallsite: (callsite) -> - return callsite.functionName if callsite.functionName? - - if callsite.isToplevel() - callsite.getFunctionName() ? '' - else - if callsite.isConstructor() - "new #{callsite.getFunctionName()}" - else if callsite.getMethodName() and not callsite.getFunctionName() - callsite.getMethodName() - else - "#{callsite.getTypeName()}.#{callsite.getMethodName() ? callsite.getFunctionName() ? ''}" - - getLocationFromCallsite: (callsite) -> - return "unknown" unless callsite? - return callsite.location if callsite.location? - - if callsite.isNative() - "native" - else if callsite.isEval() - "eval at #{@getLocationFromCallsite(callsite.getEvalOrigin())}" - else - fileName = callsite.getFileName() - line = callsite.getLineNumber() - column = callsite.getColumnNumber() - "#{fileName}:#{line}:#{column}" - - getFileNameFromCallSite: (callsite) -> - callsite.fileName ? callsite.getFileName() - - getOriginName: -> - @originName - - getMessage: -> - @message - - getStacks: -> - parsedStacks = [] - for location, stack of @stacks - parsedStack = @parseStack(stack) - parsedStack.callCount = @stackCallCounts[location] - parsedStack.metadata = stack.metadata - parsedStacks.push(parsedStack) - parsedStacks - - getStackCount: -> - @stackCount - - getCallCount: -> - @callCount - - addStack: (stack, metadata) -> - @originName ?= @getFunctionNameFromCallsite(stack[0]) - @fileName ?= @getFileNameFromCallSite(stack[0]) - @lineNumber ?= stack[0].getLineNumber?() - @callCount++ - - stack.metadata = metadata - callerLocation = @getLocationFromCallsite(stack[1]) - unless @stacks[callerLocation]? - @stacks[callerLocation] = stack - @stackCount++ - @stackCallCounts[callerLocation] ?= 0 - @stackCallCounts[callerLocation]++ - - parseStack: (stack) -> - stack.map (callsite) => - functionName: @getFunctionNameFromCallsite(callsite) - location: @getLocationFromCallsite(callsite) - fileName: @getFileNameFromCallSite(callsite) - - serialize: -> - message: @getMessage() - lineNumber: @lineNumber - fileName: @fileName - stacks: @getStacks() diff --git a/src/deprecation.js b/src/deprecation.js index 32986eb..63539f3 100644 --- a/src/deprecation.js +++ b/src/deprecation.js @@ -1,16 +1,8 @@ -/* - * decaffeinate suggestions: - * DS101: Remove unnecessary use of Array.from - * DS102: Remove unnecessary code created because of implicit returns - * DS104: Avoid inline assignments - * DS207: Consider shorter variations of null checks - * Full docs: https://github.com/decaffeinate/decaffeinate/blob/main/docs/suggestions.md - */ -let Deprecation; + const SourceMapCache = {}; module.exports = -(Deprecation = class Deprecation { +class Deprecation { static getFunctionNameFromCallsite(callsite) {} static deserialize({message, fileName, lineNumber, stacks}) { @@ -33,16 +25,14 @@ module.exports = if (callsite.functionName != null) { return callsite.functionName; } if (callsite.isToplevel()) { - let left; - return (left = callsite.getFunctionName()) != null ? left : ''; + return callsite.getFunctionName() ?? ""; } else { if (callsite.isConstructor()) { return `new ${callsite.getFunctionName()}`; } else if (callsite.getMethodName() && !callsite.getFunctionName()) { return callsite.getMethodName(); } else { - let left1, left2; - return `${callsite.getTypeName()}.${(left1 = (left2 = callsite.getMethodName()) != null ? left2 : callsite.getFunctionName()) != null ? left1 : ''}`; + return `${callsite.getTypeName()}.${callsite.getMethodName() ?? callsite.getFunctionName() ?? "" }`; } } } @@ -129,4 +119,4 @@ module.exports = stacks: this.getStacks() }; } -}); +} diff --git a/src/grim.coffee b/src/grim.coffee deleted file mode 100644 index da3cf66..0000000 --- a/src/grim.coffee +++ /dev/null @@ -1,88 +0,0 @@ -Deprecation = require './deprecation' - -unless global.__grim__? - {Emitter} = require 'event-kit' - grim = global.__grim__ = - deprecations: {} - emitter: new Emitter - includeDeprecatedAPIs: true - - getDeprecations: -> - deprecations = [] - for fileName, deprecationsByLineNumber of grim.deprecations - for lineNumber, deprecationsByPackage of deprecationsByLineNumber - for packageName, deprecation of deprecationsByPackage - deprecations.push(deprecation) - deprecations - - getDeprecationsLength: -> - @getDeprecations().length - - clearDeprecations: -> - grim.deprecations = {} - return - - logDeprecations: -> - deprecations = @getDeprecations() - deprecations.sort (a, b) -> b.getCallCount() - a.getCallCount() - - console.warn "\nCalls to deprecated functions\n-----------------------------" - for deprecation in deprecations - console.warn "(#{deprecation.getCallCount()}) #{deprecation.getOriginName()} : #{deprecation.getMessage()}", deprecation - return - - deprecate: (message, metadata) -> - # Capture a 5-deep stack trace - originalStackTraceLimit = Error.stackTraceLimit - try - Error.stackTraceLimit = 7 - error = new Error - # Get an array of v8 CallSite objects - stack = error.getRawStack?() ? getRawStack(error) - stack = stack.slice(1) - finally - Error.stackTraceLimit = originalStackTraceLimit - - # Find or create a deprecation for this site - deprecationSite = stack[0] - fileName = deprecationSite.getFileName() - lineNumber = deprecationSite.getLineNumber() - packageName = metadata?.packageName ? "" - grim.deprecations[fileName] ?= {} - grim.deprecations[fileName][lineNumber] ?= {} - grim.deprecations[fileName][lineNumber][packageName] ?= new Deprecation(message) - - deprecation = grim.deprecations[fileName][lineNumber][packageName] - - # Add the current stack trace to the deprecation - deprecation.addStack(stack, metadata) - grim.emitter.emit("updated", deprecation) - return - - addSerializedDeprecation: (serializedDeprecation) -> - deprecation = Deprecation.deserialize(serializedDeprecation) - message = deprecation.getMessage() - {fileName, lineNumber} = deprecation - stacks = deprecation.getStacks() - packageName = stacks[0]?.metadata?.packageName ? "" - - grim.deprecations[fileName] ?= {} - grim.deprecations[fileName][lineNumber] ?= {} - grim.deprecations[fileName][lineNumber][packageName] ?= new Deprecation(message, fileName, lineNumber) - - deprecation = grim.deprecations[fileName][lineNumber][packageName] - deprecation.addStack(stack, stack.metadata) for stack in stacks - grim.emitter.emit("updated", deprecation) - return - - on: (eventName, callback) -> grim.emitter.on(eventName, callback) - -getRawStack = (error) -> - originalPrepareStackTrace = Error.prepareStackTrace - Error.prepareStackTrace = (error, stack) -> stack - Error.captureStackTrace(error, getRawStack) - result = error.stack - Error.prepareStackTrace = originalPrepareStackTrace - result - -module.exports = global.__grim__ diff --git a/src/grim.js b/src/grim.js index 515ec42..0171604 100644 --- a/src/grim.js +++ b/src/grim.js @@ -1,17 +1,8 @@ -/* - * decaffeinate suggestions: - * DS101: Remove unnecessary use of Array.from - * DS102: Remove unnecessary code created because of implicit returns - * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining - * DS104: Avoid inline assignments - * DS207: Consider shorter variations of null checks - * Full docs: https://github.com/decaffeinate/decaffeinate/blob/main/docs/suggestions.md - */ -const Deprecation = require('./deprecation'); +const Deprecation = require('./deprecation.js'); if (global.__grim__ == null) { - const {Emitter} = require('event-kit'); - var grim = (global.__grim__ = { + const { Emitter } = require('event-kit'); + const grim = { deprecations: {}, emitter: new Emitter, includeDeprecatedAPIs: true, @@ -58,7 +49,7 @@ if (global.__grim__ == null) { Error.stackTraceLimit = 7; const error = new Error; // Get an array of v8 CallSite objects - stack = (left = (typeof error.getRawStack === 'function' ? error.getRawStack() : undefined)) != null ? left : getRawStack(error); + stack = error?.getRawStack?.() ?? getRawStack(error); stack = stack.slice(1); } finally { Error.stackTraceLimit = originalStackTraceLimit; @@ -68,10 +59,12 @@ if (global.__grim__ == null) { const deprecationSite = stack[0]; const fileName = deprecationSite.getFileName(); const lineNumber = deprecationSite.getLineNumber(); - const packageName = (metadata != null ? metadata.packageName : undefined) != null ? (metadata != null ? metadata.packageName : undefined) : ""; + const packageName = metadata?.packageName ?? ""; if (grim.deprecations[fileName] == null) { grim.deprecations[fileName] = {}; } if (grim.deprecations[fileName][lineNumber] == null) { grim.deprecations[fileName][lineNumber] = {}; } - if (grim.deprecations[fileName][lineNumber][packageName] == null) { grim.deprecations[fileName][lineNumber][packageName] = new Deprecation(message); } + if (grim.deprecations[fileName][lineNumber][packageName] == null) { + grim.deprecations[fileName][lineNumber][packageName] = new Deprecation(message); + } const deprecation = grim.deprecations[fileName][lineNumber][packageName]; @@ -85,11 +78,13 @@ if (global.__grim__ == null) { const message = deprecation.getMessage(); const {fileName, lineNumber} = deprecation; const stacks = deprecation.getStacks(); - const packageName = __guard__(stacks[0] != null ? stacks[0].metadata : undefined, x => x.packageName) != null ? __guard__(stacks[0] != null ? stacks[0].metadata : undefined, x => x.packageName) : ""; + const packageName = stacks[0]?.metadata?.packageName ?? ""; if (grim.deprecations[fileName] == null) { grim.deprecations[fileName] = {}; } if (grim.deprecations[fileName][lineNumber] == null) { grim.deprecations[fileName][lineNumber] = {}; } - if (grim.deprecations[fileName][lineNumber][packageName] == null) { grim.deprecations[fileName][lineNumber][packageName] = new Deprecation(message, fileName, lineNumber); } + if (grim.deprecations[fileName][lineNumber][packageName] == null) { + grim.deprecations[fileName][lineNumber][packageName] = new Deprecation(message, fileName, lineNumber); + } deprecation = grim.deprecations[fileName][lineNumber][packageName]; for (let stack of Array.from(stacks)) { deprecation.addStack(stack, stack.metadata); } @@ -97,20 +92,18 @@ if (global.__grim__ == null) { }, on(eventName, callback) { return grim.emitter.on(eventName, callback); } - }); + }; + + global.__grim__ = grim; } -var getRawStack = function(error) { +function getRawStack(error) { const originalPrepareStackTrace = Error.prepareStackTrace; Error.prepareStackTrace = (error, stack) => stack; Error.captureStackTrace(error, getRawStack); const result = error.stack; Error.prepareStackTrace = originalPrepareStackTrace; return result; -}; +} module.exports = global.__grim__; - -function __guard__(value, transform) { - return (typeof value !== 'undefined' && value !== null) ? transform(value) : undefined; -}