@atlaskit/eslint-plugin-design-system 9.3.0 → 9.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/README.md +36 -35
- package/constellation/index/usage.mdx +36 -35
- package/constellation/no-direct-use-of-web-platform-drag-and-drop/usage.mdx +140 -0
- package/dist/cjs/presets/all.codegen.js +2 -1
- package/dist/cjs/presets/recommended.codegen.js +2 -1
- package/dist/cjs/rules/index.codegen.js +3 -1
- package/dist/cjs/rules/no-direct-use-of-web-platform-drag-and-drop/checks/is-blocked-add-event-listener.js +31 -0
- package/dist/cjs/rules/no-direct-use-of-web-platform-drag-and-drop/checks/is-blocked-bind-all.js +63 -0
- package/dist/cjs/rules/no-direct-use-of-web-platform-drag-and-drop/checks/is-blocked-bind.js +48 -0
- package/dist/cjs/rules/no-direct-use-of-web-platform-drag-and-drop/checks/is-blocked-jsx-attribute.js +55 -0
- package/dist/cjs/rules/no-direct-use-of-web-platform-drag-and-drop/index.js +55 -0
- package/dist/cjs/rules/no-direct-use-of-web-platform-drag-and-drop/shared/blocked.js +8 -0
- package/dist/cjs/rules/no-direct-use-of-web-platform-drag-and-drop/shared/is-blocked-event-binding.js +31 -0
- package/dist/cjs/rules/utils/create-no-tagged-template-expression-rule/index.js +5 -7
- package/dist/es2019/presets/all.codegen.js +2 -1
- package/dist/es2019/presets/recommended.codegen.js +2 -1
- package/dist/es2019/rules/index.codegen.js +3 -1
- package/dist/es2019/rules/no-direct-use-of-web-platform-drag-and-drop/checks/is-blocked-add-event-listener.js +25 -0
- package/dist/es2019/rules/no-direct-use-of-web-platform-drag-and-drop/checks/is-blocked-bind-all.js +38 -0
- package/dist/es2019/rules/no-direct-use-of-web-platform-drag-and-drop/checks/is-blocked-bind.js +33 -0
- package/dist/es2019/rules/no-direct-use-of-web-platform-drag-and-drop/checks/is-blocked-jsx-attribute.js +49 -0
- package/dist/es2019/rules/no-direct-use-of-web-platform-drag-and-drop/index.js +49 -0
- package/dist/es2019/rules/no-direct-use-of-web-platform-drag-and-drop/shared/blocked.js +2 -0
- package/dist/es2019/rules/no-direct-use-of-web-platform-drag-and-drop/shared/is-blocked-event-binding.js +25 -0
- package/dist/es2019/rules/utils/create-no-tagged-template-expression-rule/index.js +21 -9
- package/dist/esm/presets/all.codegen.js +2 -1
- package/dist/esm/presets/recommended.codegen.js +2 -1
- package/dist/esm/rules/index.codegen.js +3 -1
- package/dist/esm/rules/no-direct-use-of-web-platform-drag-and-drop/checks/is-blocked-add-event-listener.js +25 -0
- package/dist/esm/rules/no-direct-use-of-web-platform-drag-and-drop/checks/is-blocked-bind-all.js +59 -0
- package/dist/esm/rules/no-direct-use-of-web-platform-drag-and-drop/checks/is-blocked-bind.js +44 -0
- package/dist/esm/rules/no-direct-use-of-web-platform-drag-and-drop/checks/is-blocked-jsx-attribute.js +49 -0
- package/dist/esm/rules/no-direct-use-of-web-platform-drag-and-drop/index.js +49 -0
- package/dist/esm/rules/no-direct-use-of-web-platform-drag-and-drop/shared/blocked.js +2 -0
- package/dist/esm/rules/no-direct-use-of-web-platform-drag-and-drop/shared/is-blocked-event-binding.js +25 -0
- package/dist/esm/rules/utils/create-no-tagged-template-expression-rule/index.js +6 -8
- package/dist/types/index.codegen.d.ts +2 -0
- package/dist/types/presets/all.codegen.d.ts +2 -1
- package/dist/types/presets/recommended.codegen.d.ts +2 -1
- package/dist/types/rules/index.codegen.d.ts +1 -0
- package/dist/types/rules/no-direct-use-of-web-platform-drag-and-drop/checks/is-blocked-add-event-listener.d.ts +2 -0
- package/dist/types/rules/no-direct-use-of-web-platform-drag-and-drop/checks/is-blocked-bind-all.d.ts +3 -0
- package/dist/types/rules/no-direct-use-of-web-platform-drag-and-drop/checks/is-blocked-bind.d.ts +3 -0
- package/dist/types/rules/no-direct-use-of-web-platform-drag-and-drop/checks/is-blocked-jsx-attribute.d.ts +3 -0
- package/dist/types/rules/no-direct-use-of-web-platform-drag-and-drop/index.d.ts +2 -0
- package/dist/types/rules/no-direct-use-of-web-platform-drag-and-drop/shared/blocked.d.ts +2 -0
- package/dist/types/rules/no-direct-use-of-web-platform-drag-and-drop/shared/is-blocked-event-binding.d.ts +2 -0
- package/dist/types-ts4.5/index.codegen.d.ts +2 -0
- package/dist/types-ts4.5/presets/all.codegen.d.ts +2 -1
- package/dist/types-ts4.5/presets/recommended.codegen.d.ts +2 -1
- package/dist/types-ts4.5/rules/index.codegen.d.ts +1 -0
- package/dist/types-ts4.5/rules/no-direct-use-of-web-platform-drag-and-drop/checks/is-blocked-add-event-listener.d.ts +2 -0
- package/dist/types-ts4.5/rules/no-direct-use-of-web-platform-drag-and-drop/checks/is-blocked-bind-all.d.ts +3 -0
- package/dist/types-ts4.5/rules/no-direct-use-of-web-platform-drag-and-drop/checks/is-blocked-bind.d.ts +3 -0
- package/dist/types-ts4.5/rules/no-direct-use-of-web-platform-drag-and-drop/checks/is-blocked-jsx-attribute.d.ts +3 -0
- package/dist/types-ts4.5/rules/no-direct-use-of-web-platform-drag-and-drop/index.d.ts +2 -0
- package/dist/types-ts4.5/rules/no-direct-use-of-web-platform-drag-and-drop/shared/blocked.d.ts +2 -0
- package/dist/types-ts4.5/rules/no-direct-use-of-web-platform-drag-and-drop/shared/is-blocked-event-binding.d.ts +2 -0
- package/package.json +1 -1
package/dist/cjs/rules/no-direct-use-of-web-platform-drag-and-drop/checks/is-blocked-bind-all.js
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.isBlockedBindAll = isBlockedBindAll;
|
|
7
|
+
var _eslintCodemodUtils = require("eslint-codemod-utils");
|
|
8
|
+
var _getImportNodeBySource = require("../../utils/get-import-node-by-source");
|
|
9
|
+
var _isBlockedEventBinding = require("../shared/is-blocked-event-binding");
|
|
10
|
+
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
|
11
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
12
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } // eslint-disable-next-line import/no-extraneous-dependencies
|
|
13
|
+
function isBlockedBindAll(context, node) {
|
|
14
|
+
var callee = node.callee;
|
|
15
|
+
if (!(0, _eslintCodemodUtils.isNodeOfType)(callee, 'Identifier')) {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
if (callee.name !== 'bindAll') {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
var module = (0, _getImportNodeBySource.getModuleOfIdentifier)(context.sourceCode, 'bindAll');
|
|
22
|
+
if ((module === null || module === void 0 ? void 0 : module.moduleName) !== 'bind-event-listener') {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
var secondArg = node.arguments[1];
|
|
26
|
+
if (!(0, _eslintCodemodUtils.isNodeOfType)(secondArg, 'ArrayExpression')) {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
var _iterator = _createForOfIteratorHelper(secondArg.elements),
|
|
30
|
+
_step;
|
|
31
|
+
try {
|
|
32
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
33
|
+
var element = _step.value;
|
|
34
|
+
if (!element) {
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
if (!(0, _eslintCodemodUtils.isNodeOfType)(element, 'ObjectExpression')) {
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
var _iterator2 = _createForOfIteratorHelper(element.properties),
|
|
41
|
+
_step2;
|
|
42
|
+
try {
|
|
43
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
44
|
+
var property = _step2.value;
|
|
45
|
+
if ((0, _isBlockedEventBinding.isBlockedEventBinding)(property)) {
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
} catch (err) {
|
|
50
|
+
_iterator2.e(err);
|
|
51
|
+
} finally {
|
|
52
|
+
_iterator2.f();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// no exit conditions hit
|
|
57
|
+
} catch (err) {
|
|
58
|
+
_iterator.e(err);
|
|
59
|
+
} finally {
|
|
60
|
+
_iterator.f();
|
|
61
|
+
}
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.isBlockedBind = isBlockedBind;
|
|
7
|
+
var _eslintCodemodUtils = require("eslint-codemod-utils");
|
|
8
|
+
var _getImportNodeBySource = require("../../utils/get-import-node-by-source");
|
|
9
|
+
var _isBlockedEventBinding = require("../shared/is-blocked-event-binding");
|
|
10
|
+
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
|
11
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
12
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } // eslint-disable-next-line import/no-extraneous-dependencies
|
|
13
|
+
function isBlockedBind(context, node) {
|
|
14
|
+
var callee = node.callee;
|
|
15
|
+
if (!(0, _eslintCodemodUtils.isNodeOfType)(callee, 'Identifier')) {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
if (callee.name !== 'bind') {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
var module = (0, _getImportNodeBySource.getModuleOfIdentifier)(context.sourceCode, 'bind');
|
|
22
|
+
if ((module === null || module === void 0 ? void 0 : module.moduleName) !== 'bind-event-listener') {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
var secondArg = node.arguments[1];
|
|
26
|
+
if (!(0, _eslintCodemodUtils.isNodeOfType)(secondArg, 'ObjectExpression')) {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// using a for loop for speed 🚀
|
|
31
|
+
var _iterator = _createForOfIteratorHelper(secondArg.properties),
|
|
32
|
+
_step;
|
|
33
|
+
try {
|
|
34
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
35
|
+
var property = _step.value;
|
|
36
|
+
if ((0, _isBlockedEventBinding.isBlockedEventBinding)(property)) {
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// no exit conditions hit
|
|
42
|
+
} catch (err) {
|
|
43
|
+
_iterator.e(err);
|
|
44
|
+
} finally {
|
|
45
|
+
_iterator.f();
|
|
46
|
+
}
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.isBlockedJSXAttribute = isBlockedJSXAttribute;
|
|
7
|
+
var _eslintCodemodUtils = require("eslint-codemod-utils");
|
|
8
|
+
var _getImportNodeBySource = require("../../utils/get-import-node-by-source");
|
|
9
|
+
var _blocked = require("../shared/blocked");
|
|
10
|
+
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
11
|
+
|
|
12
|
+
function getJSXElementNameFromAttribute(attribute) {
|
|
13
|
+
var parent = attribute.parent;
|
|
14
|
+
if (!parent) {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
if (!(0, _eslintCodemodUtils.isNodeOfType)(parent, 'JSXOpeningElement')) {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
var identifier = parent.name;
|
|
21
|
+
if (!(0, _eslintCodemodUtils.isNodeOfType)(identifier, 'JSXIdentifier')) {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
return identifier.name;
|
|
25
|
+
}
|
|
26
|
+
function isOnIntrinsicJSXElement(attribute) {
|
|
27
|
+
var name = getJSXElementNameFromAttribute(attribute);
|
|
28
|
+
if (!name) {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
var firstLetter = name.at(0);
|
|
32
|
+
if (!firstLetter) {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
return firstLetter === firstLetter.toLocaleLowerCase();
|
|
36
|
+
}
|
|
37
|
+
function isOnBoxPrimitive(context, attribute) {
|
|
38
|
+
if (getJSXElementNameFromAttribute(attribute) !== 'Box') {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
var module = (0, _getImportNodeBySource.getModuleOfIdentifier)(context.sourceCode, 'Box');
|
|
42
|
+
return (module === null || module === void 0 ? void 0 : module.moduleName) === '@atlaskit/primitives';
|
|
43
|
+
}
|
|
44
|
+
function isBlockedJSXAttribute(context, node) {
|
|
45
|
+
var attributeName = node.name;
|
|
46
|
+
if (!(0, _eslintCodemodUtils.isNodeOfType)(attributeName, 'JSXIdentifier')) {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// not using a blocked attribute name, can continue on
|
|
51
|
+
if (!_blocked.blockedJSXAttributeLookup.has(attributeName.name)) {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
return isOnIntrinsicJSXElement(node) || isOnBoxPrimitive(context, node);
|
|
55
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _eslintCodemodUtils = require("eslint-codemod-utils");
|
|
8
|
+
var _createRule = require("../utils/create-rule");
|
|
9
|
+
var _isBlockedAddEventListener = require("./checks/is-blocked-add-event-listener");
|
|
10
|
+
var _isBlockedBind = require("./checks/is-blocked-bind");
|
|
11
|
+
var _isBlockedBindAll = require("./checks/is-blocked-bind-all");
|
|
12
|
+
var _isBlockedJsxAttribute = require("./checks/is-blocked-jsx-attribute");
|
|
13
|
+
var rule = (0, _createRule.createLintRule)({
|
|
14
|
+
meta: {
|
|
15
|
+
name: 'no-direct-use-of-web-platform-drag-and-drop',
|
|
16
|
+
type: 'problem',
|
|
17
|
+
docs: {
|
|
18
|
+
recommended: true,
|
|
19
|
+
severity: 'error',
|
|
20
|
+
description: 'Disallow using direct use of native drag and drop (please use Pragmatic drag and drop)'
|
|
21
|
+
},
|
|
22
|
+
messages: {
|
|
23
|
+
usePragmaticDnd: 'Please use Pragmatic drag and drop, which makes web platform drag and drop safe and easy to work with.'
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
create: function create(context) {
|
|
27
|
+
return {
|
|
28
|
+
JSXAttribute: function JSXAttribute(node) {
|
|
29
|
+
if (!(0, _eslintCodemodUtils.isNodeOfType)(node, 'JSXAttribute')) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
if ((0, _isBlockedJsxAttribute.isBlockedJSXAttribute)(context, node)) {
|
|
33
|
+
context.report({
|
|
34
|
+
messageId: 'usePragmaticDnd',
|
|
35
|
+
node: node
|
|
36
|
+
});
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
CallExpression: function CallExpression(node) {
|
|
41
|
+
if (!(0, _eslintCodemodUtils.isNodeOfType)(node, 'CallExpression')) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if ((0, _isBlockedAddEventListener.isBlockedAddEventListener)(node) || (0, _isBlockedBind.isBlockedBind)(context, node) || (0, _isBlockedBindAll.isBlockedBindAll)(context, node)) {
|
|
45
|
+
context.report({
|
|
46
|
+
messageId: 'usePragmaticDnd',
|
|
47
|
+
node: node
|
|
48
|
+
});
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
var _default = exports.default = rule;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.blockedJSXAttributeLookup = exports.blockedEventNameLookup = void 0;
|
|
7
|
+
var blockedJSXAttributeLookup = exports.blockedJSXAttributeLookup = new Set(['onDragStart', 'onDragEnter', 'onDragLeave', 'onDragOver', 'onDrag', 'onDrop', 'onDragEnd']);
|
|
8
|
+
var blockedEventNameLookup = exports.blockedEventNameLookup = new Set(['dragstart', 'dragenter', 'dragleave', 'dragover', 'drag', 'drop', 'dragend']);
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.isBlockedEventBinding = isBlockedEventBinding;
|
|
7
|
+
var _eslintCodemodUtils = require("eslint-codemod-utils");
|
|
8
|
+
var _blocked = require("./blocked");
|
|
9
|
+
function isBlockedEventBinding(property) {
|
|
10
|
+
if (!(0, _eslintCodemodUtils.isNodeOfType)(property, 'Property')) {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// are we looking at the "type" property?
|
|
15
|
+
|
|
16
|
+
var key = property.key;
|
|
17
|
+
if (!(0, _eslintCodemodUtils.isNodeOfType)(key, 'Identifier')) {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
if (key.name !== 'type') {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// is the "type" property value blocked?
|
|
25
|
+
|
|
26
|
+
var value = property.value;
|
|
27
|
+
if (!(0, _eslintCodemodUtils.isNodeOfType)(value, 'Literal')) {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
return typeof value.value === 'string' && _blocked.blockedEventNameLookup.has(value.value);
|
|
31
|
+
}
|
|
@@ -80,7 +80,7 @@ var createNoTaggedTemplateExpressionRule = exports.createNoTaggedTemplateExpress
|
|
|
80
80
|
return _context.abrupt("return");
|
|
81
81
|
case 11:
|
|
82
82
|
args = (0, _toArguments.toArguments)(source, quasi);
|
|
83
|
-
if (!
|
|
83
|
+
if (!args.some(hasNestedSelectorWithMultipleArguments)) {
|
|
84
84
|
_context.next = 14;
|
|
85
85
|
break;
|
|
86
86
|
}
|
|
@@ -140,19 +140,17 @@ var createNoTaggedTemplateExpressionRule = exports.createNoTaggedTemplateExpress
|
|
|
140
140
|
};
|
|
141
141
|
};
|
|
142
142
|
};
|
|
143
|
-
function
|
|
143
|
+
function hasNestedSelectorWithMultipleArguments(arg) {
|
|
144
144
|
if (arg.type === 'literal' || arg.type === 'expression' || arg.type === 'declaration') {
|
|
145
145
|
return false;
|
|
146
146
|
}
|
|
147
|
-
if (arg.type === 'rule' && arg.declarations.length > 1
|
|
148
|
-
return node.type === 'expression';
|
|
149
|
-
})) {
|
|
147
|
+
if (arg.type === 'rule' && arg.declarations.length > 1) {
|
|
150
148
|
return true;
|
|
151
149
|
}
|
|
152
150
|
if (arg.type === 'block') {
|
|
153
|
-
return arg.blocks.some(
|
|
151
|
+
return arg.blocks.some(hasNestedSelectorWithMultipleArguments);
|
|
154
152
|
}
|
|
155
153
|
if (arg.type === 'rule') {
|
|
156
|
-
return arg.declarations.some(
|
|
154
|
+
return arg.declarations.some(hasNestedSelectorWithMultipleArguments);
|
|
157
155
|
}
|
|
158
156
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* THIS FILE WAS CREATED VIA CODEGEN DO NOT MODIFY {@see http://go/af-codegen}
|
|
3
|
-
* @codegen <<SignedSource::
|
|
3
|
+
* @codegen <<SignedSource::1ab11547db880eba1206f334a9b2150f>>
|
|
4
4
|
* @codegenCommand yarn workspace @atlaskit/eslint-plugin-design-system codegen
|
|
5
5
|
*/
|
|
6
6
|
export default {
|
|
@@ -15,6 +15,7 @@ export default {
|
|
|
15
15
|
'@atlaskit/design-system/no-deprecated-apis': 'error',
|
|
16
16
|
'@atlaskit/design-system/no-deprecated-design-token-usage': 'warn',
|
|
17
17
|
'@atlaskit/design-system/no-deprecated-imports': 'error',
|
|
18
|
+
'@atlaskit/design-system/no-direct-use-of-web-platform-drag-and-drop': 'error',
|
|
18
19
|
'@atlaskit/design-system/no-empty-styled-expression': 'warn',
|
|
19
20
|
'@atlaskit/design-system/no-exported-css': 'warn',
|
|
20
21
|
'@atlaskit/design-system/no-exported-keyframes': 'warn',
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* THIS FILE WAS CREATED VIA CODEGEN DO NOT MODIFY {@see http://go/af-codegen}
|
|
3
|
-
* @codegen <<SignedSource::
|
|
3
|
+
* @codegen <<SignedSource::05b4fe8f97edc4f7e46ded52b4917037>>
|
|
4
4
|
* @codegenCommand yarn workspace @atlaskit/eslint-plugin-design-system codegen
|
|
5
5
|
*/
|
|
6
6
|
export default {
|
|
@@ -13,6 +13,7 @@ export default {
|
|
|
13
13
|
'@atlaskit/design-system/no-deprecated-apis': 'error',
|
|
14
14
|
'@atlaskit/design-system/no-deprecated-design-token-usage': 'warn',
|
|
15
15
|
'@atlaskit/design-system/no-deprecated-imports': 'error',
|
|
16
|
+
'@atlaskit/design-system/no-direct-use-of-web-platform-drag-and-drop': 'error',
|
|
16
17
|
'@atlaskit/design-system/no-empty-styled-expression': 'warn',
|
|
17
18
|
'@atlaskit/design-system/no-exported-css': 'warn',
|
|
18
19
|
'@atlaskit/design-system/no-exported-keyframes': 'warn',
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* THIS FILE WAS CREATED VIA CODEGEN DO NOT MODIFY {@see http://go/af-codegen}
|
|
3
|
-
* @codegen <<SignedSource::
|
|
3
|
+
* @codegen <<SignedSource::293575f7bd0150862f792e3fffc286c4>>
|
|
4
4
|
* @codegenCommand yarn workspace @atlaskit/eslint-plugin-design-system codegen
|
|
5
5
|
*/
|
|
6
6
|
import consistentCssPropUsage from './consistent-css-prop-usage';
|
|
@@ -12,6 +12,7 @@ import noCssTaggedTemplateExpression from './no-css-tagged-template-expression';
|
|
|
12
12
|
import noDeprecatedApis from './no-deprecated-apis';
|
|
13
13
|
import noDeprecatedDesignTokenUsage from './no-deprecated-design-token-usage';
|
|
14
14
|
import noDeprecatedImports from './no-deprecated-imports';
|
|
15
|
+
import noDirectUseOfWebPlatformDragAndDrop from './no-direct-use-of-web-platform-drag-and-drop';
|
|
15
16
|
import noEmptyStyledExpression from './no-empty-styled-expression';
|
|
16
17
|
import noExportedCss from './no-exported-css';
|
|
17
18
|
import noExportedKeyframes from './no-exported-keyframes';
|
|
@@ -46,6 +47,7 @@ export default {
|
|
|
46
47
|
'no-deprecated-apis': noDeprecatedApis,
|
|
47
48
|
'no-deprecated-design-token-usage': noDeprecatedDesignTokenUsage,
|
|
48
49
|
'no-deprecated-imports': noDeprecatedImports,
|
|
50
|
+
'no-direct-use-of-web-platform-drag-and-drop': noDirectUseOfWebPlatformDragAndDrop,
|
|
49
51
|
'no-empty-styled-expression': noEmptyStyledExpression,
|
|
50
52
|
'no-exported-css': noExportedCss,
|
|
51
53
|
'no-exported-keyframes': noExportedKeyframes,
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { isNodeOfType } from 'eslint-codemod-utils';
|
|
2
|
+
import { blockedEventNameLookup } from '../shared/blocked';
|
|
3
|
+
export function isBlockedAddEventListener(node) {
|
|
4
|
+
const callee = node.callee;
|
|
5
|
+
if (!isNodeOfType(callee, 'MemberExpression')) {
|
|
6
|
+
return false;
|
|
7
|
+
}
|
|
8
|
+
const property = callee.property;
|
|
9
|
+
if (!isNodeOfType(property, 'Identifier')) {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
if (property.name !== 'addEventListener') {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// check the first argument
|
|
17
|
+
const first = node.arguments[0];
|
|
18
|
+
|
|
19
|
+
// only checking literals for this eslint rule
|
|
20
|
+
if (!isNodeOfType(first, 'Literal')) {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
const value = first.value;
|
|
24
|
+
return typeof value === 'string' && blockedEventNameLookup.has(value);
|
|
25
|
+
}
|
package/dist/es2019/rules/no-direct-use-of-web-platform-drag-and-drop/checks/is-blocked-bind-all.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
2
|
+
|
|
3
|
+
import { isNodeOfType } from 'eslint-codemod-utils';
|
|
4
|
+
import { getModuleOfIdentifier } from '../../utils/get-import-node-by-source';
|
|
5
|
+
import { isBlockedEventBinding } from '../shared/is-blocked-event-binding';
|
|
6
|
+
export function isBlockedBindAll(context, node) {
|
|
7
|
+
const callee = node.callee;
|
|
8
|
+
if (!isNodeOfType(callee, 'Identifier')) {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
if (callee.name !== 'bindAll') {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
const module = getModuleOfIdentifier(context.sourceCode, 'bindAll');
|
|
15
|
+
if ((module === null || module === void 0 ? void 0 : module.moduleName) !== 'bind-event-listener') {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
const secondArg = node.arguments[1];
|
|
19
|
+
if (!isNodeOfType(secondArg, 'ArrayExpression')) {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
for (const element of secondArg.elements) {
|
|
23
|
+
if (!element) {
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
if (!isNodeOfType(element, 'ObjectExpression')) {
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
for (const property of element.properties) {
|
|
30
|
+
if (isBlockedEventBinding(property)) {
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// no exit conditions hit
|
|
37
|
+
return false;
|
|
38
|
+
}
|
package/dist/es2019/rules/no-direct-use-of-web-platform-drag-and-drop/checks/is-blocked-bind.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
2
|
+
|
|
3
|
+
import { isNodeOfType } from 'eslint-codemod-utils';
|
|
4
|
+
import { getModuleOfIdentifier } from '../../utils/get-import-node-by-source';
|
|
5
|
+
import { isBlockedEventBinding } from '../shared/is-blocked-event-binding';
|
|
6
|
+
export function isBlockedBind(context, node) {
|
|
7
|
+
const callee = node.callee;
|
|
8
|
+
if (!isNodeOfType(callee, 'Identifier')) {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
if (callee.name !== 'bind') {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
const module = getModuleOfIdentifier(context.sourceCode, 'bind');
|
|
15
|
+
if ((module === null || module === void 0 ? void 0 : module.moduleName) !== 'bind-event-listener') {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
const secondArg = node.arguments[1];
|
|
19
|
+
if (!isNodeOfType(secondArg, 'ObjectExpression')) {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// using a for loop for speed 🚀
|
|
24
|
+
|
|
25
|
+
for (const property of secondArg.properties) {
|
|
26
|
+
if (isBlockedEventBinding(property)) {
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// no exit conditions hit
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
2
|
+
|
|
3
|
+
import { isNodeOfType } from 'eslint-codemod-utils';
|
|
4
|
+
import { getModuleOfIdentifier } from '../../utils/get-import-node-by-source';
|
|
5
|
+
import { blockedJSXAttributeLookup } from '../shared/blocked';
|
|
6
|
+
function getJSXElementNameFromAttribute(attribute) {
|
|
7
|
+
const parent = attribute.parent;
|
|
8
|
+
if (!parent) {
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
if (!isNodeOfType(parent, 'JSXOpeningElement')) {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
const identifier = parent.name;
|
|
15
|
+
if (!isNodeOfType(identifier, 'JSXIdentifier')) {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
return identifier.name;
|
|
19
|
+
}
|
|
20
|
+
function isOnIntrinsicJSXElement(attribute) {
|
|
21
|
+
const name = getJSXElementNameFromAttribute(attribute);
|
|
22
|
+
if (!name) {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
const firstLetter = name.at(0);
|
|
26
|
+
if (!firstLetter) {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
return firstLetter === firstLetter.toLocaleLowerCase();
|
|
30
|
+
}
|
|
31
|
+
function isOnBoxPrimitive(context, attribute) {
|
|
32
|
+
if (getJSXElementNameFromAttribute(attribute) !== 'Box') {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
const module = getModuleOfIdentifier(context.sourceCode, 'Box');
|
|
36
|
+
return (module === null || module === void 0 ? void 0 : module.moduleName) === '@atlaskit/primitives';
|
|
37
|
+
}
|
|
38
|
+
export function isBlockedJSXAttribute(context, node) {
|
|
39
|
+
const attributeName = node.name;
|
|
40
|
+
if (!isNodeOfType(attributeName, 'JSXIdentifier')) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// not using a blocked attribute name, can continue on
|
|
45
|
+
if (!blockedJSXAttributeLookup.has(attributeName.name)) {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
return isOnIntrinsicJSXElement(node) || isOnBoxPrimitive(context, node);
|
|
49
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { isNodeOfType } from 'eslint-codemod-utils';
|
|
2
|
+
import { createLintRule } from '../utils/create-rule';
|
|
3
|
+
import { isBlockedAddEventListener } from './checks/is-blocked-add-event-listener';
|
|
4
|
+
import { isBlockedBind } from './checks/is-blocked-bind';
|
|
5
|
+
import { isBlockedBindAll } from './checks/is-blocked-bind-all';
|
|
6
|
+
import { isBlockedJSXAttribute } from './checks/is-blocked-jsx-attribute';
|
|
7
|
+
const rule = createLintRule({
|
|
8
|
+
meta: {
|
|
9
|
+
name: 'no-direct-use-of-web-platform-drag-and-drop',
|
|
10
|
+
type: 'problem',
|
|
11
|
+
docs: {
|
|
12
|
+
recommended: true,
|
|
13
|
+
severity: 'error',
|
|
14
|
+
description: 'Disallow using direct use of native drag and drop (please use Pragmatic drag and drop)'
|
|
15
|
+
},
|
|
16
|
+
messages: {
|
|
17
|
+
usePragmaticDnd: 'Please use Pragmatic drag and drop, which makes web platform drag and drop safe and easy to work with.'
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
create(context) {
|
|
21
|
+
return {
|
|
22
|
+
JSXAttribute(node) {
|
|
23
|
+
if (!isNodeOfType(node, 'JSXAttribute')) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
if (isBlockedJSXAttribute(context, node)) {
|
|
27
|
+
context.report({
|
|
28
|
+
messageId: 'usePragmaticDnd',
|
|
29
|
+
node
|
|
30
|
+
});
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
CallExpression(node) {
|
|
35
|
+
if (!isNodeOfType(node, 'CallExpression')) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if (isBlockedAddEventListener(node) || isBlockedBind(context, node) || isBlockedBindAll(context, node)) {
|
|
39
|
+
context.report({
|
|
40
|
+
messageId: 'usePragmaticDnd',
|
|
41
|
+
node
|
|
42
|
+
});
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
export default rule;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { isNodeOfType } from 'eslint-codemod-utils';
|
|
2
|
+
import { blockedEventNameLookup } from './blocked';
|
|
3
|
+
export function isBlockedEventBinding(property) {
|
|
4
|
+
if (!isNodeOfType(property, 'Property')) {
|
|
5
|
+
return false;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
// are we looking at the "type" property?
|
|
9
|
+
|
|
10
|
+
const key = property.key;
|
|
11
|
+
if (!isNodeOfType(key, 'Identifier')) {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
if (key.name !== 'type') {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// is the "type" property value blocked?
|
|
19
|
+
|
|
20
|
+
const value = property.value;
|
|
21
|
+
if (!isNodeOfType(value, 'Literal')) {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
return typeof value.value === 'string' && blockedEventNameLookup.has(value.value);
|
|
25
|
+
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
3
3
|
|
|
4
4
|
import esquery from 'esquery';
|
|
5
|
-
import { getImportSources, isEmotion
|
|
5
|
+
import { getImportSources, isEmotion } from '@atlaskit/eslint-utils/is-supported-import';
|
|
6
6
|
import { generate } from './generate';
|
|
7
7
|
import { getTaggedTemplateExpressionOffset } from './get-tagged-template-expression-offset';
|
|
8
8
|
import { toArguments } from './to-arguments';
|
|
@@ -60,11 +60,23 @@ export const createNoTaggedTemplateExpressionRule = (isUsage, messageId) => cont
|
|
|
60
60
|
return;
|
|
61
61
|
}
|
|
62
62
|
const args = toArguments(source, quasi);
|
|
63
|
-
if (
|
|
63
|
+
if (args.some(hasNestedSelectorWithMultipleArguments)) {
|
|
64
64
|
/**
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
65
|
+
* We don't want to autofix if we would produce an array value, for example:
|
|
66
|
+
* ```
|
|
67
|
+
* styled.div({
|
|
68
|
+
* ':hover': [
|
|
69
|
+
* mixin,
|
|
70
|
+
* {
|
|
71
|
+
* color: 'red'
|
|
72
|
+
* }
|
|
73
|
+
* ]
|
|
74
|
+
* })
|
|
75
|
+
* ```
|
|
76
|
+
*
|
|
77
|
+
* This should only occur if there is a mixin in a nested selector.
|
|
78
|
+
*
|
|
79
|
+
* The array syntax is only supported by emotion.
|
|
68
80
|
*/
|
|
69
81
|
return;
|
|
70
82
|
}
|
|
@@ -136,17 +148,17 @@ export const createNoTaggedTemplateExpressionRule = (isUsage, messageId) => cont
|
|
|
136
148
|
}
|
|
137
149
|
};
|
|
138
150
|
};
|
|
139
|
-
function
|
|
151
|
+
function hasNestedSelectorWithMultipleArguments(arg) {
|
|
140
152
|
if (arg.type === 'literal' || arg.type === 'expression' || arg.type === 'declaration') {
|
|
141
153
|
return false;
|
|
142
154
|
}
|
|
143
|
-
if (arg.type === 'rule' && arg.declarations.length > 1
|
|
155
|
+
if (arg.type === 'rule' && arg.declarations.length > 1) {
|
|
144
156
|
return true;
|
|
145
157
|
}
|
|
146
158
|
if (arg.type === 'block') {
|
|
147
|
-
return arg.blocks.some(
|
|
159
|
+
return arg.blocks.some(hasNestedSelectorWithMultipleArguments);
|
|
148
160
|
}
|
|
149
161
|
if (arg.type === 'rule') {
|
|
150
|
-
return arg.declarations.some(
|
|
162
|
+
return arg.declarations.some(hasNestedSelectorWithMultipleArguments);
|
|
151
163
|
}
|
|
152
164
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* THIS FILE WAS CREATED VIA CODEGEN DO NOT MODIFY {@see http://go/af-codegen}
|
|
3
|
-
* @codegen <<SignedSource::
|
|
3
|
+
* @codegen <<SignedSource::1ab11547db880eba1206f334a9b2150f>>
|
|
4
4
|
* @codegenCommand yarn workspace @atlaskit/eslint-plugin-design-system codegen
|
|
5
5
|
*/
|
|
6
6
|
export default {
|
|
@@ -15,6 +15,7 @@ export default {
|
|
|
15
15
|
'@atlaskit/design-system/no-deprecated-apis': 'error',
|
|
16
16
|
'@atlaskit/design-system/no-deprecated-design-token-usage': 'warn',
|
|
17
17
|
'@atlaskit/design-system/no-deprecated-imports': 'error',
|
|
18
|
+
'@atlaskit/design-system/no-direct-use-of-web-platform-drag-and-drop': 'error',
|
|
18
19
|
'@atlaskit/design-system/no-empty-styled-expression': 'warn',
|
|
19
20
|
'@atlaskit/design-system/no-exported-css': 'warn',
|
|
20
21
|
'@atlaskit/design-system/no-exported-keyframes': 'warn',
|