@forge/lint

5.14.1-next.75.15.0-next.8
out/lint/linters/endpoint-linter/verifiers/invoke-endpoint-verifier.js
out/lint/linters/endpoint-linter/verifiers/invoke-endpoint-verifier.js
+48
Index: package/out/lint/linters/endpoint-linter/verifiers/invoke-endpoint-verifier.js
===================================================================
--- package/out/lint/linters/endpoint-linter/verifiers/invoke-endpoint-verifier.js
+++ package/out/lint/linters/endpoint-linter/verifiers/invoke-endpoint-verifier.js
@@ -0,0 +1,48 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.InvokeEndpointVerifier = void 0;
+const typescript_estree_1 = require("@typescript-eslint/typescript-estree");
+const linter_interface_1 = require("../../../linter-interface");
+const text_1 = require("../../../text");
+const verifier_interface_1 = require("../../verifier-interface");
+const invoke_endpoint_interface_1 = require("../invoke-endpoint-interface");
+class InvokeEndpointVerifier extends verifier_interface_1.BaseLintIssueVerifier {
+    getLintClass() {
+        return linter_interface_1.LintClass.Error;
+    }
+    async process(input) {
+        const validCalls = input.invokeEndpointCalls.filter((call) => this.isValidCall(call, input.imports));
+        const missingEndpoints = validCalls
+            .filter((call) => !this.isRemoteKeyValid(call))
+            .map((call) => ({ call, message: text_1.messages.verifiers.invokeRemoteKey }));
+        const missingComputeOperation = validCalls
+            .filter((call) => this.isRemoteKeyValid(call) && !this.hasComputeOperation(call))
+            .map((call) => ({ call, message: text_1.messages.verifiers.invokeRemoteCompute }));
+        return [...missingEndpoints, ...missingComputeOperation].map(({ call, message }) => ({
+            class: this.getLintClass(),
+            column: call.column,
+            line: call.line,
+            message: message.message(call.endpointKey),
+            reference: message.reference
+        }));
+    }
+    isValidCall(call, imports) {
+        if (call.type === invoke_endpoint_interface_1.InvokeEndpointTypes.DIRECT_CALL) {
+            return imports.some((imp) => imp.type === typescript_estree_1.AST_NODE_TYPES.ImportSpecifier && call.calleeName === imp.alias);
+        }
+        return imports.some((imp) => (imp.type === typescript_estree_1.AST_NODE_TYPES.ImportDefaultSpecifier || imp.type === typescript_estree_1.AST_NODE_TYPES.ImportNamespaceSpecifier) &&
+            call.objectName === imp.alias);
+    }
+    getRemoteForCall(call) {
+        return this.manifest.remotes?.find((remote) => remote.key === call.endpointKey);
+    }
+    isRemoteKeyValid(call) {
+        const remote = this.getRemoteForCall(call);
+        return typeof remote !== 'undefined';
+    }
+    hasComputeOperation(call) {
+        const endpoint = this.getRemoteForCall(call);
+        return endpoint?.operations?.includes('compute') ?? false;
+    }
+}
+exports.InvokeEndpointVerifier = InvokeEndpointVerifier;