UNPKG

@amplitude/ampli

Version:

Amplitude CLI

48 lines (47 loc) 2.54 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tsquery_1 = require("@phenomnomnominal/tsquery"); const base_1 = require("../base"); class TypeScriptVerifier extends base_1.Verifier { constructor(ampliInstanceNames = ['itly'], fileExtensionPattern = 'ts{x,}', fileFilter = (filePath) => !filePath.endsWith('.d.ts')) { super(fileExtensionPattern, ampliInstanceNames.map(name => `${name}.`), fileFilter, ['node_modules']); this.ampliInstanceNames = ampliInstanceNames; } async doVerify(eventNames, workingDirs) { return this.verifyEach(this.verifyFile.bind(this), workingDirs); } verifyFile(filePath, fileContents, addReference) { if (!fileContents) { return; } const ast = tsquery_1.tsquery.ast(fileContents); const classConstructors = tsquery_1.tsquery(ast, 'NewExpression > Identifier'); classConstructors.forEach(classConstructor => { const className = this.getReferenceName(classConstructor.escapedText); const { line, character } = ast.getLineAndCharacterOfPosition(classConstructor.getStart()); addReference({ filePath, name: className, row: line, column: character }); }); this.ampliInstanceNames.forEach(instanceName => { const nameParts = instanceName.split('.'); const trackCalls = tsquery_1.tsquery(ast, `CallExpression > PropertyAccessExpression:has(Identifier[name='${nameParts[0].replace(/\?$/, '')}'])`); trackCalls.forEach(trackCall => { var _a, _b; const name = trackCall.name.escapedText; let ok = true; let { expression, questionDotToken } = trackCall; for (let i = nameParts.length - 1; expression && i >= 0; i -= 1) { if (`${(_b = (_a = expression.name) === null || _a === void 0 ? void 0 : _a.escapedText) !== null && _b !== void 0 ? _b : expression.escapedText}${questionDotToken ? '?' : ''}` !== nameParts[i]) { ok = false; break; } ({ expression, questionDotToken } = expression); } if (ok) { const { line, character } = ast.getLineAndCharacterOfPosition(trackCall.getStart()); addReference({ filePath, name, row: line, column: character }); } }); }); } } exports.default = TypeScriptVerifier;