eslint-plugin-jsdoc 39.3.5 → 39.3.12
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/README.md +273 -52
- package/dist/WarnSettings.js +0 -5
- package/dist/WarnSettings.js.map +1 -1
- package/dist/alignTransform.js +69 -61
- package/dist/alignTransform.js.map +1 -1
- package/dist/bin/generateRule.js +7 -26
- package/dist/bin/generateRule.js.map +1 -1
- package/dist/defaultTagOrder.js +30 -14
- package/dist/defaultTagOrder.js.map +1 -1
- package/dist/exportParser.js +34 -143
- package/dist/exportParser.js.map +1 -1
- package/dist/generateRule.js +7 -26
- package/dist/generateRule.js.map +1 -1
- package/dist/getDefaultTagStructureForMode.js +189 -93
- package/dist/getDefaultTagStructureForMode.js.map +1 -1
- package/dist/index.js +0 -51
- package/dist/index.js.map +1 -1
- package/dist/iterateJsdoc.js +44 -207
- package/dist/iterateJsdoc.js.map +1 -1
- package/dist/jsdocUtils.js +72 -221
- package/dist/jsdocUtils.js.map +1 -1
- package/dist/rules/checkAccess.js +0 -8
- package/dist/rules/checkAccess.js.map +1 -1
- package/dist/rules/checkAlignment.js +0 -8
- package/dist/rules/checkAlignment.js.map +1 -1
- package/dist/rules/checkExamples.js +25 -63
- package/dist/rules/checkExamples.js.map +1 -1
- package/dist/rules/checkIndentation.js +0 -7
- package/dist/rules/checkIndentation.js.map +1 -1
- package/dist/rules/checkLineAlignment.js +9 -30
- package/dist/rules/checkLineAlignment.js.map +1 -1
- package/dist/rules/checkParamNames.js +9 -47
- package/dist/rules/checkParamNames.js.map +1 -1
- package/dist/rules/checkPropertyNames.js +1 -18
- package/dist/rules/checkPropertyNames.js.map +1 -1
- package/dist/rules/checkSyntax.js +2 -5
- package/dist/rules/checkSyntax.js.map +1 -1
- package/dist/rules/checkTagNames.js +0 -18
- package/dist/rules/checkTagNames.js.map +1 -1
- package/dist/rules/checkTypes.js +17 -46
- package/dist/rules/checkTypes.js.map +1 -1
- package/dist/rules/checkValues.js +0 -18
- package/dist/rules/checkValues.js.map +1 -1
- package/dist/rules/emptyTags.js +6 -11
- package/dist/rules/emptyTags.js.map +1 -1
- package/dist/rules/implementsOnClasses.js +0 -6
- package/dist/rules/implementsOnClasses.js.map +1 -1
- package/dist/rules/matchDescription.js +0 -20
- package/dist/rules/matchDescription.js.map +1 -1
- package/dist/rules/matchName.js +2 -17
- package/dist/rules/matchName.js.map +1 -1
- package/dist/rules/multilineBlocks.js +10 -34
- package/dist/rules/multilineBlocks.js.map +1 -1
- package/dist/rules/newlineAfterDescription.js +0 -8
- package/dist/rules/newlineAfterDescription.js.map +1 -1
- package/dist/rules/noBadBlocks.js +2 -16
- package/dist/rules/noBadBlocks.js.map +1 -1
- package/dist/rules/noDefaults.js +0 -7
- package/dist/rules/noDefaults.js.map +1 -1
- package/dist/rules/noMissingSyntax.js +2 -16
- package/dist/rules/noMissingSyntax.js.map +1 -1
- package/dist/rules/noMultiAsterisks.js +2 -16
- package/dist/rules/noMultiAsterisks.js.map +1 -1
- package/dist/rules/noRestrictedSyntax.js +3 -9
- package/dist/rules/noRestrictedSyntax.js.map +1 -1
- package/dist/rules/noTypes.js +0 -7
- package/dist/rules/noTypes.js.map +1 -1
- package/dist/rules/noUndefinedTypes.js +13 -34
- package/dist/rules/noUndefinedTypes.js.map +1 -1
- package/dist/rules/requireAsteriskPrefix.js +2 -26
- package/dist/rules/requireAsteriskPrefix.js.map +1 -1
- package/dist/rules/requireDescription.js +0 -17
- package/dist/rules/requireDescription.js.map +1 -1
- package/dist/rules/requireDescriptionCompleteSentence.js +13 -34
- package/dist/rules/requireDescriptionCompleteSentence.js.map +1 -1
- package/dist/rules/requireExample.js +0 -9
- package/dist/rules/requireExample.js.map +1 -1
- package/dist/rules/requireFileOverview.js +0 -16
- package/dist/rules/requireFileOverview.js.map +1 -1
- package/dist/rules/requireHyphenBeforeParamDescription.js +2 -16
- package/dist/rules/requireHyphenBeforeParamDescription.js.map +1 -1
- package/dist/rules/requireJsdoc.js +13 -58
- package/dist/rules/requireJsdoc.js.map +1 -1
- package/dist/rules/requireParam.js +6 -53
- package/dist/rules/requireParam.js.map +1 -1
- package/dist/rules/requireParamDescription.js +0 -4
- package/dist/rules/requireParamDescription.js.map +1 -1
- package/dist/rules/requireParamName.js +0 -4
- package/dist/rules/requireParamName.js.map +1 -1
- package/dist/rules/requireParamType.js +0 -4
- package/dist/rules/requireParamType.js.map +1 -1
- package/dist/rules/requireProperty.js +0 -9
- package/dist/rules/requireProperty.js.map +1 -1
- package/dist/rules/requirePropertyDescription.js +0 -4
- package/dist/rules/requirePropertyDescription.js.map +1 -1
- package/dist/rules/requirePropertyName.js +0 -4
- package/dist/rules/requirePropertyName.js.map +1 -1
- package/dist/rules/requirePropertyType.js +0 -4
- package/dist/rules/requirePropertyType.js.map +1 -1
- package/dist/rules/requireReturns.js +13 -23
- package/dist/rules/requireReturns.js.map +1 -1
- package/dist/rules/requireReturnsCheck.js +12 -20
- package/dist/rules/requireReturnsCheck.js.map +1 -1
- package/dist/rules/requireReturnsDescription.js +0 -6
- package/dist/rules/requireReturnsDescription.js.map +1 -1
- package/dist/rules/requireReturnsType.js +0 -4
- package/dist/rules/requireReturnsType.js.map +1 -1
- package/dist/rules/requireThrows.js +6 -15
- package/dist/rules/requireThrows.js.map +1 -1
- package/dist/rules/requireYields.js +13 -29
- package/dist/rules/requireYields.js.map +1 -1
- package/dist/rules/requireYieldsCheck.js +8 -29
- package/dist/rules/requireYieldsCheck.js.map +1 -1
- package/dist/rules/sortTags.js +17 -30
- package/dist/rules/sortTags.js.map +1 -1
- package/dist/rules/tagLines.js +0 -26
- package/dist/rules/tagLines.js.map +1 -1
- package/dist/rules/validTypes.js +22 -53
- package/dist/rules/validTypes.js.map +1 -1
- package/dist/tagNames.js +7 -4
- package/dist/tagNames.js.map +1 -1
- package/dist/utils/hasReturnValue.js +22 -66
- package/dist/utils/hasReturnValue.js.map +1 -1
- package/package.json +16 -16
package/dist/exportParser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exportParser.js","names":["debug","debugModule","createNode","props","getSymbolValue","symbol","type","value","getIdentifier","node","globals","scope","opts","simpleIdentifier","identifierLiteral","name","block","createSymbol","getSymbol","opt","obj","object","propertySymbol","property","computed","propertyValue","body","val","prototype","left","right","method","key","parent","prop","properties","includes","propVal","createBlockSymbol","isGlobal","window","special","id","valueSymbol","initVariables","childNode","expression","declaration","declarations","initWindow","kind","mapVariables","isExport","ancestorsOnly","init","exported","ANONYMOUS_DEFAULT","specifier","specifiers","local","findNode","cache","blockCache","slice","push","propval","Object","values","Array","isArray","some","exportTypes","Set","ignorableNestedTypes","getExportAncestor","nde","idx","ignorableIfDeep","has","canBeExportedByAncestorType","canExportChildrenType","isExportByAncestor","findExportedNode","isNodeExported","moduleExports","module","exports","initModuleExports","esm","parseRecursive","globalVars","parse","ast","isUncommentedExport","sourceCode","settings","exportNode","findJSDocComment","parseResult"],"sources":["../src/exportParser.js"],"sourcesContent":["import {\n findJSDocComment,\n} from '@es-joy/jsdoccomment';\nimport debugModule from 'debug';\n\nconst debug = debugModule('requireExportJsdoc');\n\nconst createNode = function () {\n return {\n props: {},\n };\n};\n\nconst getSymbolValue = function (symbol) {\n /* istanbul ignore next */\n if (!symbol) {\n /* istanbul ignore next */\n return null;\n }\n\n /* istanbul ignore next */\n if (symbol.type === 'literal') {\n return symbol.value.value;\n }\n\n /* istanbul ignore next */\n return null;\n};\n\nconst getIdentifier = function (node, globals, scope, opts) {\n if (opts.simpleIdentifier) {\n // Type is Identier for noncomputed properties\n const identifierLiteral = createNode();\n identifierLiteral.type = 'literal';\n identifierLiteral.value = {\n value: node.name,\n };\n\n return identifierLiteral;\n }\n\n /* istanbul ignore next */\n const block = scope || globals;\n\n // As scopes are not currently supported, they are not traversed upwards recursively\n if (block.props[node.name]) {\n return block.props[node.name];\n }\n\n // Seems this will only be entered once scopes added and entered\n /* istanbul ignore next */\n if (globals.props[node.name]) {\n return globals.props[node.name];\n }\n\n return null;\n};\n\nlet createSymbol = null;\n\n// eslint-disable-next-line complexity\nconst getSymbol = function (node, globals, scope, opt) {\n const opts = opt || {};\n /* istanbul ignore next */\n // eslint-disable-next-line default-case\n switch (node.type) {\n case 'Identifier': {\n return getIdentifier(node, globals, scope, opts);\n }\n\n case 'MemberExpression': {\n const obj = getSymbol(node.object, globals, scope, opts);\n const propertySymbol = getSymbol(node.property, globals, scope, {\n simpleIdentifier: !node.computed,\n });\n const propertyValue = getSymbolValue(propertySymbol);\n\n /* istanbul ignore next */\n if (obj && propertyValue && obj.props[propertyValue]) {\n const block = obj.props[propertyValue];\n\n return block;\n }\n\n /*\n if (opts.createMissingProps && propertyValue) {\n obj.props[propertyValue] = createNode();\n\n return obj.props[propertyValue];\n }\n */\n /* istanbul ignore next */\n debug(`MemberExpression: Missing property ${node.property.name}`);\n\n /* istanbul ignore next */\n return null;\n }\n\n case 'ClassExpression': {\n return getSymbol(node.body, globals, scope, opts);\n }\n\n case 'TSTypeAliasDeclaration':\n case 'TSEnumDeclaration': case 'TSInterfaceDeclaration':\n case 'ClassDeclaration':\n case 'FunctionExpression': case 'FunctionDeclaration':\n case 'ArrowFunctionExpression': {\n const val = createNode();\n val.props.prototype = createNode();\n val.props.prototype.type = 'object';\n val.type = 'object';\n val.value = node;\n\n return val;\n }\n\n case 'AssignmentExpression': {\n return createSymbol(node.left, globals, node.right, scope, opts);\n }\n\n case 'ClassBody': {\n const val = createNode();\n for (const method of node.body) {\n val.props[method.key.name] = createNode();\n val.props[method.key.name].type = 'object';\n val.props[method.key.name].value = method.value;\n }\n\n val.type = 'object';\n val.value = node.parent;\n\n return val;\n }\n\n case 'ObjectExpression': {\n const val = createNode();\n val.type = 'object';\n for (const prop of node.properties) {\n if ([\n // @typescript-eslint/parser, espree, acorn, etc.\n 'SpreadElement',\n\n // @babel/eslint-parser\n 'ExperimentalSpreadProperty',\n ].includes(prop.type)) {\n continue;\n }\n\n const propVal = getSymbol(prop.value, globals, scope, opts);\n /* istanbul ignore next */\n if (propVal) {\n val.props[prop.key.name] = propVal;\n }\n }\n\n return val;\n }\n\n case 'Literal': {\n const val = createNode();\n val.type = 'literal';\n val.value = node;\n\n return val;\n }\n }\n\n /* istanbul ignore next */\n return null;\n};\n\nconst createBlockSymbol = function (block, name, value, globals, isGlobal) {\n block.props[name] = value;\n if (isGlobal && globals.props.window && globals.props.window.special) {\n globals.props.window.props[name] = value;\n }\n};\n\ncreateSymbol = function (node, globals, value, scope, isGlobal) {\n const block = scope || globals;\n let symbol;\n // eslint-disable-next-line default-case\n switch (node.type) {\n case 'FunctionDeclaration':\n /* istanbul ignore next */\n // Fall through\n case 'TSEnumDeclaration': case 'TSInterfaceDeclaration':\n /* istanbul ignore next */\n // Fall through\n case 'TSTypeAliasDeclaration': case 'ClassDeclaration': {\n /* istanbul ignore next */\n if (node.id && node.id.type === 'Identifier') {\n return createSymbol(node.id, globals, node, globals);\n }\n\n /* istanbul ignore next */\n break;\n }\n\n case 'Identifier': {\n if (value) {\n const valueSymbol = getSymbol(value, globals, block);\n /* istanbul ignore next */\n if (valueSymbol) {\n createBlockSymbol(block, node.name, valueSymbol, globals, isGlobal);\n\n return block.props[node.name];\n }\n\n /* istanbul ignore next */\n debug('Identifier: Missing value symbol for %s', node.name);\n } else {\n createBlockSymbol(block, node.name, createNode(), globals, isGlobal);\n\n return block.props[node.name];\n }\n\n /* istanbul ignore next */\n break;\n }\n\n case 'MemberExpression': {\n symbol = getSymbol(node.object, globals, block);\n\n const propertySymbol = getSymbol(node.property, globals, block, {\n simpleIdentifier: !node.computed,\n });\n const propertyValue = getSymbolValue(propertySymbol);\n if (symbol && propertyValue) {\n createBlockSymbol(symbol, propertyValue, getSymbol(value, globals, block), globals, isGlobal);\n\n return symbol.props[propertyValue];\n }\n\n /* istanbul ignore next */\n debug('MemberExpression: Missing symbol: %s', node.property.name);\n break;\n }\n }\n\n return null;\n};\n\n// Creates variables from variable definitions\nconst initVariables = function (node, globals, opts) {\n // eslint-disable-next-line default-case\n switch (node.type) {\n case 'Program': {\n for (const childNode of node.body) {\n initVariables(childNode, globals, opts);\n }\n\n break;\n }\n\n case 'ExpressionStatement': {\n initVariables(node.expression, globals, opts);\n break;\n }\n\n case 'VariableDeclaration': {\n for (const declaration of node.declarations) {\n // let and const\n const symbol = createSymbol(declaration.id, globals, null, globals);\n if (opts.initWindow && node.kind === 'var' && globals.props.window) {\n // If var, also add to window\n globals.props.window.props[declaration.id.name] = symbol;\n }\n }\n\n break;\n }\n\n case 'ExportNamedDeclaration': {\n if (node.declaration) {\n initVariables(node.declaration, globals, opts);\n }\n\n break;\n }\n }\n};\n\n// Populates variable maps using AST\n// eslint-disable-next-line complexity\nconst mapVariables = function (node, globals, opt, isExport) {\n /* istanbul ignore next */\n const opts = opt || {};\n /* istanbul ignore next */\n switch (node.type) {\n case 'Program': {\n if (opts.ancestorsOnly) {\n return false;\n }\n\n for (const childNode of node.body) {\n mapVariables(childNode, globals, opts);\n }\n\n break;\n }\n\n case 'ExpressionStatement': {\n mapVariables(node.expression, globals, opts);\n break;\n }\n\n case 'AssignmentExpression': {\n createSymbol(node.left, globals, node.right);\n break;\n }\n\n case 'VariableDeclaration': {\n for (const declaration of node.declarations) {\n const isGlobal = opts.initWindow && node.kind === 'var' && globals.props.window;\n const symbol = createSymbol(declaration.id, globals, declaration.init, globals, isGlobal);\n if (symbol && isExport) {\n symbol.exported = true;\n }\n }\n\n break;\n }\n\n case 'FunctionDeclaration': {\n /* istanbul ignore next */\n if (node.id.type === 'Identifier') {\n createSymbol(node.id, globals, node, globals, true);\n }\n\n break;\n }\n\n case 'ExportDefaultDeclaration': {\n const symbol = createSymbol(node.declaration, globals, node.declaration);\n if (symbol) {\n symbol.exported = true;\n } else if (!node.id) {\n globals.ANONYMOUS_DEFAULT = node.declaration;\n }\n\n break;\n }\n\n case 'ExportNamedDeclaration': {\n if (node.declaration) {\n if (node.declaration.type === 'VariableDeclaration') {\n mapVariables(node.declaration, globals, opts, true);\n } else {\n const symbol = createSymbol(node.declaration, globals, node.declaration);\n /* istanbul ignore next */\n if (symbol) {\n symbol.exported = true;\n }\n }\n }\n\n for (const specifier of node.specifiers) {\n mapVariables(specifier, globals, opts);\n }\n\n break;\n }\n\n case 'ExportSpecifier': {\n const symbol = getSymbol(node.local, globals, globals);\n /* istanbul ignore next */\n if (symbol) {\n symbol.exported = true;\n }\n\n break;\n }\n\n case 'ClassDeclaration': {\n createSymbol(node.id, globals, node.body, globals);\n break;\n }\n\n default: {\n /* istanbul ignore next */\n return false;\n }\n }\n\n return true;\n};\n\nconst findNode = function (node, block, cache) {\n let blockCache = cache || [];\n /* istanbul ignore next */\n if (!block || blockCache.includes(block)) {\n return false;\n }\n\n blockCache = blockCache.slice();\n blockCache.push(block);\n\n if (\n (block.type === 'object' || block.type === 'MethodDefinition') &&\n block.value === node\n ) {\n return true;\n }\n\n const {\n props = block.body,\n } = block;\n for (const propval of Object.values(props || {})) {\n if (Array.isArray(propval)) {\n /* istanbul ignore if */\n if (propval.some((val) => {\n return findNode(node, val, blockCache);\n })) {\n return true;\n }\n } else if (findNode(node, propval, blockCache)) {\n return true;\n }\n }\n\n return false;\n};\n\nconst exportTypes = new Set([\n 'ExportNamedDeclaration', 'ExportDefaultDeclaration',\n]);\nconst ignorableNestedTypes = new Set([\n 'FunctionDeclaration', 'ArrowFunctionExpression', 'FunctionExpression',\n]);\nconst getExportAncestor = function (nde) {\n let node = nde;\n let idx = 0;\n const ignorableIfDeep = ignorableNestedTypes.has(nde?.type);\n while (node) {\n // Ignore functions nested more deeply than say `export default function () {}`\n if (idx >= 2 && ignorableIfDeep) {\n break;\n }\n\n if (exportTypes.has(node.type)) {\n return node;\n }\n\n node = node.parent;\n idx++;\n }\n\n return false;\n};\n\nconst canBeExportedByAncestorType = new Set([\n 'TSPropertySignature',\n 'TSMethodSignature',\n 'ClassProperty',\n 'PropertyDefinition',\n 'Method',\n]);\n\nconst canExportChildrenType = new Set([\n 'TSInterfaceBody',\n 'TSInterfaceDeclaration',\n 'TSTypeLiteral',\n 'TSTypeAliasDeclaration',\n 'ClassDeclaration',\n 'ClassBody',\n 'ClassDefinition',\n 'ClassExpression',\n 'Program',\n]);\n\nconst isExportByAncestor = function (nde) {\n if (!canBeExportedByAncestorType.has(nde.type)) {\n return false;\n }\n\n let node = nde.parent;\n while (node) {\n if (exportTypes.has(node.type)) {\n return node;\n }\n\n if (!canExportChildrenType.has(node.type)) {\n return false;\n }\n\n node = node.parent;\n }\n\n return false;\n};\n\nconst findExportedNode = function (block, node, cache) {\n /* istanbul ignore next */\n if (block === null) {\n return false;\n }\n\n const blockCache = cache || [];\n const {\n props,\n } = block;\n for (const propval of Object.values(props)) {\n blockCache.push(propval);\n if (propval.exported && (node === propval.value || findNode(node, propval.value))) {\n return true;\n }\n\n // No need to check `propval` for exported nodes as ESM\n // exports are only global\n }\n\n return false;\n};\n\nconst isNodeExported = function (node, globals, opt) {\n const moduleExports = globals.props.module?.props?.exports;\n if (\n opt.initModuleExports && moduleExports && findNode(node, moduleExports)\n ) {\n return true;\n }\n\n if (opt.initWindow && globals.props.window && findNode(node, globals.props.window)) {\n return true;\n }\n\n if (opt.esm && findExportedNode(globals, node)) {\n return true;\n }\n\n return false;\n};\n\nconst parseRecursive = function (node, globalVars, opts) {\n // Iterate from top using recursion - stop at first processed node from top\n if (node.parent && parseRecursive(node.parent, globalVars, opts)) {\n return true;\n }\n\n return mapVariables(node, globalVars, opts);\n};\n\nconst parse = function (ast, node, opt) {\n /* istanbul ignore next */\n const opts = opt || {\n ancestorsOnly: false,\n esm: true,\n initModuleExports: true,\n initWindow: true,\n };\n\n const globalVars = createNode();\n if (opts.initModuleExports) {\n globalVars.props.module = createNode();\n globalVars.props.module.props.exports = createNode();\n globalVars.props.exports = globalVars.props.module.props.exports;\n }\n\n if (opts.initWindow) {\n globalVars.props.window = createNode();\n globalVars.props.window.special = true;\n }\n\n if (opts.ancestorsOnly) {\n parseRecursive(node, globalVars, opts);\n } else {\n initVariables(ast, globalVars, opts);\n mapVariables(ast, globalVars, opts);\n }\n\n return {\n globalVars,\n };\n};\n\nconst isUncommentedExport = function (node, sourceCode, opt, settings) {\n // console.log({node});\n // Optimize with ancestor check for esm\n if (opt.esm) {\n const exportNode = getExportAncestor(node);\n\n // Is export node comment\n if (exportNode && !findJSDocComment(exportNode, sourceCode, settings)) {\n return true;\n }\n\n /**\n * Some typescript types are not in variable map, but inherit exported (interface property and method)\n */\n if (\n isExportByAncestor(node) &&\n !findJSDocComment(node, sourceCode, settings)\n ) {\n return true;\n }\n }\n\n const parseResult = parse(sourceCode.ast, node, opt);\n\n return isNodeExported(node, parseResult.globalVars, opt);\n};\n\nexport default {\n isUncommentedExport,\n parse,\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"exportParser.js","names":["debug","debugModule","createNode","props","getSymbolValue","symbol","type","value","getIdentifier","node","globals","scope","opts","simpleIdentifier","identifierLiteral","name","block","createSymbol","getSymbol","opt","obj","object","propertySymbol","property","computed","propertyValue","body","val","prototype","left","right","method","key","parent","prop","properties","includes","propVal","createBlockSymbol","isGlobal","window","special","id","valueSymbol","initVariables","childNode","expression","declaration","declarations","initWindow","kind","mapVariables","isExport","ancestorsOnly","init","exported","ANONYMOUS_DEFAULT","specifier","specifiers","local","findNode","cache","blockCache","slice","push","propval","Object","values","Array","isArray","some","exportTypes","Set","ignorableNestedTypes","getExportAncestor","nde","idx","ignorableIfDeep","has","canBeExportedByAncestorType","canExportChildrenType","isExportByAncestor","findExportedNode","isNodeExported","moduleExports","module","exports","initModuleExports","esm","parseRecursive","globalVars","parse","ast","isUncommentedExport","sourceCode","settings","exportNode","findJSDocComment","parseResult"],"sources":["../src/exportParser.js"],"sourcesContent":["import {\n findJSDocComment,\n} from '@es-joy/jsdoccomment';\nimport debugModule from 'debug';\n\nconst debug = debugModule('requireExportJsdoc');\n\nconst createNode = function () {\n return {\n props: {},\n };\n};\n\nconst getSymbolValue = function (symbol) {\n /* istanbul ignore next */\n if (!symbol) {\n /* istanbul ignore next */\n return null;\n }\n\n /* istanbul ignore next */\n if (symbol.type === 'literal') {\n return symbol.value.value;\n }\n\n /* istanbul ignore next */\n return null;\n};\n\nconst getIdentifier = function (node, globals, scope, opts) {\n if (opts.simpleIdentifier) {\n // Type is Identier for noncomputed properties\n const identifierLiteral = createNode();\n identifierLiteral.type = 'literal';\n identifierLiteral.value = {\n value: node.name,\n };\n\n return identifierLiteral;\n }\n\n /* istanbul ignore next */\n const block = scope || globals;\n\n // As scopes are not currently supported, they are not traversed upwards recursively\n if (block.props[node.name]) {\n return block.props[node.name];\n }\n\n // Seems this will only be entered once scopes added and entered\n /* istanbul ignore next */\n if (globals.props[node.name]) {\n return globals.props[node.name];\n }\n\n return null;\n};\n\nlet createSymbol = null;\n\n// eslint-disable-next-line complexity\nconst getSymbol = function (node, globals, scope, opt) {\n const opts = opt || {};\n /* istanbul ignore next */\n // eslint-disable-next-line default-case\n switch (node.type) {\n case 'Identifier': {\n return getIdentifier(node, globals, scope, opts);\n }\n\n case 'MemberExpression': {\n const obj = getSymbol(node.object, globals, scope, opts);\n const propertySymbol = getSymbol(node.property, globals, scope, {\n simpleIdentifier: !node.computed,\n });\n const propertyValue = getSymbolValue(propertySymbol);\n\n /* istanbul ignore next */\n if (obj && propertyValue && obj.props[propertyValue]) {\n const block = obj.props[propertyValue];\n\n return block;\n }\n\n /*\n if (opts.createMissingProps && propertyValue) {\n obj.props[propertyValue] = createNode();\n\n return obj.props[propertyValue];\n }\n */\n /* istanbul ignore next */\n debug(`MemberExpression: Missing property ${node.property.name}`);\n\n /* istanbul ignore next */\n return null;\n }\n\n case 'ClassExpression': {\n return getSymbol(node.body, globals, scope, opts);\n }\n\n case 'TSTypeAliasDeclaration':\n case 'TSEnumDeclaration': case 'TSInterfaceDeclaration':\n case 'ClassDeclaration':\n case 'FunctionExpression': case 'FunctionDeclaration':\n case 'ArrowFunctionExpression': {\n const val = createNode();\n val.props.prototype = createNode();\n val.props.prototype.type = 'object';\n val.type = 'object';\n val.value = node;\n\n return val;\n }\n\n case 'AssignmentExpression': {\n return createSymbol(node.left, globals, node.right, scope, opts);\n }\n\n case 'ClassBody': {\n const val = createNode();\n for (const method of node.body) {\n val.props[method.key.name] = createNode();\n val.props[method.key.name].type = 'object';\n val.props[method.key.name].value = method.value;\n }\n\n val.type = 'object';\n val.value = node.parent;\n\n return val;\n }\n\n case 'ObjectExpression': {\n const val = createNode();\n val.type = 'object';\n for (const prop of node.properties) {\n if ([\n // @typescript-eslint/parser, espree, acorn, etc.\n 'SpreadElement',\n\n // @babel/eslint-parser\n 'ExperimentalSpreadProperty',\n ].includes(prop.type)) {\n continue;\n }\n\n const propVal = getSymbol(prop.value, globals, scope, opts);\n /* istanbul ignore next */\n if (propVal) {\n val.props[prop.key.name] = propVal;\n }\n }\n\n return val;\n }\n\n case 'Literal': {\n const val = createNode();\n val.type = 'literal';\n val.value = node;\n\n return val;\n }\n }\n\n /* istanbul ignore next */\n return null;\n};\n\nconst createBlockSymbol = function (block, name, value, globals, isGlobal) {\n block.props[name] = value;\n if (isGlobal && globals.props.window && globals.props.window.special) {\n globals.props.window.props[name] = value;\n }\n};\n\ncreateSymbol = function (node, globals, value, scope, isGlobal) {\n const block = scope || globals;\n let symbol;\n // eslint-disable-next-line default-case\n switch (node.type) {\n case 'FunctionDeclaration':\n /* istanbul ignore next */\n // Fall through\n case 'TSEnumDeclaration': case 'TSInterfaceDeclaration':\n /* istanbul ignore next */\n // Fall through\n case 'TSTypeAliasDeclaration': case 'ClassDeclaration': {\n /* istanbul ignore next */\n if (node.id && node.id.type === 'Identifier') {\n return createSymbol(node.id, globals, node, globals);\n }\n\n /* istanbul ignore next */\n break;\n }\n\n case 'Identifier': {\n if (value) {\n const valueSymbol = getSymbol(value, globals, block);\n /* istanbul ignore next */\n if (valueSymbol) {\n createBlockSymbol(block, node.name, valueSymbol, globals, isGlobal);\n\n return block.props[node.name];\n }\n\n /* istanbul ignore next */\n debug('Identifier: Missing value symbol for %s', node.name);\n } else {\n createBlockSymbol(block, node.name, createNode(), globals, isGlobal);\n\n return block.props[node.name];\n }\n\n /* istanbul ignore next */\n break;\n }\n\n case 'MemberExpression': {\n symbol = getSymbol(node.object, globals, block);\n\n const propertySymbol = getSymbol(node.property, globals, block, {\n simpleIdentifier: !node.computed,\n });\n const propertyValue = getSymbolValue(propertySymbol);\n if (symbol && propertyValue) {\n createBlockSymbol(symbol, propertyValue, getSymbol(value, globals, block), globals, isGlobal);\n\n return symbol.props[propertyValue];\n }\n\n /* istanbul ignore next */\n debug('MemberExpression: Missing symbol: %s', node.property.name);\n break;\n }\n }\n\n return null;\n};\n\n// Creates variables from variable definitions\nconst initVariables = function (node, globals, opts) {\n // eslint-disable-next-line default-case\n switch (node.type) {\n case 'Program': {\n for (const childNode of node.body) {\n initVariables(childNode, globals, opts);\n }\n\n break;\n }\n\n case 'ExpressionStatement': {\n initVariables(node.expression, globals, opts);\n break;\n }\n\n case 'VariableDeclaration': {\n for (const declaration of node.declarations) {\n // let and const\n const symbol = createSymbol(declaration.id, globals, null, globals);\n if (opts.initWindow && node.kind === 'var' && globals.props.window) {\n // If var, also add to window\n globals.props.window.props[declaration.id.name] = symbol;\n }\n }\n\n break;\n }\n\n case 'ExportNamedDeclaration': {\n if (node.declaration) {\n initVariables(node.declaration, globals, opts);\n }\n\n break;\n }\n }\n};\n\n// Populates variable maps using AST\n// eslint-disable-next-line complexity\nconst mapVariables = function (node, globals, opt, isExport) {\n /* istanbul ignore next */\n const opts = opt || {};\n /* istanbul ignore next */\n switch (node.type) {\n case 'Program': {\n if (opts.ancestorsOnly) {\n return false;\n }\n\n for (const childNode of node.body) {\n mapVariables(childNode, globals, opts);\n }\n\n break;\n }\n\n case 'ExpressionStatement': {\n mapVariables(node.expression, globals, opts);\n break;\n }\n\n case 'AssignmentExpression': {\n createSymbol(node.left, globals, node.right);\n break;\n }\n\n case 'VariableDeclaration': {\n for (const declaration of node.declarations) {\n const isGlobal = opts.initWindow && node.kind === 'var' && globals.props.window;\n const symbol = createSymbol(declaration.id, globals, declaration.init, globals, isGlobal);\n if (symbol && isExport) {\n symbol.exported = true;\n }\n }\n\n break;\n }\n\n case 'FunctionDeclaration': {\n /* istanbul ignore next */\n if (node.id.type === 'Identifier') {\n createSymbol(node.id, globals, node, globals, true);\n }\n\n break;\n }\n\n case 'ExportDefaultDeclaration': {\n const symbol = createSymbol(node.declaration, globals, node.declaration);\n if (symbol) {\n symbol.exported = true;\n } else if (!node.id) {\n globals.ANONYMOUS_DEFAULT = node.declaration;\n }\n\n break;\n }\n\n case 'ExportNamedDeclaration': {\n if (node.declaration) {\n if (node.declaration.type === 'VariableDeclaration') {\n mapVariables(node.declaration, globals, opts, true);\n } else {\n const symbol = createSymbol(node.declaration, globals, node.declaration);\n /* istanbul ignore next */\n if (symbol) {\n symbol.exported = true;\n }\n }\n }\n\n for (const specifier of node.specifiers) {\n mapVariables(specifier, globals, opts);\n }\n\n break;\n }\n\n case 'ExportSpecifier': {\n const symbol = getSymbol(node.local, globals, globals);\n /* istanbul ignore next */\n if (symbol) {\n symbol.exported = true;\n }\n\n break;\n }\n\n case 'ClassDeclaration': {\n createSymbol(node.id, globals, node.body, globals);\n break;\n }\n\n default: {\n /* istanbul ignore next */\n return false;\n }\n }\n\n return true;\n};\n\nconst findNode = function (node, block, cache) {\n let blockCache = cache || [];\n /* istanbul ignore next */\n if (!block || blockCache.includes(block)) {\n return false;\n }\n\n blockCache = blockCache.slice();\n blockCache.push(block);\n\n if (\n (block.type === 'object' || block.type === 'MethodDefinition') &&\n block.value === node\n ) {\n return true;\n }\n\n const {\n props = block.body,\n } = block;\n for (const propval of Object.values(props || {})) {\n if (Array.isArray(propval)) {\n /* istanbul ignore if */\n if (propval.some((val) => {\n return findNode(node, val, blockCache);\n })) {\n return true;\n }\n } else if (findNode(node, propval, blockCache)) {\n return true;\n }\n }\n\n return false;\n};\n\nconst exportTypes = new Set([\n 'ExportNamedDeclaration', 'ExportDefaultDeclaration',\n]);\nconst ignorableNestedTypes = new Set([\n 'FunctionDeclaration', 'ArrowFunctionExpression', 'FunctionExpression',\n]);\nconst getExportAncestor = function (nde) {\n let node = nde;\n let idx = 0;\n const ignorableIfDeep = ignorableNestedTypes.has(nde?.type);\n while (node) {\n // Ignore functions nested more deeply than say `export default function () {}`\n if (idx >= 2 && ignorableIfDeep) {\n break;\n }\n\n if (exportTypes.has(node.type)) {\n return node;\n }\n\n node = node.parent;\n idx++;\n }\n\n return false;\n};\n\nconst canBeExportedByAncestorType = new Set([\n 'TSPropertySignature',\n 'TSMethodSignature',\n 'ClassProperty',\n 'PropertyDefinition',\n 'Method',\n]);\n\nconst canExportChildrenType = new Set([\n 'TSInterfaceBody',\n 'TSInterfaceDeclaration',\n 'TSTypeLiteral',\n 'TSTypeAliasDeclaration',\n 'ClassDeclaration',\n 'ClassBody',\n 'ClassDefinition',\n 'ClassExpression',\n 'Program',\n]);\n\nconst isExportByAncestor = function (nde) {\n if (!canBeExportedByAncestorType.has(nde.type)) {\n return false;\n }\n\n let node = nde.parent;\n while (node) {\n if (exportTypes.has(node.type)) {\n return node;\n }\n\n if (!canExportChildrenType.has(node.type)) {\n return false;\n }\n\n node = node.parent;\n }\n\n return false;\n};\n\nconst findExportedNode = function (block, node, cache) {\n /* istanbul ignore next */\n if (block === null) {\n return false;\n }\n\n const blockCache = cache || [];\n const {\n props,\n } = block;\n for (const propval of Object.values(props)) {\n blockCache.push(propval);\n if (propval.exported && (node === propval.value || findNode(node, propval.value))) {\n return true;\n }\n\n // No need to check `propval` for exported nodes as ESM\n // exports are only global\n }\n\n return false;\n};\n\nconst isNodeExported = function (node, globals, opt) {\n const moduleExports = globals.props.module?.props?.exports;\n if (\n opt.initModuleExports && moduleExports && findNode(node, moduleExports)\n ) {\n return true;\n }\n\n if (opt.initWindow && globals.props.window && findNode(node, globals.props.window)) {\n return true;\n }\n\n if (opt.esm && findExportedNode(globals, node)) {\n return true;\n }\n\n return false;\n};\n\nconst parseRecursive = function (node, globalVars, opts) {\n // Iterate from top using recursion - stop at first processed node from top\n if (node.parent && parseRecursive(node.parent, globalVars, opts)) {\n return true;\n }\n\n return mapVariables(node, globalVars, opts);\n};\n\nconst parse = function (ast, node, opt) {\n /* istanbul ignore next */\n const opts = opt || {\n ancestorsOnly: false,\n esm: true,\n initModuleExports: true,\n initWindow: true,\n };\n\n const globalVars = createNode();\n if (opts.initModuleExports) {\n globalVars.props.module = createNode();\n globalVars.props.module.props.exports = createNode();\n globalVars.props.exports = globalVars.props.module.props.exports;\n }\n\n if (opts.initWindow) {\n globalVars.props.window = createNode();\n globalVars.props.window.special = true;\n }\n\n if (opts.ancestorsOnly) {\n parseRecursive(node, globalVars, opts);\n } else {\n initVariables(ast, globalVars, opts);\n mapVariables(ast, globalVars, opts);\n }\n\n return {\n globalVars,\n };\n};\n\nconst isUncommentedExport = function (node, sourceCode, opt, settings) {\n // console.log({node});\n // Optimize with ancestor check for esm\n if (opt.esm) {\n const exportNode = getExportAncestor(node);\n\n // Is export node comment\n if (exportNode && !findJSDocComment(exportNode, sourceCode, settings)) {\n return true;\n }\n\n /**\n * Some typescript types are not in variable map, but inherit exported (interface property and method)\n */\n if (\n isExportByAncestor(node) &&\n !findJSDocComment(node, sourceCode, settings)\n ) {\n return true;\n }\n }\n\n const parseResult = parse(sourceCode.ast, node, opt);\n\n return isNodeExported(node, parseResult.globalVars, opt);\n};\n\nexport default {\n isUncommentedExport,\n parse,\n};\n"],"mappings":"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"}
|
package/dist/generateRule.js
CHANGED
|
@@ -1,44 +1,32 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _fs = require("fs");
|
|
4
|
-
|
|
5
4
|
var _promises = _interopRequireDefault(require("fs/promises"));
|
|
6
|
-
|
|
7
5
|
var _path = require("path");
|
|
8
|
-
|
|
9
6
|
var _camelcase = _interopRequireDefault(require("camelcase"));
|
|
10
|
-
|
|
11
7
|
var _openEditor = _interopRequireDefault(require("open-editor"));
|
|
12
|
-
|
|
13
8
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
14
|
-
|
|
15
9
|
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
16
|
-
|
|
17
10
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
18
|
-
|
|
19
11
|
// Todo: Would ideally have prompts, e.g., to ask for whether type was problem/layout, etc.
|
|
12
|
+
|
|
20
13
|
const [,, ruleName, ...options] = process.argv;
|
|
21
14
|
const recommended = options.includes('--recommended');
|
|
22
|
-
|
|
23
15
|
(async () => {
|
|
24
16
|
if (!ruleName) {
|
|
25
17
|
console.error('Please supply a rule name');
|
|
26
18
|
return;
|
|
27
19
|
}
|
|
28
|
-
|
|
29
20
|
if (/[A-Z]/u.test(ruleName)) {
|
|
30
21
|
console.error('Please ensure the rule has no capital letters');
|
|
31
22
|
return;
|
|
32
23
|
}
|
|
33
|
-
|
|
34
24
|
const ruleNamesPath = './test/rules/ruleNames.json';
|
|
35
25
|
const ruleNames = JSON.parse(await _promises.default.readFile(ruleNamesPath, 'utf8'));
|
|
36
|
-
|
|
37
26
|
if (!ruleNames.includes(ruleName)) {
|
|
38
27
|
ruleNames.push(ruleName);
|
|
39
28
|
ruleNames.sort();
|
|
40
29
|
}
|
|
41
|
-
|
|
42
30
|
await _promises.default.writeFile(ruleNamesPath, JSON.stringify(ruleNames, null, 2) + '\n');
|
|
43
31
|
console.log('ruleNames', ruleNames);
|
|
44
32
|
const ruleTemplate = `import iterateJsdoc from '../iterateJsdoc';
|
|
@@ -70,11 +58,9 @@ export default iterateJsdoc(({
|
|
|
70
58
|
`;
|
|
71
59
|
const camelCasedRuleName = (0, _camelcase.default)(ruleName);
|
|
72
60
|
const rulePath = `./src/rules/${camelCasedRuleName}.js`;
|
|
73
|
-
|
|
74
61
|
if (!(0, _fs.existsSync)(rulePath)) {
|
|
75
62
|
await _promises.default.writeFile(rulePath, ruleTemplate);
|
|
76
63
|
}
|
|
77
|
-
|
|
78
64
|
const ruleTestTemplate = `export default {
|
|
79
65
|
invalid: [
|
|
80
66
|
{
|
|
@@ -95,11 +81,9 @@ export default iterateJsdoc(({
|
|
|
95
81
|
};
|
|
96
82
|
`;
|
|
97
83
|
const ruleTestPath = `./test/rules/assertions/${camelCasedRuleName}.js`;
|
|
98
|
-
|
|
99
84
|
if (!(0, _fs.existsSync)(ruleTestPath)) {
|
|
100
85
|
await _promises.default.writeFile(ruleTestPath, ruleTestTemplate);
|
|
101
86
|
}
|
|
102
|
-
|
|
103
87
|
const ruleReadmeTemplate = `### \`${ruleName}\`
|
|
104
88
|
|
|
105
89
|
|||
|
|
@@ -113,11 +97,9 @@ export default iterateJsdoc(({
|
|
|
113
97
|
<!-- assertions ${camelCasedRuleName} -->
|
|
114
98
|
`;
|
|
115
99
|
const ruleReadmePath = `./.README/rules/${ruleName}.md`;
|
|
116
|
-
|
|
117
100
|
if (!(0, _fs.existsSync)(ruleReadmePath)) {
|
|
118
101
|
await _promises.default.writeFile(ruleReadmePath, ruleReadmeTemplate);
|
|
119
102
|
}
|
|
120
|
-
|
|
121
103
|
const replaceInOrder = async ({
|
|
122
104
|
path,
|
|
123
105
|
oldRegex,
|
|
@@ -152,17 +134,15 @@ export default iterateJsdoc(({
|
|
|
152
134
|
return oldIsCamel ? camelCasedRuleName < oldRule : ruleName < oldRule;
|
|
153
135
|
});
|
|
154
136
|
let item = itemIndex !== undefined && offsets[itemIndex];
|
|
155
|
-
|
|
156
|
-
|
|
137
|
+
if (item && itemIndex === 0 &&
|
|
138
|
+
// This property would not always be sufficient but in this case it is.
|
|
157
139
|
oldIsCamel) {
|
|
158
140
|
item.offset = 0;
|
|
159
141
|
}
|
|
160
|
-
|
|
161
142
|
if (!item) {
|
|
162
143
|
item = offsets.pop();
|
|
163
144
|
item.offset += item.matchedLine.length;
|
|
164
145
|
}
|
|
165
|
-
|
|
166
146
|
if (alreadyIncluded) {
|
|
167
147
|
console.log(`Rule name is already present in ${checkName}.`);
|
|
168
148
|
} else {
|
|
@@ -170,7 +150,6 @@ export default iterateJsdoc(({
|
|
|
170
150
|
await _promises.default.writeFile(path, readme);
|
|
171
151
|
}
|
|
172
152
|
};
|
|
173
|
-
|
|
174
153
|
await replaceInOrder({
|
|
175
154
|
checkName: 'README',
|
|
176
155
|
newLine: `{"gitdown": "include", "file": "./rules/${ruleName}.md"}`,
|
|
@@ -197,16 +176,18 @@ export default iterateJsdoc(({
|
|
|
197
176
|
path: './src/index.js'
|
|
198
177
|
});
|
|
199
178
|
await Promise.resolve().then(() => _interopRequireWildcard(require('./generateReadme.js')));
|
|
179
|
+
|
|
200
180
|
/*
|
|
201
181
|
console.log('Paths to open for further editing\n');
|
|
202
182
|
console.log(`open ${ruleReadmePath}`);
|
|
203
183
|
console.log(`open ${rulePath}`);
|
|
204
184
|
console.log(`open ${ruleTestPath}\n`);
|
|
205
185
|
*/
|
|
206
|
-
// Set chdir as somehow still in operation from other test
|
|
207
186
|
|
|
187
|
+
// Set chdir as somehow still in operation from other test
|
|
208
188
|
process.chdir((0, _path.resolve)(__dirname, '../../'));
|
|
209
|
-
await (0, _openEditor.default)([
|
|
189
|
+
await (0, _openEditor.default)([
|
|
190
|
+
// Could even add editor line column numbers like `${rulePath}:1:1`
|
|
210
191
|
ruleReadmePath, ruleTestPath, rulePath]);
|
|
211
192
|
})();
|
|
212
193
|
//# sourceMappingURL=generateRule.js.map
|
package/dist/generateRule.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateRule.js","names":["ruleName","options","process","argv","recommended","includes","console","error","test","ruleNamesPath","ruleNames","JSON","parse","fs","readFile","push","sort","writeFile","stringify","log","ruleTemplate","camelCasedRuleName","camelCase","rulePath","existsSync","ruleTestTemplate","ruleTestPath","ruleReadmeTemplate","ruleReadmePath","replaceInOrder","path","oldRegex","checkName","newLine","oldIsCamel","offsets","readme","replace","matchedLine","n1","offset","str","oldRule","oldRuleB","alreadyIncluded","itemIndex","findIndex","item","undefined","pop","length","slice","repeat","chdir","resolve","__dirname","open"],"sources":["../src/bin/generateRule.js"],"sourcesContent":["/* eslint-disable no-console -- CLI */\n\n/**\n * @example\n *\n * ```shell\n * npm run create-rule my-new-rule --recommended\n * ```\n */\n\nimport {\n existsSync,\n} from 'fs';\nimport fs from 'fs/promises';\nimport {\n resolve,\n} from 'path';\nimport camelCase from 'camelcase';\nimport open from 'open-editor';\n\n// Todo: Would ideally have prompts, e.g., to ask for whether type was problem/layout, etc.\n\nconst [\n , , ruleName,\n ...options\n] = process.argv;\n\nconst recommended = options.includes('--recommended');\n\n(async () => {\n if (!ruleName) {\n console.error('Please supply a rule name');\n\n return;\n }\n\n if ((/[A-Z]/u).test(ruleName)) {\n console.error('Please ensure the rule has no capital letters');\n\n return;\n }\n\n const ruleNamesPath = './test/rules/ruleNames.json';\n const ruleNames = JSON.parse(await fs.readFile(\n ruleNamesPath, 'utf8',\n ));\n if (!ruleNames.includes(ruleName)) {\n ruleNames.push(ruleName);\n ruleNames.sort();\n }\n\n await fs.writeFile(ruleNamesPath, JSON.stringify(ruleNames, null, 2) + '\\n');\n console.log('ruleNames', ruleNames);\n\n const ruleTemplate = `import iterateJsdoc from '../iterateJsdoc';\n\nexport default iterateJsdoc(({\n context,\n utils,\n}) => {\n // Rule here\n}, {\n iterateAllJsdocs: true,\n meta: {\n docs: {\n description: '',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-${ruleName}',\n },\n schema: [\n {\n additionalProperies: false,\n properties: {\n // Option properties here (or remove the object)\n },\n type: 'object',\n },\n ],\n type: 'suggestion',\n },\n});\n`;\n\n const camelCasedRuleName = camelCase(ruleName);\n\n const rulePath = `./src/rules/${camelCasedRuleName}.js`;\n\n if (!existsSync(rulePath)) {\n await fs.writeFile(rulePath, ruleTemplate);\n }\n\n const ruleTestTemplate = `export default {\n invalid: [\n {\n code: \\`\n \\`,\n errors: [{\n line: '',\n message: '',\n }],\n },\n ],\n valid: [\n {\n code: \\`\n \\`,\n },\n ],\n};\n`;\n\n const ruleTestPath = `./test/rules/assertions/${camelCasedRuleName}.js`;\n if (!existsSync(ruleTestPath)) {\n await fs.writeFile(ruleTestPath, ruleTestTemplate);\n }\n\n const ruleReadmeTemplate = `### \\`${ruleName}\\`\n\n|||\n|---|---|\n|Context|everywhere|\n|Tags|\\`\\`|\n|Recommended|${recommended ? 'true' : 'false'}|\n|Settings||\n|Options||\n\n<!-- assertions ${camelCasedRuleName} -->\n`;\n\n const ruleReadmePath = `./.README/rules/${ruleName}.md`;\n if (!existsSync(ruleReadmePath)) {\n await fs.writeFile(ruleReadmePath, ruleReadmeTemplate);\n }\n\n const replaceInOrder = async ({\n path,\n oldRegex,\n checkName,\n newLine,\n oldIsCamel,\n }) => {\n const offsets = [];\n\n let readme = await fs.readFile(path, 'utf8');\n readme.replace(\n oldRegex,\n (matchedLine, n1, offset, str, {\n oldRule,\n }) => {\n offsets.push({\n matchedLine,\n offset,\n oldRule,\n });\n },\n );\n\n offsets.sort(({\n oldRule,\n }, {\n oldRule: oldRuleB,\n }) => {\n // eslint-disable-next-line no-extra-parens\n return oldRule < oldRuleB ? -1 : (oldRule > oldRuleB ? 1 : 0);\n });\n\n let alreadyIncluded = false;\n const itemIndex = offsets.findIndex(({\n oldRule,\n }) => {\n alreadyIncluded ||= oldIsCamel ? camelCasedRuleName === oldRule : ruleName === oldRule;\n\n return oldIsCamel ? camelCasedRuleName < oldRule : ruleName < oldRule;\n });\n let item = itemIndex !== undefined && offsets[itemIndex];\n if (item && itemIndex === 0 &&\n\n // This property would not always be sufficient but in this case it is.\n oldIsCamel\n ) {\n item.offset = 0;\n }\n\n if (!item) {\n item = offsets.pop();\n item.offset += item.matchedLine.length;\n }\n\n if (alreadyIncluded) {\n console.log(`Rule name is already present in ${checkName}.`);\n } else {\n readme = readme.slice(0, item.offset) +\n (item.offset ? '\\n' : '') +\n newLine +\n (item.offset ? '' : '\\n') +\n readme.slice(item.offset);\n\n await fs.writeFile(path, readme);\n }\n };\n\n await replaceInOrder({\n checkName: 'README',\n newLine: `{\"gitdown\": \"include\", \"file\": \"./rules/${ruleName}.md\"}`,\n oldRegex: /\\n\\{\"gitdown\": \"include\", \"file\": \".\\/rules\\/(?<oldRule>[^.]*).md\"\\}/gu,\n path: './.README/README.md',\n });\n\n await replaceInOrder({\n checkName: 'index import',\n newLine: `import ${camelCasedRuleName} from './rules/${camelCasedRuleName}';`,\n oldIsCamel: true,\n oldRegex: /\\nimport (?<oldRule>[^ ]*) from '.\\/rules\\/\\1';/gu,\n path: './src/index.js',\n });\n\n await replaceInOrder({\n checkName: 'index recommended',\n newLine: `${' '.repeat(8)}'jsdoc/${ruleName}': '${recommended ? 'warn' : 'off'}',`,\n oldRegex: /\\n\\s{8}'jsdoc\\/(?<oldRule>[^']*)': '[^']*',/gu,\n path: './src/index.js',\n });\n\n await replaceInOrder({\n checkName: 'index rules',\n newLine: `${' '.repeat(4)}'${ruleName}': ${camelCasedRuleName},`,\n oldRegex: /\\n\\s{4}'(?<oldRule>[^']*)': [^,]*,/gu,\n path: './src/index.js',\n });\n\n await import('./generateReadme.js');\n\n /*\n console.log('Paths to open for further editing\\n');\n console.log(`open ${ruleReadmePath}`);\n console.log(`open ${rulePath}`);\n console.log(`open ${ruleTestPath}\\n`);\n */\n\n // Set chdir as somehow still in operation from other test\n process.chdir(resolve(__dirname, '../../'));\n await open([\n // Could even add editor line column numbers like `${rulePath}:1:1`\n ruleReadmePath,\n ruleTestPath,\n rulePath,\n ]);\n})();\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"generateRule.js","names":["ruleName","options","process","argv","recommended","includes","console","error","test","ruleNamesPath","ruleNames","JSON","parse","fs","readFile","push","sort","writeFile","stringify","log","ruleTemplate","camelCasedRuleName","camelCase","rulePath","existsSync","ruleTestTemplate","ruleTestPath","ruleReadmeTemplate","ruleReadmePath","replaceInOrder","path","oldRegex","checkName","newLine","oldIsCamel","offsets","readme","replace","matchedLine","n1","offset","str","oldRule","oldRuleB","alreadyIncluded","itemIndex","findIndex","item","undefined","pop","length","slice","repeat","chdir","resolve","__dirname","open"],"sources":["../src/bin/generateRule.js"],"sourcesContent":["/* eslint-disable no-console -- CLI */\n\n/**\n * @example\n *\n * ```shell\n * npm run create-rule my-new-rule --recommended\n * ```\n */\n\nimport {\n existsSync,\n} from 'fs';\nimport fs from 'fs/promises';\nimport {\n resolve,\n} from 'path';\nimport camelCase from 'camelcase';\nimport open from 'open-editor';\n\n// Todo: Would ideally have prompts, e.g., to ask for whether type was problem/layout, etc.\n\nconst [\n , , ruleName,\n ...options\n] = process.argv;\n\nconst recommended = options.includes('--recommended');\n\n(async () => {\n if (!ruleName) {\n console.error('Please supply a rule name');\n\n return;\n }\n\n if ((/[A-Z]/u).test(ruleName)) {\n console.error('Please ensure the rule has no capital letters');\n\n return;\n }\n\n const ruleNamesPath = './test/rules/ruleNames.json';\n const ruleNames = JSON.parse(await fs.readFile(\n ruleNamesPath, 'utf8',\n ));\n if (!ruleNames.includes(ruleName)) {\n ruleNames.push(ruleName);\n ruleNames.sort();\n }\n\n await fs.writeFile(ruleNamesPath, JSON.stringify(ruleNames, null, 2) + '\\n');\n console.log('ruleNames', ruleNames);\n\n const ruleTemplate = `import iterateJsdoc from '../iterateJsdoc';\n\nexport default iterateJsdoc(({\n context,\n utils,\n}) => {\n // Rule here\n}, {\n iterateAllJsdocs: true,\n meta: {\n docs: {\n description: '',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-${ruleName}',\n },\n schema: [\n {\n additionalProperies: false,\n properties: {\n // Option properties here (or remove the object)\n },\n type: 'object',\n },\n ],\n type: 'suggestion',\n },\n});\n`;\n\n const camelCasedRuleName = camelCase(ruleName);\n\n const rulePath = `./src/rules/${camelCasedRuleName}.js`;\n\n if (!existsSync(rulePath)) {\n await fs.writeFile(rulePath, ruleTemplate);\n }\n\n const ruleTestTemplate = `export default {\n invalid: [\n {\n code: \\`\n \\`,\n errors: [{\n line: '',\n message: '',\n }],\n },\n ],\n valid: [\n {\n code: \\`\n \\`,\n },\n ],\n};\n`;\n\n const ruleTestPath = `./test/rules/assertions/${camelCasedRuleName}.js`;\n if (!existsSync(ruleTestPath)) {\n await fs.writeFile(ruleTestPath, ruleTestTemplate);\n }\n\n const ruleReadmeTemplate = `### \\`${ruleName}\\`\n\n|||\n|---|---|\n|Context|everywhere|\n|Tags|\\`\\`|\n|Recommended|${recommended ? 'true' : 'false'}|\n|Settings||\n|Options||\n\n<!-- assertions ${camelCasedRuleName} -->\n`;\n\n const ruleReadmePath = `./.README/rules/${ruleName}.md`;\n if (!existsSync(ruleReadmePath)) {\n await fs.writeFile(ruleReadmePath, ruleReadmeTemplate);\n }\n\n const replaceInOrder = async ({\n path,\n oldRegex,\n checkName,\n newLine,\n oldIsCamel,\n }) => {\n const offsets = [];\n\n let readme = await fs.readFile(path, 'utf8');\n readme.replace(\n oldRegex,\n (matchedLine, n1, offset, str, {\n oldRule,\n }) => {\n offsets.push({\n matchedLine,\n offset,\n oldRule,\n });\n },\n );\n\n offsets.sort(({\n oldRule,\n }, {\n oldRule: oldRuleB,\n }) => {\n // eslint-disable-next-line no-extra-parens\n return oldRule < oldRuleB ? -1 : (oldRule > oldRuleB ? 1 : 0);\n });\n\n let alreadyIncluded = false;\n const itemIndex = offsets.findIndex(({\n oldRule,\n }) => {\n alreadyIncluded ||= oldIsCamel ? camelCasedRuleName === oldRule : ruleName === oldRule;\n\n return oldIsCamel ? camelCasedRuleName < oldRule : ruleName < oldRule;\n });\n let item = itemIndex !== undefined && offsets[itemIndex];\n if (item && itemIndex === 0 &&\n\n // This property would not always be sufficient but in this case it is.\n oldIsCamel\n ) {\n item.offset = 0;\n }\n\n if (!item) {\n item = offsets.pop();\n item.offset += item.matchedLine.length;\n }\n\n if (alreadyIncluded) {\n console.log(`Rule name is already present in ${checkName}.`);\n } else {\n readme = readme.slice(0, item.offset) +\n (item.offset ? '\\n' : '') +\n newLine +\n (item.offset ? '' : '\\n') +\n readme.slice(item.offset);\n\n await fs.writeFile(path, readme);\n }\n };\n\n await replaceInOrder({\n checkName: 'README',\n newLine: `{\"gitdown\": \"include\", \"file\": \"./rules/${ruleName}.md\"}`,\n oldRegex: /\\n\\{\"gitdown\": \"include\", \"file\": \".\\/rules\\/(?<oldRule>[^.]*).md\"\\}/gu,\n path: './.README/README.md',\n });\n\n await replaceInOrder({\n checkName: 'index import',\n newLine: `import ${camelCasedRuleName} from './rules/${camelCasedRuleName}';`,\n oldIsCamel: true,\n oldRegex: /\\nimport (?<oldRule>[^ ]*) from '.\\/rules\\/\\1';/gu,\n path: './src/index.js',\n });\n\n await replaceInOrder({\n checkName: 'index recommended',\n newLine: `${' '.repeat(8)}'jsdoc/${ruleName}': '${recommended ? 'warn' : 'off'}',`,\n oldRegex: /\\n\\s{8}'jsdoc\\/(?<oldRule>[^']*)': '[^']*',/gu,\n path: './src/index.js',\n });\n\n await replaceInOrder({\n checkName: 'index rules',\n newLine: `${' '.repeat(4)}'${ruleName}': ${camelCasedRuleName},`,\n oldRegex: /\\n\\s{4}'(?<oldRule>[^']*)': [^,]*,/gu,\n path: './src/index.js',\n });\n\n await import('./generateReadme.js');\n\n /*\n console.log('Paths to open for further editing\\n');\n console.log(`open ${ruleReadmePath}`);\n console.log(`open ${rulePath}`);\n console.log(`open ${ruleTestPath}\\n`);\n */\n\n // Set chdir as somehow still in operation from other test\n process.chdir(resolve(__dirname, '../../'));\n await open([\n // Could even add editor line column numbers like `${rulePath}:1:1`\n ruleReadmePath,\n ruleTestPath,\n rulePath,\n ]);\n})();\n"],"mappings":"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"}
|