eslint-plugin-storybook
Advanced tools
Comparing version 0.5.9--canary.acfda00.0 to 0.5.9--canary.f8f1b91.0
@@ -81,3 +81,3 @@ "use strict"; | ||
if (!parent || (0, ast_1.isProgram)(parent)) | ||
return undefined; | ||
return null; | ||
if ((0, ast_1.isArrowFunctionExpression)(parent) || | ||
@@ -108,4 +108,4 @@ (0, ast_1.isFunctionExpression)(parent) || | ||
const parentFnNode = getClosestFunctionAncestor(node); | ||
const parentFnNeedsAsync = parentFnNode && !('async' in parentFnNode && parentFnNode.async); | ||
const fixFn = (fixer) => { | ||
const parentFnNeedsAsync = parentFnNode && !parentFnNode.async; | ||
function fixFn(fixer) { | ||
const fixerResult = [fixer.insertTextBefore(node, 'await ')]; | ||
@@ -116,3 +116,3 @@ if (parentFnNeedsAsync) { | ||
return fixerResult; | ||
}; | ||
} | ||
context.report({ | ||
@@ -119,0 +119,0 @@ node, |
@@ -22,3 +22,3 @@ "use strict"; | ||
}, | ||
fixable: undefined, | ||
fixable: null, | ||
schema: [], | ||
@@ -25,0 +25,0 @@ }, |
@@ -9,3 +9,2 @@ "use strict"; | ||
const create_storybook_rule_1 = require("../utils/create-storybook-rule"); | ||
const ast_1 = require("../utils/ast"); | ||
module.exports = (0, create_storybook_rule_1.createStorybookRule)({ | ||
@@ -41,5 +40,3 @@ name: 'csf-component', | ||
} | ||
const componentProperty = meta.properties.find((property) => !(0, ast_1.isSpreadElement)(property) && | ||
'name' in property.key && | ||
property.key.name === 'component'); | ||
const componentProperty = meta.properties.find((property) => { var _a; return ((_a = property.key) === null || _a === void 0 ? void 0 : _a.name) === 'component'; }); | ||
if (!componentProperty) { | ||
@@ -46,0 +43,0 @@ context.report({ |
@@ -74,14 +74,14 @@ "use strict"; | ||
}; | ||
if (!componentName) { | ||
context.report(report); | ||
} | ||
else { | ||
const fix = (fixer) => fixer.insertTextBefore(node, `export default { component: ${componentName} }\n`); | ||
context.report(Object.assign(Object.assign({}, report), { fix, suggest: [ | ||
{ | ||
messageId: 'fixSuggestion', | ||
fix, | ||
}, | ||
] })); | ||
} | ||
const fix = (fixer) => { | ||
const metaDeclaration = componentName | ||
? `export default { component: ${componentName} }\n` | ||
: 'export default {}\n'; | ||
return fixer.insertTextBefore(node, metaDeclaration); | ||
}; | ||
context.report(Object.assign(Object.assign({}, report), { fix, suggest: [ | ||
{ | ||
messageId: 'fixSuggestion', | ||
fix, | ||
}, | ||
] })); | ||
} | ||
@@ -88,0 +88,0 @@ }, |
@@ -35,6 +35,8 @@ "use strict"; | ||
} | ||
const titleNode = meta.properties.find((prop) => { var _a; return !(0, ast_1.isSpreadElement)(prop) && 'name' in prop.key && ((_a = prop.key) === null || _a === void 0 ? void 0 : _a.name) === 'title'; }); | ||
const titleNode = meta.properties.find((prop) => { var _a; return ((_a = prop.key) === null || _a === void 0 ? void 0 : _a.name) === 'title'; }); | ||
//@ts-ignore | ||
if (!titleNode || !(0, ast_1.isLiteral)(titleNode.value)) { | ||
return; | ||
} | ||
//@ts-ignore | ||
const metaTitle = titleNode.value.raw || ''; | ||
@@ -48,3 +50,5 @@ if (metaTitle.includes('|')) { | ||
fix: function (fixer) { | ||
return fixer.replaceTextRange(titleNode.value.range, metaTitle.replace(/\|/g, '/')); | ||
return fixer.replaceTextRange( | ||
//@ts-ignore | ||
titleNode.value.range, metaTitle.replace(/\|/g, '/')); | ||
}, | ||
@@ -55,3 +59,5 @@ suggest: [ | ||
fix: function (fixer) { | ||
return fixer.replaceTextRange(titleNode.value.range, metaTitle.replace(/\|/g, '/')); | ||
return fixer.replaceTextRange( | ||
//@ts-ignore | ||
titleNode.value.range, metaTitle.replace(/\|/g, '/')); | ||
}, | ||
@@ -58,0 +64,0 @@ }, |
@@ -44,5 +44,2 @@ "use strict"; | ||
const isInline = (node) => { | ||
if (!('value' in node)) { | ||
return false; | ||
} | ||
return (node.value.type === 'ObjectExpression' || | ||
@@ -64,3 +61,5 @@ node.value.type === 'Literal' || | ||
let dynamicProperties = []; | ||
const metaNodes = meta.properties.filter((prop) => 'key' in prop && 'name' in prop.key && ruleProperties.includes(prop.key.name)); | ||
const metaNodes = meta.properties.filter((prop) => { var _a; | ||
//@ts-ignore | ||
return ruleProperties.includes((_a = prop.key) === null || _a === void 0 ? void 0 : _a.name); }); | ||
metaNodes.forEach((metaNode) => { | ||
@@ -72,2 +71,3 @@ if (!isInline(metaNode)) { | ||
if (dynamicProperties.length > 0) { | ||
//@ts-ignore | ||
dynamicProperties.forEach((propertyNode) => { | ||
@@ -74,0 +74,0 @@ var _a; |
@@ -53,5 +53,4 @@ "use strict"; | ||
const resolvedStoryName = (0, csf_1.storyNameFromExport)(name); | ||
if (!(0, ast_1.isSpreadElement)(storyNameNode) && | ||
(0, ast_1.isLiteral)(storyNameNode.value) && | ||
storyNameNode.value.value === resolvedStoryName) { | ||
//@ts-ignore | ||
if ((0, ast_1.isLiteral)(storyNameNode.value) && storyNameNode.value.value === resolvedStoryName) { | ||
context.report({ | ||
@@ -78,8 +77,3 @@ node: storyNameNode, | ||
const { left, right } = node; | ||
if ('property' in left && | ||
(0, ast_1.isIdentifier)(left.property) && | ||
!(0, ast_1.isMetaProperty)(left) && | ||
left.property.name === 'storyName') { | ||
if (!('name' in left.object && 'value' in right)) | ||
return; | ||
if ((0, ast_1.isIdentifier)(left.property) && left.property.name === 'storyName') { | ||
const propertyName = left.object.name; | ||
@@ -86,0 +80,0 @@ const propertyValue = right.value; |
@@ -9,3 +9,2 @@ "use strict"; | ||
const create_storybook_rule_1 = require("../utils/create-storybook-rule"); | ||
const ast_1 = require("../utils/ast"); | ||
module.exports = (0, create_storybook_rule_1.createStorybookRule)({ | ||
@@ -36,3 +35,3 @@ name: 'no-title-property-in-meta', | ||
} | ||
const titleNode = meta.properties.find((prop) => { var _a; return !(0, ast_1.isSpreadElement)(prop) && 'name' in prop.key && ((_a = prop.key) === null || _a === void 0 ? void 0 : _a.name) === 'title'; }); | ||
const titleNode = meta.properties.find((prop) => { var _a; return ((_a = prop.key) === null || _a === void 0 ? void 0 : _a.name) === 'title'; }); | ||
if (titleNode) { | ||
@@ -39,0 +38,0 @@ context.report({ |
@@ -37,8 +37,13 @@ "use strict"; | ||
const toPascalCase = (str) => { | ||
return str | ||
return (str | ||
//@ts-ignore | ||
.replace(new RegExp(/[-_]+/, 'g'), ' ') | ||
//@ts-ignore | ||
.replace(new RegExp(/[^\w\s]/, 'g'), '') | ||
.replace(new RegExp(/\s+(.)(\w+)/, 'g'), (_, $2, $3) => `${$2.toUpperCase() + $3.toLowerCase()}`) | ||
.replace( | ||
//@ts-ignore | ||
new RegExp(/\s+(.)(\w+)/, 'g'), ($1, $2, $3) => `${$2.toUpperCase() + $3.toLowerCase()}`) | ||
//@ts-ignore | ||
.replace(new RegExp(/\s/, 'g'), '') | ||
.replace(new RegExp(/\w/), (s) => s.toUpperCase()); | ||
.replace(new RegExp(/\w/), (s) => s.toUpperCase())); | ||
}; | ||
@@ -70,4 +75,3 @@ const checkAndReportError = (id, nonStoryExportsConfig = {}) => { | ||
const variable = experimental_utils_1.ASTUtils.findVariable(scope, name); | ||
const index = ((_a = variable === null || variable === void 0 ? void 0 : variable.references) === null || _a === void 0 ? void 0 : _a.length) || 0; | ||
for (let i = 0; i < index; i++) { | ||
for (let i = 0; i < ((_a = variable === null || variable === void 0 ? void 0 : variable.references) === null || _a === void 0 ? void 0 : _a.length); i++) { | ||
const ref = variable.references[i]; | ||
@@ -74,0 +78,0 @@ if (!ref.init) { |
@@ -23,3 +23,3 @@ "use strict"; | ||
}, | ||
fixable: undefined, | ||
fixable: null, | ||
schema: [], | ||
@@ -26,0 +26,0 @@ }, |
@@ -11,3 +11,3 @@ "use strict"; | ||
name: 'use-storybook-expect', | ||
defaultOptions: [{ storybookJestPath: '@storybook/jest' }], | ||
defaultOptions: [], | ||
meta: { | ||
@@ -33,6 +33,29 @@ type: 'suggestion', | ||
//---------------------------------------------------------------------- | ||
const getExpressionStatements = (body = []) => { | ||
return body.filter((b) => (0, ast_1.isExpressionStatement)(b)); | ||
}; | ||
//@ts-ignore | ||
const isExpect = (expression) => { | ||
return ((0, ast_1.isCallExpression)(expression) && | ||
(0, ast_1.isMemberExpression)(expression.callee) && | ||
(0, ast_1.isCallExpression)(expression.callee.object) && | ||
(0, ast_1.isIdentifier)(expression.callee.object.callee) && | ||
expression.callee.object.callee.name === 'expect'); | ||
}; | ||
const isExpectFromStorybookImported = (node) => { | ||
return (node.source.value === '@storybook/jest' && | ||
node.specifiers.find((spec) => (0, ast_1.isImportSpecifier)(spec) && spec.imported.name === 'expect')); | ||
node.specifiers.find((spec) => spec.imported.name === 'expect')); | ||
}; | ||
const checkExpectInvocations = (blockStatement) => { | ||
if (!(0, ast_1.isBlockStatement)(blockStatement)) { | ||
return; | ||
} | ||
const expressionBody = blockStatement.body || []; | ||
const expressionStatements = getExpressionStatements(expressionBody); | ||
expressionStatements.forEach(({ expression }) => { | ||
if (isExpect(expression)) { | ||
expectInvocations.push(expression); | ||
} | ||
}); | ||
}; | ||
//---------------------------------------------------------------------- | ||
@@ -59,2 +82,3 @@ // Public | ||
if (!isImportingFromStorybookExpect && expectInvocations.length) { | ||
//@ts-ignore | ||
expectInvocations.forEach((node) => { | ||
@@ -61,0 +85,0 @@ context.report({ |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.isMetaProperty = exports.isTSNonNullExpression = exports.isTSAsExpression = exports.isTSInterfaceDeclaration = exports.isTSTypeAliasDeclaration = exports.isProgram = exports.isFunctionExpression = exports.isFunctionDeclaration = exports.isReturnStatement = exports.isSpreadElement = exports.isProperty = exports.isObjectPattern = exports.isObjectExpression = exports.isNewExpression = exports.isMemberExpression = exports.isLiteral = exports.isJSXAttribute = exports.isImportSpecifier = exports.isImportNamespaceSpecifier = exports.isImportDefaultSpecifier = exports.isImportDeclaration = exports.isSequenceExpression = exports.isAssignmentExpression = exports.isVariableDeclaration = exports.isExpressionStatement = exports.isCallExpression = exports.isBlockStatement = exports.isArrowFunctionExpression = exports.isArrayExpression = exports.isVariableDeclarator = exports.isIdentifier = exports.isAwaitExpression = exports.ASTUtils = void 0; | ||
exports.isTSNonNullExpression = exports.isTSAsExpression = exports.isTSInterfaceDeclaration = exports.isTSTypeAliasDeclaration = exports.isProgram = exports.isFunctionExpression = exports.isFunctionDeclaration = exports.isReturnStatement = exports.isSpreadElement = exports.isProperty = exports.isObjectPattern = exports.isObjectExpression = exports.isNewExpression = exports.isMemberExpression = exports.isLiteral = exports.isJSXAttribute = exports.isImportSpecifier = exports.isImportNamespaceSpecifier = exports.isImportDefaultSpecifier = exports.isImportDeclaration = exports.isSequenceExpression = exports.isAssignmentExpression = exports.isVariableDeclaration = exports.isExpressionStatement = exports.isCallExpression = exports.isBlockStatement = exports.isArrowFunctionExpression = exports.isArrayExpression = exports.isVariableDeclarator = exports.isIdentifier = exports.isAwaitExpression = exports.ASTUtils = void 0; | ||
const experimental_utils_1 = require("@typescript-eslint/experimental-utils"); | ||
@@ -39,2 +39,1 @@ var experimental_utils_2 = require("@typescript-eslint/experimental-utils"); | ||
exports.isTSNonNullExpression = isNodeOfType(experimental_utils_1.AST_NODE_TYPES.TSNonNullExpression); | ||
exports.isMetaProperty = isNodeOfType(experimental_utils_1.AST_NODE_TYPES.MetaProperty); |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.getAllNamedExports = exports.isValidStoryExport = exports.getDescriptor = exports.getMetaObjectExpression = exports.docsUrl = void 0; | ||
exports.getAllNamedExports = exports.isValidStoryExport = exports.getDescriptor = exports.getMetaObjectExpression = exports.isPlayFunction = exports.docsUrl = void 0; | ||
const csf_1 = require("@storybook/csf"); | ||
@@ -9,2 +9,7 @@ const experimental_utils_1 = require("@typescript-eslint/experimental-utils"); | ||
exports.docsUrl = docsUrl; | ||
const isPlayFunction = (node) => { | ||
const propertyName = node.left && node.left.property && node.left.property.name; | ||
return propertyName === 'play'; | ||
}; | ||
exports.isPlayFunction = isPlayFunction; | ||
const getMetaObjectExpression = (node, context) => { | ||
@@ -26,5 +31,4 @@ let meta = node.declaration; | ||
const getDescriptor = (metaDeclaration, propertyName) => { | ||
const property = metaDeclaration && | ||
metaDeclaration.properties.find((p) => 'key' in p && 'name' in p.key && p.key.name === propertyName); | ||
if (!property || (0, ast_1.isSpreadElement)(property)) { | ||
const property = metaDeclaration && metaDeclaration.properties.find((p) => p.key && p.key.name === propertyName); | ||
if (!property) { | ||
return undefined; | ||
@@ -39,10 +43,6 @@ } | ||
} | ||
// @ts-ignore | ||
return t.value; | ||
}); | ||
case 'Literal': | ||
// TODO: Investigation needed. Type systems says, that "RegExpLiteral" does not exist | ||
// @ts-ignore | ||
case 'RegExpLiteral': | ||
// @ts-ignore | ||
return property.value.value; | ||
@@ -49,0 +49,0 @@ default: |
{ | ||
"name": "eslint-plugin-storybook", | ||
"version": "0.5.9--canary.acfda00.0", | ||
"version": "0.5.9--canary.f8f1b91.0", | ||
"description": "Best practice rules for Storybook", | ||
@@ -5,0 +5,0 @@ "keywords": [ |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
82362
1371