"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const utils_1 = require("@typescript-eslint/utils"); const utils_2 = require("../utils/utils"); const utils_3 = require("../utils/utils"); exports.default = utils_1.ESLintUtils.RuleCreator(() => "https://docs.microsoft.com/office/dev/add-ins/develop/application-specific-api-model#sync")({ name: "call-sync-before-read", meta: { type: "problem", messages: { callSync: "Call context.sync() before trying to read '{{name}}'.", }, docs: { description: "Always call load on the object's properties followed by a context.sync() before reading them.", }, schema: [], }, create: function (context) { var _a; const sourceCode = (_a = context.sourceCode) !== null && _a !== void 0 ? _a : context.getSourceCode(); let apiReferences = []; function checkPropertyIsRead(node) { var _a; const topExpression = (0, utils_2.findTopMemberExpression)(node); switch ((_a = topExpression.parent) === null || _a === void 0 ? void 0 : _a.type) { case utils_1.TSESTree.AST_NODE_TYPES.AssignmentExpression: return topExpression.parent.right === topExpression; default: return true; } } function findReadBeforeSync() { const needSync = new Set(); apiReferences.forEach((apiReference) => { var _a; const operation = apiReference.operation; const reference = apiReference.reference; const variable = reference.resolved; if (operation === "Get" && variable) { needSync.add(variable); } if (operation === "Sync") { needSync.clear(); } if (operation === "Read" && variable && needSync.has(variable)) { const node = reference.identifier; if (((_a = node.parent) === null || _a === void 0 ? void 0 : _a.type) === utils_1.TSESTree.AST_NODE_TYPES.MemberExpression && checkPropertyIsRead(node.parent)) { context.report({ node: node, messageId: "callSync", data: { name: node.name }, }); } } }); } return { Program(node) { const scope = sourceCode.getScope ? sourceCode.getScope(node) : context.getScope(); apiReferences = (0, utils_3.findOfficeApiReferences)(scope); apiReferences.sort((left, right) => { return (left.reference.identifier.range[1] - right.reference.identifier.range[1]); }); findReadBeforeSync(); }, }; }, defaultOptions: [], }); //# sourceMappingURL=call-sync-before-read.js.map