@amplitude/ampli
Version:
Amplitude CLI
48 lines (47 loc) • 2.54 kB
JavaScript
;
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;