UNPKG

eslint-plugin-remix

Version:
142 lines (136 loc) 4.68 kB
"use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); // src/rules/node-server-imports/index.ts var import_utils = require("@typescript-eslint/utils"); var import_static = __toESM(require("builtin-modules/static")); // src/rules/node-server-imports/errors.ts var INVALID_NODE_IMPORT = "Node imports can only exist in .server.{ts,js,tsx,jsx} files"; var MOVE_TO_SERVER_FILE = "Move this logic to a .server.ts file and import that file instead."; // src/rules/node-server-imports/index.ts var nodeServerImports = import_utils.ESLintUtils.RuleCreator.withoutDocs({ create: (context) => { return { ImportDeclaration(node) { const value = node.source.value; if (typeof value !== "string") { return; } const isBuiltin = import_static.default.includes(value); if (!isBuiltin) { return; } const filename = context.getFilename(); const isServer = ["ts", "tsx", "js", "jsx"].some((ext) => filename.endsWith(`.server.${ext}`)); if (isServer) { return; } context.report({ node, messageId: "INVALID_NODE_IMPORT", suggest: [ { messageId: "MOVE_TO_SERVER_FILE", fix: (fixer) => { return [fixer.remove(node)]; } } ] }); } }; }, meta: { messages: { INVALID_NODE_IMPORT, MOVE_TO_SERVER_FILE }, hasSuggestions: true, docs: { description: "Ensures that node imports are only used in .server.{ts,js,tsx,jsx} files", recommended: "error" }, type: "problem", schema: [] }, defaultOptions: [] }); // src/rules/use-loader-data-types/index.ts var import_utils2 = require("@typescript-eslint/utils"); var useLoaderDataTypes = import_utils2.ESLintUtils.RuleCreator.withoutDocs({ create: (context) => { return { 'CallExpression[callee.name="useLoaderData"]'(node) { if (!node.typeParameters) { context.report({ suggest: [ { messageId: "suggestMissingFix", fix: (fixer) => [fixer.insertTextAfter(node.callee, "<typeof loader>")] } ], messageId: "missing", node }); return; } const { typeParameters } = node; if (typeParameters.params.length !== 1 || getTypeParameterTypeQueryName(typeParameters.params[0]) !== "loader") { context.report({ suggest: [ { messageId: "suggestIncorrectFix", fix: (fixer) => [fixer.replaceTextRange(typeParameters.range, "<typeof loader>")] } ], messageId: "incorrect", node }); } } }; }, defaultOptions: [], meta: { messages: { incorrect: "Prefer a `<typeof loader>` type parameter to safely type this call.", missing: "Prefer using an explicit `<typeof loader>` type parameter to safely type this call.", suggestIncorrectFix: "Use `<typeof loader> type parameter to safely type this call.", suggestMissingFix: "Add a `<typeof loader> type parameter to safely type this call." }, hasSuggestions: true, docs: { description: "Ensures that useLoaderData calls have proper type information.", recommended: "warn" }, type: "problem", schema: [] } }); function getTypeParameterTypeQueryName(node) { return node.type === import_utils2.AST_NODE_TYPES.TSTypeQuery && node.exprName.type === import_utils2.AST_NODE_TYPES.Identifier && node.exprName.name; } // src/index.ts var config = { rules: { "use-loader-data-types": useLoaderDataTypes, "node-server-imports": nodeServerImports } }; module.exports = config;