- Consolidated duplicate UndoManagers to single instance - Fixed connection promise to only resolve on 'connected' status - Fixed WebSocketProvider import (WebsocketProvider) - Added proper doc.destroy() cleanup - Renamed isPresenceInitialized property to avoid conflict Co-Authored-By: Paperclip <noreply@paperclip.ing>
78 lines
3.2 KiB
JavaScript
78 lines
3.2 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
const utils_1 = require("@typescript-eslint/utils");
|
|
const utils_2 = require("../utils");
|
|
const createRule = utils_1.ESLintUtils.RuleCreator.withoutDocs;
|
|
exports.default = createRule({
|
|
meta: {
|
|
type: "problem",
|
|
docs: {
|
|
description: "Disallow passing the same prop twice in JSX.",
|
|
url: "https://github.com/solidjs-community/eslint-plugin-solid/blob/main/docs/jsx-no-duplicate-props.md",
|
|
},
|
|
schema: [
|
|
{
|
|
type: "object",
|
|
properties: {
|
|
ignoreCase: {
|
|
type: "boolean",
|
|
description: "Consider two prop names differing only by case to be the same.",
|
|
default: false,
|
|
},
|
|
},
|
|
},
|
|
],
|
|
messages: {
|
|
noDuplicateProps: "Duplicate props are not allowed.",
|
|
noDuplicateClass: "Duplicate `class` props are not allowed; while it might seem to work, it can break unexpectedly. Use `classList` instead.",
|
|
noDuplicateChildren: "Using {{used}} at the same time is not allowed.",
|
|
},
|
|
},
|
|
defaultOptions: [],
|
|
create(context) {
|
|
return {
|
|
JSXOpeningElement(node) {
|
|
const ignoreCase = context.options[0]?.ignoreCase ?? false;
|
|
const props = new Set();
|
|
const checkPropName = (name, node) => {
|
|
if (ignoreCase || name.startsWith("on")) {
|
|
name = name
|
|
.toLowerCase()
|
|
.replace(/^on(?:capture)?:/, "on")
|
|
.replace(/^(?:attr|prop):/, "");
|
|
}
|
|
if (props.has(name)) {
|
|
context.report({
|
|
node,
|
|
messageId: name === "class" ? "noDuplicateClass" : "noDuplicateProps",
|
|
});
|
|
}
|
|
props.add(name);
|
|
};
|
|
for (const [name, propNode] of (0, utils_2.jsxGetAllProps)(node.attributes)) {
|
|
checkPropName(name, propNode);
|
|
}
|
|
const hasChildrenProp = props.has("children");
|
|
const hasChildren = node.parent.children.length > 0;
|
|
const hasInnerHTML = props.has("innerHTML") || props.has("innerhtml");
|
|
const hasTextContent = props.has("textContent") || props.has("textContent");
|
|
const used = [
|
|
hasChildrenProp && "`props.children`",
|
|
hasChildren && "JSX children",
|
|
hasInnerHTML && "`props.innerHTML`",
|
|
hasTextContent && "`props.textContent`",
|
|
].filter(Boolean);
|
|
if (used.length > 1) {
|
|
context.report({
|
|
node,
|
|
messageId: "noDuplicateChildren",
|
|
data: {
|
|
used: used.join(", "),
|
|
},
|
|
});
|
|
}
|
|
},
|
|
};
|
|
},
|
|
});
|