eslint-plugin-remix
Version:
142 lines (136 loc) • 4.68 kB
JavaScript
;
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;