eslint-plugin-jsdoc 61.1.5 → 61.1.7

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.
@@ -6,10 +6,10 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.default = void 0;
7
7
  var _index = _interopRequireDefault(require("../index.cjs"));
8
8
  var _decamelize = _interopRequireDefault(require("decamelize"));
9
- var _fs = _interopRequireDefault(require("fs"));
10
9
  var _gitdown = _interopRequireDefault(require("gitdown"));
11
10
  var _glob = require("glob");
12
- var _path = _interopRequireDefault(require("path"));
11
+ var _nodeFs = _interopRequireDefault(require("node:fs"));
12
+ var _nodePath = _interopRequireDefault(require("node:path"));
13
13
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
14
14
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); } /**
15
15
  * This script is used to inline assertions into the README.md documents.
@@ -60,11 +60,11 @@ const formatCodeSnippet = (setup, ruleName) => {
60
60
  return paragraphs.join('\n');
61
61
  };
62
62
  const getAssertions = async () => {
63
- const assertionFiles = (await (0, _glob.glob)(_path.default.resolve(dirname, '../../test/rules/assertions/*.js'))).filter(file => {
63
+ const assertionFiles = (await (0, _glob.glob)(_nodePath.default.resolve(dirname, '../../test/rules/assertions/*.js'))).filter(file => {
64
64
  return !file.includes('flatConfig');
65
65
  }).toReversed();
66
66
  const assertionNames = assertionFiles.map(filePath => {
67
- return _path.default.basename(filePath, '.js');
67
+ return _nodePath.default.basename(filePath, '.js');
68
68
  });
69
69
  const assertionCodes = await Promise.all(assertionFiles.map(async (filePath, idx) => {
70
70
  /**
@@ -102,7 +102,7 @@ const getAssertions = async () => {
102
102
  };
103
103
  };
104
104
  const getSomeBranch = () => {
105
- const gitConfig = _fs.default.readFileSync(_path.default.join(dirname, '../../.git/config')).toString();
105
+ const gitConfig = _nodeFs.default.readFileSync(_nodePath.default.join(dirname, '../../.git/config')).toString();
106
106
  const [, branch] = /\[branch "([^"]+)"\]/v.exec(gitConfig) || [];
107
107
  return branch;
108
108
  };
@@ -110,7 +110,7 @@ const getSomeBranch = () => {
110
110
  // Scan the directory for these instead?
111
111
  const extraFiles = ['settings.md', 'advanced.md', 'processors.md', 'README.md'];
112
112
  const otherPaths = extraFiles.map(extraFile => {
113
- return _path.default.join(dirname, '..', '..', '.README', extraFile);
113
+ return _nodePath.default.join(dirname, '..', '..', '.README', extraFile);
114
114
  });
115
115
  const generateDocs = async () => {
116
116
  const {
@@ -146,13 +146,13 @@ const generateDocs = async () => {
146
146
  decamelized,
147
147
  row: `|${recommended ? tsRecommended && tsRecommendedFlavor ? ':heavy_check_mark:' : ':heavy_check_mark: (' + (tsRecommended ? 'On in TS' : 'Off in TS') + '; ' + (tsRecommendedFlavor ? 'On in TS flavor' : 'Off in TS flavor') + ')' : tsRecommended || tsRecommendedFlavor ? (tsRecommended ? 'On in TS' : 'Off in TS') + '; ' + (tsRecommendedFlavor ? 'On in TS flavor' : 'Off in TS flavor') : ''}|${fixable ? ':wrench:' : ''}| [${decamelized}](./docs/rules/${decamelized}.md#readme) | ${ruleDescription} |`
148
148
  });
149
- return _path.default.join(dirname, '..', '..', '.README', 'rules', decamelized + '.md');
149
+ return _nodePath.default.join(dirname, '..', '..', '.README', 'rules', decamelized + '.md');
150
150
  }), ...otherPaths].map(async (docPath, idx) => {
151
151
  const gitdown = await _gitdown.default.readFile(docPath);
152
152
  gitdown.setConfig({
153
153
  gitinfo: {
154
154
  defaultBranchName: getSomeBranch() || 'master',
155
- gitPath: _path.default.join(dirname, '../../.git')
155
+ gitPath: _nodePath.default.join(dirname, '../../.git')
156
156
  }
157
157
  });
158
158
  gitdown.registerHelper('rules-table', {
@@ -273,9 +273,9 @@ ${type === 'object' && innerSchema.properties ? '' : escapeDescription(descripti
273
273
  * @returns {string[]}
274
274
  */
275
275
  const getDocPaths = () => {
276
- const basePath = _path.default.join(dirname, '..', '..', '.README');
277
- const writeBasePath = _path.default.join(dirname, '..', '..', 'docs');
278
- const docPaths = /** @type {string[]} */_fs.default.readdirSync(basePath).flatMap(docFile => {
276
+ const basePath = _nodePath.default.join(dirname, '..', '..', '.README');
277
+ const writeBasePath = _nodePath.default.join(dirname, '..', '..', 'docs');
278
+ const docPaths = /** @type {string[]} */_nodeFs.default.readdirSync(basePath).flatMap(docFile => {
279
279
  if (extraFiles.includes(docFile)) {
280
280
  // Will get path separately below
281
281
  return null;
@@ -283,16 +283,16 @@ const getDocPaths = () => {
283
283
  if (docFile === '.DS_Store') {
284
284
  return null;
285
285
  }
286
- const innerBasePath = _path.default.join(basePath, docFile);
287
- const writeInnerBasePath = _path.default.join(writeBasePath, docFile);
288
- const stat = _fs.default.statSync(innerBasePath);
286
+ const innerBasePath = _nodePath.default.join(basePath, docFile);
287
+ const writeInnerBasePath = _nodePath.default.join(writeBasePath, docFile);
288
+ const stat = _nodeFs.default.statSync(innerBasePath);
289
289
  if (stat.isFile()) {
290
290
  // Currently settings and advanced
291
291
  return writeInnerBasePath;
292
292
  }
293
293
  if (stat.isDirectory()) {
294
- return _fs.default.readdirSync(innerBasePath).map(innerDocFile => {
295
- return _path.default.join(writeInnerBasePath, innerDocFile);
294
+ return _nodeFs.default.readdirSync(innerBasePath).map(innerDocFile => {
295
+ return _nodePath.default.join(writeInnerBasePath, innerDocFile);
296
296
  }).sort((a, b) => {
297
297
  const newA = a.replace(/\.md/v, '');
298
298
  const newB = b.replace(/\.md/v, '');
@@ -302,21 +302,21 @@ const getDocPaths = () => {
302
302
  return null;
303
303
  }).filter(Boolean);
304
304
  return [...docPaths, ...extraFiles.slice(0, -1).map(extraFile => {
305
- return _path.default.join(dirname, '..', '..', 'docs', extraFile);
306
- }), _path.default.join(dirname, '..', '..', 'README.md')];
305
+ return _nodePath.default.join(dirname, '..', '..', 'docs', extraFile);
306
+ }), _nodePath.default.join(dirname, '..', '..', 'README.md')];
307
307
  };
308
308
  const generateDocsAndWriteToDisk = async () => {
309
309
  const [docContents, docPaths] = await Promise.all([generateDocs(), getDocPaths()]);
310
310
  for (const [idx, docContent] of docContents.entries()) {
311
311
  const destPath = docPaths[idx];
312
- _fs.default.writeFileSync(destPath, docContent);
312
+ _nodeFs.default.writeFileSync(destPath, docContent);
313
313
  }
314
314
  };
315
315
  const assertDocsAreUpToDate = async () => {
316
316
  const [docContents, docPaths] = await Promise.all([generateDocs(), getDocPaths()]);
317
317
  for (const [idx, docContent] of docContents.entries()) {
318
318
  const docPath = docPaths[idx];
319
- const isUpToDate = _fs.default.readFileSync(docPath, 'utf8') === docContent;
319
+ const isUpToDate = _nodeFs.default.readFileSync(docPath, 'utf8') === docContent;
320
320
  if (!isUpToDate) {
321
321
  throw new Error('Docs are not up to date, please run `pnpm run create-docs` to update it.');
322
322
  }
@@ -1 +1 @@
1
- {"version":3,"file":"generateDocs.cjs","names":["_index","_interopRequireDefault","require","_decamelize","_fs","_gitdown","_glob","_path","e","__esModule","default","_interopRequireWildcard","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","dirname","__dirname","escapeDescription","str","replaceAll","trimCode","code","lines","replace","trimEnd","split","firsLineIndentation","match","lastLineIndentation","length","firstIndentSize","lastIndentSize","map","line","index","lineIndentSize","Math","min","slice","join","formatCodeSnippet","setup","ruleName","paragraphs","push","settings","JSON","stringify","options","errors","message","getAssertions","assertionFiles","glob","path","resolve","filter","file","includes","toReversed","assertionNames","filePath","basename","assertionCodes","Promise","all","idx","codes","specifier","then","s","decamelize","separator","invalid","ignoreReadme","valid","assertions","fromEntries","assertionName","getSomeBranch","gitConfig","fs","readFileSync","toString","branch","exec","extraFiles","otherPaths","extraFile","generateDocs","schemas","tableRows","docContents","decamelized","plugin","rules","meta","schema","ruleDescription","docs","description","undefined","Error","fixable","recommended","configs","tsRecommended","tsRecommendedFlavor","row","docPath","gitdown","Gitdown","readFile","setConfig","gitinfo","defaultBranchName","gitPath","registerHelper","compile","toSorted","dc","convertFromSchema","jIdx","arr","nesting","ret","type","items","properties","property","innerSchema","entries","repeat","enum","val","anyOf","docContent","_assertionsBlock","passingFailing","ruleAssertions","getDocPaths","basePath","writeBasePath","docPaths","readdirSync","flatMap","docFile","innerBasePath","writeInnerBasePath","stat","statSync","isFile","isDirectory","innerDocFile","sort","a","b","newA","newB","Boolean","generateDocsAndWriteToDisk","destPath","writeFileSync","assertDocsAreUpToDate","isUpToDate","main","hasCheckFlag","process","argv","error","console","exit","_default","exports","module"],"sources":["../src/bin/generateDocs.js"],"sourcesContent":["import plugin from '../index.js';\nimport decamelize from 'decamelize';\nimport fs from 'fs';\nimport Gitdown from 'gitdown';\nimport {\n glob,\n} from 'glob';\n/**\n * This script is used to inline assertions into the README.md documents.\n */\nimport path from 'path';\n\nconst dirname = import.meta.dirname;\n\n/**\n * @param {string} str\n */\nconst escapeDescription = (str) => {\n return str.replaceAll(/(?<!`|\\* +|'|\\/\\/ )@\\w+/gv, '<code>$&</code>');\n};\n\n/**\n * @param {string} code\n * @returns {string}\n */\nconst trimCode = (code) => {\n let lines = code.replace(/^\\n/v, '').trimEnd().split('\\n');\n\n const firsLineIndentation = lines[0].match(/^\\s+/v);\n const lastLineIndentation = lines[lines.length - 1].match(/^\\s+/v);\n\n const firstIndentSize = firsLineIndentation ? firsLineIndentation[0].length : 0;\n const lastIndentSize = lastLineIndentation ? lastLineIndentation[0].length : 0;\n\n lines = lines.map((line, index) => {\n const lineIndentSize = firstIndentSize !== 0 || index === 0 ?\n Math.min(firstIndentSize, lastIndentSize) :\n lastIndentSize;\n\n return line.slice(lineIndentSize);\n });\n\n return lines.join('\\n').replaceAll('\\r', '\\\\r');\n};\n\n/**\n * @param {import('eslint').RuleTester.InvalidTestCase|import('eslint').RuleTester.ValidTestCase} setup\n * @param {string} ruleName\n * @returns {string}\n */\nconst formatCodeSnippet = (setup, ruleName) => {\n const paragraphs = [];\n\n paragraphs.push(trimCode(setup.code));\n\n if (setup.settings) {\n paragraphs.push(`// Settings: ${JSON.stringify(setup.settings)}`);\n }\n\n if (setup.options) {\n paragraphs.push(`// \"jsdoc/${ruleName}\": [\"error\"|\"warn\", ${JSON.stringify(setup.options).slice(1)}`);\n }\n\n if ('errors' in setup) {\n paragraphs.push(`// Message: ${\n /** @type {Array<import('eslint').RuleTester.TestCaseError>} */ (\n setup.errors\n )[0].message}`);\n }\n\n return paragraphs.join('\\n');\n};\n\nconst getAssertions = async () => {\n const assertionFiles = (await glob(path.resolve(dirname, '../../test/rules/assertions/*.js'))).filter((file) => {\n return !file.includes('flatConfig');\n }).toReversed();\n\n const assertionNames = assertionFiles.map((filePath) => {\n return path.basename(filePath, '.js');\n });\n\n const assertionCodes = await Promise.all(assertionFiles.map(async (filePath, idx) => {\n /**\n * @type {{\n * invalid: (import('eslint').RuleTester.InvalidTestCase & {ignoreReadme?: true})[],\n * valid: (import('eslint').RuleTester.ValidTestCase & {ignoreReadme?: true})[]\n * }}\n */\n const codes = (await import(filePath)).default;\n\n const ruleName = decamelize(assertionNames[idx], {\n separator: '-',\n });\n\n return {\n invalid: codes.invalid.filter(({\n ignoreReadme,\n }) => {\n return !ignoreReadme;\n }).map((setup) => {\n return formatCodeSnippet(setup, ruleName);\n }),\n valid: codes.valid.filter(({\n ignoreReadme,\n }) => {\n return !ignoreReadme;\n }).map((setup) => {\n return formatCodeSnippet(setup, ruleName);\n }),\n };\n }));\n\n return {\n assertionNames,\n assertions: Object.fromEntries(assertionNames.map((assertionName, index) => {\n return [\n assertionName, assertionCodes[index],\n ];\n })),\n };\n};\n\nconst getSomeBranch = () => {\n const gitConfig = fs.readFileSync(path.join(dirname, '../../.git/config')).toString();\n const [\n , branch,\n ] = /\\[branch \"([^\"]+)\"\\]/v.exec(gitConfig) || [];\n\n return branch;\n};\n\n// Scan the directory for these instead?\nconst extraFiles = [\n 'settings.md',\n 'advanced.md',\n 'processors.md',\n 'README.md',\n];\n\nconst otherPaths = extraFiles.map((extraFile) => {\n return path.join(dirname, '..', '..', '.README', extraFile);\n});\n\nconst generateDocs = async () => {\n const {\n assertionNames,\n assertions,\n } = await getAssertions();\n\n /** @type {import('json-schema').JSONSchema4[][]} */\n const schemas = [];\n\n /**\n * @type {{\n * decamelized: string,\n * row: string\n * }[]}\n */\n const tableRows = [];\n\n const docContents = await Promise.all([\n ...assertionNames.map((assertionName) => {\n const decamelized = decamelize(assertionName, {\n separator: '-',\n });\n schemas.push(\n /** @type {import('json-schema').JSONSchema4[]} */\n (plugin.rules?.[decamelized].meta?.schema),\n );\n const ruleDescription = plugin.rules?.[decamelized]?.meta?.docs?.description;\n if (ruleDescription === undefined) {\n throw new Error(`Rule ${assertionName} missing description`);\n }\n\n const fixable = plugin.rules?.[decamelized]?.meta?.fixable ?? null;\n\n const recommended = plugin.configs['flat/recommended'].rules?.['jsdoc/' + decamelized] !== 'off';\n const tsRecommended = plugin.configs['flat/recommended-typescript'].rules?.['jsdoc/' + decamelized] !== 'off';\n const tsRecommendedFlavor = plugin.configs['flat/recommended-typescript-flavor'].rules?.['jsdoc/' + decamelized] !== 'off';\n\n tableRows.push({\n decamelized,\n row: `|${\n recommended ?\n (tsRecommended && tsRecommendedFlavor ?\n ':heavy_check_mark:' :\n ':heavy_check_mark: (' + (tsRecommended ? 'On in TS' : 'Off in TS') +\n '; ' +\n (tsRecommendedFlavor ? 'On in TS flavor' : 'Off in TS flavor') +\n ')'\n ) :\n (tsRecommended || tsRecommendedFlavor ?\n (tsRecommended ? 'On in TS' : 'Off in TS') +\n '; ' +\n (tsRecommendedFlavor ? 'On in TS flavor' : 'Off in TS flavor') :\n '')\n }|${fixable ? ':wrench:' : ''}| [${decamelized}](./docs/rules/${decamelized}.md#readme) | ${ruleDescription} |`,\n });\n\n return path.join(\n dirname, '..', '..', '.README', 'rules', decamelized + '.md',\n );\n }),\n ...otherPaths,\n ].map(async (docPath, idx) => {\n const gitdown = await Gitdown.readFile(docPath);\n\n gitdown.setConfig({\n gitinfo: {\n defaultBranchName: getSomeBranch() || 'master',\n gitPath: path.join(dirname, '../../.git'),\n },\n });\n\n gitdown.registerHelper('rules-table', {\n compile () {\n return tableRows.toSorted(({\n decamelized,\n }, {\n decamelized: dc,\n }) => {\n return decamelized < dc ? -1 : (decamelized > dc ? 1 : 0);\n }).map(({\n row,\n }) => {\n return row;\n }).join('\\n');\n },\n });\n\n gitdown.registerHelper('options', {\n compile () {\n if (!schemas[idx]) {\n return '';\n }\n\n /**\n * @param {import('json-schema').JSONSchema4} schema\n * @param {number} jIdx\n * @param {import('json-schema').JSONSchema4[]} arr\n * @param {number} [nesting]\n */\n const convertFromSchema = (schema, jIdx, arr, nesting = 3) => {\n let ret = '';\n switch (schema.type) {\n case 'array':\n ret += convertFromSchema(\n /** @type {import('json-schema').JSONSchema4} */ (schema.items),\n 0,\n [],\n nesting + 1,\n );\n break;\n case 'object':\n if (!schema.properties) {\n break;\n }\n\n if (jIdx === 0) {\n ret += (nesting > 3 ? '\\n' : '') + (arr.length <= 1 ? 'A single' : 'An') +\n ' options object has the following properties.\\n';\n } else {\n ret += '\\n\\nThe next option is an object with the following properties.\\n';\n }\n\n if (schema.description) {\n ret += `\\n${escapeDescription(schema.description)}\\n`;\n }\n\n for (const [\n property,\n innerSchema,\n ] of Object.entries(schema.properties)) {\n const {\n description,\n type,\n } = innerSchema;\n if (!description) {\n throw new Error(\n 'Missing description for property ' + property + ' for rule ' + assertionNames[idx] + ' with schema ' + JSON.stringify(innerSchema),\n );\n }\n\n ret += '\\n' + '#'.repeat(nesting) + ` \\`${property}\\`\n\n${type === 'object' && innerSchema.properties ? '' : escapeDescription(description) + '\\n'}`;\n if (type === 'object' || type === 'array') {\n ret += convertFromSchema(innerSchema, 0, [], nesting + 1);\n }\n }\n\n break;\n case 'string':\n if (jIdx !== 0) {\n throw new Error('Unexpected string schema');\n }\n\n // If a simple string, should be documented by parent\n if (schema.enum) {\n ret += 'The first option is a string with the following possible values: ';\n ret += schema.enum?.map((val) => {\n return `\"${val}\"`;\n }).join(', ') + '.\\n';\n }\n\n if (schema.description) {\n ret += escapeDescription(schema.description);\n }\n\n break;\n default:\n // Describe on parent object\n if (schema.anyOf) {\n break;\n }\n\n throw new Error('Unrecognized type ' + schema.type + ' for schema: ' +\n JSON.stringify(schema));\n }\n\n return ret;\n };\n\n return schemas[idx].map((schema, jIdx, arr) => {\n return convertFromSchema(schema, jIdx, arr);\n }).join('');\n },\n });\n\n return gitdown.get();\n }));\n\n return docContents.map((docContent) => {\n return docContent.replaceAll(\n /<!-- assertions-(passing|failing) ([a-z]+?) -->/gvi,\n /**\n * @param {string} _assertionsBlock\n * @param {string} passingFailing\n * @param {string} ruleName\n * @returns {string}\n */\n (_assertionsBlock, passingFailing, ruleName) => {\n const ruleAssertions = assertions[ruleName];\n\n if (!ruleAssertions) {\n throw new Error(`No assertions available for rule \"${ruleName}\".`);\n }\n\n return passingFailing === 'failing' ?\n 'The following patterns are considered problems:\\n\\n````ts\\n' +\n ruleAssertions.invalid.join('\\n\\n') + '\\n````\\n\\n' :\n 'The following patterns are not considered problems:\\n\\n````ts\\n' +\n ruleAssertions.valid.join('\\n\\n') + '\\n````\\n';\n },\n // Allow relative paths in source for #902 but generate compiled file in\n // manner compatible with GitHub and npmjs.com\n ).replaceAll('(../#', '(#user-content-eslint-plugin-jsdoc-');\n });\n};\n\n/**\n * @returns {string[]}\n */\nconst getDocPaths = () => {\n const basePath = path.join(dirname, '..', '..', '.README');\n const writeBasePath = path.join(dirname, '..', '..', 'docs');\n const docPaths = /** @type {string[]} */ (fs.readdirSync(basePath).flatMap((docFile) => {\n if (extraFiles.includes(docFile)) {\n // Will get path separately below\n return null;\n }\n\n if (docFile === '.DS_Store') {\n return null;\n }\n\n const innerBasePath = path.join(basePath, docFile);\n const writeInnerBasePath = path.join(writeBasePath, docFile);\n const stat = fs.statSync(innerBasePath);\n if (stat.isFile()) {\n // Currently settings and advanced\n return writeInnerBasePath;\n }\n\n if (stat.isDirectory()) {\n return fs.readdirSync(innerBasePath).map((innerDocFile) => {\n return path.join(writeInnerBasePath, innerDocFile);\n }).sort((a, b) => {\n const newA = a.replace(/\\.md/v, '');\n const newB = b.replace(/\\.md/v, '');\n return newA < newB ? -1 : (newB > newA ? 1 : 0);\n });\n }\n\n return null;\n }).filter(Boolean));\n\n return [\n ...docPaths,\n ...extraFiles.slice(0, -1).map((extraFile) => {\n return path.join(dirname, '..', '..', 'docs', extraFile);\n }),\n path.join(dirname, '..', '..', 'README.md'),\n ];\n};\n\nconst generateDocsAndWriteToDisk = async () => {\n const [\n docContents,\n docPaths,\n ] = await Promise.all([\n generateDocs(), getDocPaths(),\n ]);\n for (const [\n idx,\n docContent,\n ] of docContents.entries()) {\n const destPath = docPaths[idx];\n fs.writeFileSync(destPath, docContent);\n }\n};\n\nconst assertDocsAreUpToDate = async () => {\n const [\n docContents,\n docPaths,\n ] = await Promise.all([\n generateDocs(), getDocPaths(),\n ]);\n for (const [\n idx,\n docContent,\n ] of docContents.entries()) {\n const docPath = docPaths[idx];\n const isUpToDate = fs.readFileSync(docPath, 'utf8') === docContent;\n\n if (!isUpToDate) {\n throw new Error('Docs are not up to date, please run `pnpm run create-docs` to update it.');\n }\n }\n};\n\nconst main = async () => {\n try {\n const hasCheckFlag = process.argv.includes('--check');\n\n if (hasCheckFlag) {\n await assertDocsAreUpToDate();\n } else {\n await generateDocsAndWriteToDisk();\n }\n } catch (error) {\n /* eslint-disable-next-line no-console */\n console.error(error);\n\n process.exit(1);\n }\n};\n\nmain();\n\nexport default generateDocs;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"generateDocs.cjs","names":["_index","_interopRequireDefault","require","_decamelize","_gitdown","_glob","_nodeFs","_nodePath","e","__esModule","default","_interopRequireWildcard","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","dirname","__dirname","escapeDescription","str","replaceAll","trimCode","code","lines","replace","trimEnd","split","firsLineIndentation","match","lastLineIndentation","length","firstIndentSize","lastIndentSize","map","line","index","lineIndentSize","Math","min","slice","join","formatCodeSnippet","setup","ruleName","paragraphs","push","settings","JSON","stringify","options","errors","message","getAssertions","assertionFiles","glob","path","resolve","filter","file","includes","toReversed","assertionNames","filePath","basename","assertionCodes","Promise","all","idx","codes","specifier","then","s","decamelize","separator","invalid","ignoreReadme","valid","assertions","fromEntries","assertionName","getSomeBranch","gitConfig","fs","readFileSync","toString","branch","exec","extraFiles","otherPaths","extraFile","generateDocs","schemas","tableRows","docContents","decamelized","plugin","rules","meta","schema","ruleDescription","docs","description","undefined","Error","fixable","recommended","configs","tsRecommended","tsRecommendedFlavor","row","docPath","gitdown","Gitdown","readFile","setConfig","gitinfo","defaultBranchName","gitPath","registerHelper","compile","toSorted","dc","convertFromSchema","jIdx","arr","nesting","ret","type","items","properties","property","innerSchema","entries","repeat","enum","val","anyOf","docContent","_assertionsBlock","passingFailing","ruleAssertions","getDocPaths","basePath","writeBasePath","docPaths","readdirSync","flatMap","docFile","innerBasePath","writeInnerBasePath","stat","statSync","isFile","isDirectory","innerDocFile","sort","a","b","newA","newB","Boolean","generateDocsAndWriteToDisk","destPath","writeFileSync","assertDocsAreUpToDate","isUpToDate","main","hasCheckFlag","process","argv","error","console","exit","_default","exports","module"],"sources":["../src/bin/generateDocs.js"],"sourcesContent":["/**\n * This script is used to inline assertions into the README.md documents.\n */\nimport plugin from '../index.js';\nimport decamelize from 'decamelize';\nimport Gitdown from 'gitdown';\nimport {\n glob,\n} from 'glob';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nconst dirname = import.meta.dirname;\n\n/**\n * @param {string} str\n */\nconst escapeDescription = (str) => {\n return str.replaceAll(/(?<!`|\\* +|'|\\/\\/ )@\\w+/gv, '<code>$&</code>');\n};\n\n/**\n * @param {string} code\n * @returns {string}\n */\nconst trimCode = (code) => {\n let lines = code.replace(/^\\n/v, '').trimEnd().split('\\n');\n\n const firsLineIndentation = lines[0].match(/^\\s+/v);\n const lastLineIndentation = lines[lines.length - 1].match(/^\\s+/v);\n\n const firstIndentSize = firsLineIndentation ? firsLineIndentation[0].length : 0;\n const lastIndentSize = lastLineIndentation ? lastLineIndentation[0].length : 0;\n\n lines = lines.map((line, index) => {\n const lineIndentSize = firstIndentSize !== 0 || index === 0 ?\n Math.min(firstIndentSize, lastIndentSize) :\n lastIndentSize;\n\n return line.slice(lineIndentSize);\n });\n\n return lines.join('\\n').replaceAll('\\r', '\\\\r');\n};\n\n/**\n * @param {import('eslint').RuleTester.InvalidTestCase|import('eslint').RuleTester.ValidTestCase} setup\n * @param {string} ruleName\n * @returns {string}\n */\nconst formatCodeSnippet = (setup, ruleName) => {\n const paragraphs = [];\n\n paragraphs.push(trimCode(setup.code));\n\n if (setup.settings) {\n paragraphs.push(`// Settings: ${JSON.stringify(setup.settings)}`);\n }\n\n if (setup.options) {\n paragraphs.push(`// \"jsdoc/${ruleName}\": [\"error\"|\"warn\", ${JSON.stringify(setup.options).slice(1)}`);\n }\n\n if ('errors' in setup) {\n paragraphs.push(`// Message: ${\n /** @type {Array<import('eslint').RuleTester.TestCaseError>} */ (\n setup.errors\n )[0].message}`);\n }\n\n return paragraphs.join('\\n');\n};\n\nconst getAssertions = async () => {\n const assertionFiles = (await glob(path.resolve(dirname, '../../test/rules/assertions/*.js'))).filter((file) => {\n return !file.includes('flatConfig');\n }).toReversed();\n\n const assertionNames = assertionFiles.map((filePath) => {\n return path.basename(filePath, '.js');\n });\n\n const assertionCodes = await Promise.all(assertionFiles.map(async (filePath, idx) => {\n /**\n * @type {{\n * invalid: (import('eslint').RuleTester.InvalidTestCase & {ignoreReadme?: true})[],\n * valid: (import('eslint').RuleTester.ValidTestCase & {ignoreReadme?: true})[]\n * }}\n */\n const codes = (await import(filePath)).default;\n\n const ruleName = decamelize(assertionNames[idx], {\n separator: '-',\n });\n\n return {\n invalid: codes.invalid.filter(({\n ignoreReadme,\n }) => {\n return !ignoreReadme;\n }).map((setup) => {\n return formatCodeSnippet(setup, ruleName);\n }),\n valid: codes.valid.filter(({\n ignoreReadme,\n }) => {\n return !ignoreReadme;\n }).map((setup) => {\n return formatCodeSnippet(setup, ruleName);\n }),\n };\n }));\n\n return {\n assertionNames,\n assertions: Object.fromEntries(assertionNames.map((assertionName, index) => {\n return [\n assertionName, assertionCodes[index],\n ];\n })),\n };\n};\n\nconst getSomeBranch = () => {\n const gitConfig = fs.readFileSync(path.join(dirname, '../../.git/config')).toString();\n const [\n , branch,\n ] = /\\[branch \"([^\"]+)\"\\]/v.exec(gitConfig) || [];\n\n return branch;\n};\n\n// Scan the directory for these instead?\nconst extraFiles = [\n 'settings.md',\n 'advanced.md',\n 'processors.md',\n 'README.md',\n];\n\nconst otherPaths = extraFiles.map((extraFile) => {\n return path.join(dirname, '..', '..', '.README', extraFile);\n});\n\nconst generateDocs = async () => {\n const {\n assertionNames,\n assertions,\n } = await getAssertions();\n\n /** @type {import('json-schema').JSONSchema4[][]} */\n const schemas = [];\n\n /**\n * @type {{\n * decamelized: string,\n * row: string\n * }[]}\n */\n const tableRows = [];\n\n const docContents = await Promise.all([\n ...assertionNames.map((assertionName) => {\n const decamelized = decamelize(assertionName, {\n separator: '-',\n });\n schemas.push(\n /** @type {import('json-schema').JSONSchema4[]} */\n (plugin.rules?.[decamelized].meta?.schema),\n );\n const ruleDescription = plugin.rules?.[decamelized]?.meta?.docs?.description;\n if (ruleDescription === undefined) {\n throw new Error(`Rule ${assertionName} missing description`);\n }\n\n const fixable = plugin.rules?.[decamelized]?.meta?.fixable ?? null;\n\n const recommended = plugin.configs['flat/recommended'].rules?.['jsdoc/' + decamelized] !== 'off';\n const tsRecommended = plugin.configs['flat/recommended-typescript'].rules?.['jsdoc/' + decamelized] !== 'off';\n const tsRecommendedFlavor = plugin.configs['flat/recommended-typescript-flavor'].rules?.['jsdoc/' + decamelized] !== 'off';\n\n tableRows.push({\n decamelized,\n row: `|${\n recommended ?\n (tsRecommended && tsRecommendedFlavor ?\n ':heavy_check_mark:' :\n ':heavy_check_mark: (' + (tsRecommended ? 'On in TS' : 'Off in TS') +\n '; ' +\n (tsRecommendedFlavor ? 'On in TS flavor' : 'Off in TS flavor') +\n ')'\n ) :\n (tsRecommended || tsRecommendedFlavor ?\n (tsRecommended ? 'On in TS' : 'Off in TS') +\n '; ' +\n (tsRecommendedFlavor ? 'On in TS flavor' : 'Off in TS flavor') :\n '')\n }|${fixable ? ':wrench:' : ''}| [${decamelized}](./docs/rules/${decamelized}.md#readme) | ${ruleDescription} |`,\n });\n\n return path.join(\n dirname, '..', '..', '.README', 'rules', decamelized + '.md',\n );\n }),\n ...otherPaths,\n ].map(async (docPath, idx) => {\n const gitdown = await Gitdown.readFile(docPath);\n\n gitdown.setConfig({\n gitinfo: {\n defaultBranchName: getSomeBranch() || 'master',\n gitPath: path.join(dirname, '../../.git'),\n },\n });\n\n gitdown.registerHelper('rules-table', {\n compile () {\n return tableRows.toSorted(({\n decamelized,\n }, {\n decamelized: dc,\n }) => {\n return decamelized < dc ? -1 : (decamelized > dc ? 1 : 0);\n }).map(({\n row,\n }) => {\n return row;\n }).join('\\n');\n },\n });\n\n gitdown.registerHelper('options', {\n compile () {\n if (!schemas[idx]) {\n return '';\n }\n\n /**\n * @param {import('json-schema').JSONSchema4} schema\n * @param {number} jIdx\n * @param {import('json-schema').JSONSchema4[]} arr\n * @param {number} [nesting]\n */\n const convertFromSchema = (schema, jIdx, arr, nesting = 3) => {\n let ret = '';\n switch (schema.type) {\n case 'array':\n ret += convertFromSchema(\n /** @type {import('json-schema').JSONSchema4} */ (schema.items),\n 0,\n [],\n nesting + 1,\n );\n break;\n case 'object':\n if (!schema.properties) {\n break;\n }\n\n if (jIdx === 0) {\n ret += (nesting > 3 ? '\\n' : '') + (arr.length <= 1 ? 'A single' : 'An') +\n ' options object has the following properties.\\n';\n } else {\n ret += '\\n\\nThe next option is an object with the following properties.\\n';\n }\n\n if (schema.description) {\n ret += `\\n${escapeDescription(schema.description)}\\n`;\n }\n\n for (const [\n property,\n innerSchema,\n ] of Object.entries(schema.properties)) {\n const {\n description,\n type,\n } = innerSchema;\n if (!description) {\n throw new Error(\n 'Missing description for property ' + property + ' for rule ' + assertionNames[idx] + ' with schema ' + JSON.stringify(innerSchema),\n );\n }\n\n ret += '\\n' + '#'.repeat(nesting) + ` \\`${property}\\`\n\n${type === 'object' && innerSchema.properties ? '' : escapeDescription(description) + '\\n'}`;\n if (type === 'object' || type === 'array') {\n ret += convertFromSchema(innerSchema, 0, [], nesting + 1);\n }\n }\n\n break;\n case 'string':\n if (jIdx !== 0) {\n throw new Error('Unexpected string schema');\n }\n\n // If a simple string, should be documented by parent\n if (schema.enum) {\n ret += 'The first option is a string with the following possible values: ';\n ret += schema.enum?.map((val) => {\n return `\"${val}\"`;\n }).join(', ') + '.\\n';\n }\n\n if (schema.description) {\n ret += escapeDescription(schema.description);\n }\n\n break;\n default:\n // Describe on parent object\n if (schema.anyOf) {\n break;\n }\n\n throw new Error('Unrecognized type ' + schema.type + ' for schema: ' +\n JSON.stringify(schema));\n }\n\n return ret;\n };\n\n return schemas[idx].map((schema, jIdx, arr) => {\n return convertFromSchema(schema, jIdx, arr);\n }).join('');\n },\n });\n\n return gitdown.get();\n }));\n\n return docContents.map((docContent) => {\n return docContent.replaceAll(\n /<!-- assertions-(passing|failing) ([a-z]+?) -->/gvi,\n /**\n * @param {string} _assertionsBlock\n * @param {string} passingFailing\n * @param {string} ruleName\n * @returns {string}\n */\n (_assertionsBlock, passingFailing, ruleName) => {\n const ruleAssertions = assertions[ruleName];\n\n if (!ruleAssertions) {\n throw new Error(`No assertions available for rule \"${ruleName}\".`);\n }\n\n return passingFailing === 'failing' ?\n 'The following patterns are considered problems:\\n\\n````ts\\n' +\n ruleAssertions.invalid.join('\\n\\n') + '\\n````\\n\\n' :\n 'The following patterns are not considered problems:\\n\\n````ts\\n' +\n ruleAssertions.valid.join('\\n\\n') + '\\n````\\n';\n },\n // Allow relative paths in source for #902 but generate compiled file in\n // manner compatible with GitHub and npmjs.com\n ).replaceAll('(../#', '(#user-content-eslint-plugin-jsdoc-');\n });\n};\n\n/**\n * @returns {string[]}\n */\nconst getDocPaths = () => {\n const basePath = path.join(dirname, '..', '..', '.README');\n const writeBasePath = path.join(dirname, '..', '..', 'docs');\n const docPaths = /** @type {string[]} */ (fs.readdirSync(basePath).flatMap((docFile) => {\n if (extraFiles.includes(docFile)) {\n // Will get path separately below\n return null;\n }\n\n if (docFile === '.DS_Store') {\n return null;\n }\n\n const innerBasePath = path.join(basePath, docFile);\n const writeInnerBasePath = path.join(writeBasePath, docFile);\n const stat = fs.statSync(innerBasePath);\n if (stat.isFile()) {\n // Currently settings and advanced\n return writeInnerBasePath;\n }\n\n if (stat.isDirectory()) {\n return fs.readdirSync(innerBasePath).map((innerDocFile) => {\n return path.join(writeInnerBasePath, innerDocFile);\n }).sort((a, b) => {\n const newA = a.replace(/\\.md/v, '');\n const newB = b.replace(/\\.md/v, '');\n return newA < newB ? -1 : (newB > newA ? 1 : 0);\n });\n }\n\n return null;\n }).filter(Boolean));\n\n return [\n ...docPaths,\n ...extraFiles.slice(0, -1).map((extraFile) => {\n return path.join(dirname, '..', '..', 'docs', extraFile);\n }),\n path.join(dirname, '..', '..', 'README.md'),\n ];\n};\n\nconst generateDocsAndWriteToDisk = async () => {\n const [\n docContents,\n docPaths,\n ] = await Promise.all([\n generateDocs(), getDocPaths(),\n ]);\n for (const [\n idx,\n docContent,\n ] of docContents.entries()) {\n const destPath = docPaths[idx];\n fs.writeFileSync(destPath, docContent);\n }\n};\n\nconst assertDocsAreUpToDate = async () => {\n const [\n docContents,\n docPaths,\n ] = await Promise.all([\n generateDocs(), getDocPaths(),\n ]);\n for (const [\n idx,\n docContent,\n ] of docContents.entries()) {\n const docPath = docPaths[idx];\n const isUpToDate = fs.readFileSync(docPath, 'utf8') === docContent;\n\n if (!isUpToDate) {\n throw new Error('Docs are not up to date, please run `pnpm run create-docs` to update it.');\n }\n }\n};\n\nconst main = async () => {\n try {\n const hasCheckFlag = process.argv.includes('--check');\n\n if (hasCheckFlag) {\n await assertDocsAreUpToDate();\n } else {\n await generateDocsAndWriteToDisk();\n }\n } catch (error) {\n /* eslint-disable-next-line no-console */\n console.error(error);\n\n process.exit(1);\n }\n};\n\nmain();\n\nexport default generateDocs;\n"],"mappings":"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","ignoreList":[]}
@@ -4,8 +4,8 @@ var _escodegen = require("@es-joy/escodegen");
4
4
  var _decamelize = _interopRequireDefault(require("decamelize"));
5
5
  var _espree = require("espree");
6
6
  var _esquery = _interopRequireDefault(require("esquery"));
7
- var _promises = require("fs/promises");
8
- var _path = require("path");
7
+ var _promises = require("node:fs/promises");
8
+ var _nodePath = require("node:path");
9
9
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
10
10
  const rulesDir = './src/rules';
11
11
  const dirContents = await (0, _promises.readdir)(rulesDir);
@@ -13,7 +13,7 @@ for (const file of dirContents) {
13
13
  if (!file.endsWith('.js')) {
14
14
  continue;
15
15
  }
16
- const fileContents = await (0, _promises.readFile)((0, _path.join)(rulesDir, file), 'utf8');
16
+ const fileContents = await (0, _promises.readFile)((0, _nodePath.join)(rulesDir, file), 'utf8');
17
17
  // console.log('file', file);
18
18
  const ast = (0, _espree.parse)(fileContents, {
19
19
  ecmaVersion: 2_024,
@@ -52,7 +52,7 @@ for (const file of dirContents) {
52
52
  const hyphenatedRule = (0, _decamelize.default)(file, {
53
53
  separator: '-'
54
54
  }).replace(/\.js$/v, '.md');
55
- const docPath = (0, _path.join)('.README/rules', hyphenatedRule);
55
+ const docPath = (0, _nodePath.join)('.README/rules', hyphenatedRule);
56
56
  const ruleDocs = (await (0, _promises.readFile)(docPath, 'utf8')).replace(/(\|\s*Options\s*\|)([^\|]*)(\|)?/v, `$1${initial + Object.keys(obj.properties).map(key => {
57
57
  return `\`${key}\``;
58
58
  }).join(', ')}$3`);
@@ -1 +1 @@
1
- {"version":3,"file":"generateOptions.cjs","names":["_escodegen","require","_decamelize","_interopRequireDefault","_espree","_esquery","_promises","_path","e","__esModule","default","rulesDir","dirContents","readdir","file","endsWith","fileContents","readFile","join","ast","parse","ecmaVersion","sourceType","results","esquery","query","value","schema","generate","format","json","quotes","parsed","JSON","initial","Array","isArray","length","console","log","type","enum","map","item","shift","obj","hyphenatedRule","decamelize","separator","replace","docPath","ruleDocs","Object","keys","properties","key","writeFile"],"sources":["../src/bin/generateOptions.js"],"sourcesContent":["import {\n generate,\n} from '@es-joy/escodegen';\nimport decamelize from 'decamelize';\nimport {\n parse,\n} from 'espree';\nimport esquery from 'esquery';\nimport {\n readdir,\n readFile,\n writeFile,\n} from 'fs/promises';\nimport {\n join,\n} from 'path';\n\nconst rulesDir = './src/rules';\n\nconst dirContents = await readdir(rulesDir);\n\nfor (const file of dirContents) {\n if (!file.endsWith('.js')) {\n continue;\n }\n\n const fileContents = await readFile(join(rulesDir, file), 'utf8');\n // console.log('file', file);\n const ast = parse(fileContents, {\n ecmaVersion: 2_024,\n sourceType: 'module',\n });\n const results = esquery.query(\n ast,\n 'ExportDefaultDeclaration[declaration.callee.name=\"iterateJsdoc\"]' +\n ' Property[key.name=\"meta\"] Property[key.name=\"schema\"]',\n );\n if (results[0]?.value) {\n const schema = generate(results[0]?.value, {\n format: {\n json: true,\n quotes: 'double',\n },\n });\n const parsed = JSON.parse(schema);\n\n let initial = '';\n if (Array.isArray(parsed)) {\n if (!parsed.length) {\n // eslint-disable-next-line no-console -- CLI\n console.log('skipping no options', file);\n continue;\n }\n\n if (parsed.length >= 2) {\n if (parsed.length >= 3 || parsed[0].type !== 'string') {\n // eslint-disable-next-line no-console -- CLI\n console.log('unexpectedly large schema', file);\n continue;\n // throw new Error('Unexpected long schema array');\n }\n\n initial = `string (${parsed[0].enum.map((item) => {\n return `\"${item}\"`;\n }).join(', ')}) followed by object with `;\n parsed.shift();\n }\n }\n\n const obj = Array.isArray(parsed) ? parsed[0] : parsed;\n\n const hyphenatedRule = decamelize(file, {\n separator: '-',\n }).replace(/\\.js$/v, '.md');\n const docPath = join('.README/rules', hyphenatedRule);\n\n const ruleDocs = (await readFile(docPath, 'utf8'))\n .replace(/(\\|\\s*Options\\s*\\|)([^\\|]*)(\\|)?/v, `$1${\n initial +\n Object.keys(obj.properties).map((key) => {\n return `\\`${key}\\``;\n }).join(', ')\n }$3`);\n\n await writeFile(docPath, ruleDocs);\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"generateOptions.cjs","names":["_escodegen","require","_decamelize","_interopRequireDefault","_espree","_esquery","_promises","_nodePath","e","__esModule","default","rulesDir","dirContents","readdir","file","endsWith","fileContents","readFile","join","ast","parse","ecmaVersion","sourceType","results","esquery","query","value","schema","generate","format","json","quotes","parsed","JSON","initial","Array","isArray","length","console","log","type","enum","map","item","shift","obj","hyphenatedRule","decamelize","separator","replace","docPath","ruleDocs","Object","keys","properties","key","writeFile"],"sources":["../src/bin/generateOptions.js"],"sourcesContent":["import {\n generate,\n} from '@es-joy/escodegen';\nimport decamelize from 'decamelize';\nimport {\n parse,\n} from 'espree';\nimport esquery from 'esquery';\nimport {\n readdir,\n readFile,\n writeFile,\n} from 'node:fs/promises';\nimport {\n join,\n} from 'node:path';\n\nconst rulesDir = './src/rules';\n\nconst dirContents = await readdir(rulesDir);\n\nfor (const file of dirContents) {\n if (!file.endsWith('.js')) {\n continue;\n }\n\n const fileContents = await readFile(join(rulesDir, file), 'utf8');\n // console.log('file', file);\n const ast = parse(fileContents, {\n ecmaVersion: 2_024,\n sourceType: 'module',\n });\n const results = esquery.query(\n ast,\n 'ExportDefaultDeclaration[declaration.callee.name=\"iterateJsdoc\"]' +\n ' Property[key.name=\"meta\"] Property[key.name=\"schema\"]',\n );\n if (results[0]?.value) {\n const schema = generate(results[0]?.value, {\n format: {\n json: true,\n quotes: 'double',\n },\n });\n const parsed = JSON.parse(schema);\n\n let initial = '';\n if (Array.isArray(parsed)) {\n if (!parsed.length) {\n // eslint-disable-next-line no-console -- CLI\n console.log('skipping no options', file);\n continue;\n }\n\n if (parsed.length >= 2) {\n if (parsed.length >= 3 || parsed[0].type !== 'string') {\n // eslint-disable-next-line no-console -- CLI\n console.log('unexpectedly large schema', file);\n continue;\n // throw new Error('Unexpected long schema array');\n }\n\n initial = `string (${parsed[0].enum.map((item) => {\n return `\"${item}\"`;\n }).join(', ')}) followed by object with `;\n parsed.shift();\n }\n }\n\n const obj = Array.isArray(parsed) ? parsed[0] : parsed;\n\n const hyphenatedRule = decamelize(file, {\n separator: '-',\n }).replace(/\\.js$/v, '.md');\n const docPath = join('.README/rules', hyphenatedRule);\n\n const ruleDocs = (await readFile(docPath, 'utf8'))\n .replace(/(\\|\\s*Options\\s*\\|)([^\\|]*)(\\|)?/v, `$1${\n initial +\n Object.keys(obj.properties).map((key) => {\n return `\\`${key}\\``;\n }).join(', ')\n }$3`);\n\n await writeFile(docPath, ruleDocs);\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
2
 
3
3
  var _camelcase = _interopRequireDefault(require("camelcase"));
4
- var _fs = require("fs");
5
- var _promises = _interopRequireDefault(require("fs/promises"));
4
+ var _nodeFs = require("node:fs");
5
+ var _promises = _interopRequireDefault(require("node:fs/promises"));
6
+ var _nodePath = require("node:path");
6
7
  var _openEditor = _interopRequireDefault(require("open-editor"));
7
- var _path = require("path");
8
8
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
9
9
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); } /* eslint-disable no-console -- CLI */ /**
10
10
  * @example
@@ -65,7 +65,7 @@ export default iterateJsdoc(({
65
65
  `;
66
66
  const camelCasedRuleName = (0, _camelcase.default)(ruleName);
67
67
  const rulePath = `./src/rules/${camelCasedRuleName}.js`;
68
- if (!(0, _fs.existsSync)(rulePath)) {
68
+ if (!(0, _nodeFs.existsSync)(rulePath)) {
69
69
  await _promises.default.writeFile(rulePath, ruleTemplate);
70
70
  }
71
71
  const ruleTestTemplate = `export default {
@@ -90,7 +90,7 @@ export default iterateJsdoc(({
90
90
  };
91
91
  `;
92
92
  const ruleTestPath = `./test/rules/assertions/${camelCasedRuleName}.js`;
93
- if (!(0, _fs.existsSync)(ruleTestPath)) {
93
+ if (!(0, _nodeFs.existsSync)(ruleTestPath)) {
94
94
  await _promises.default.writeFile(ruleTestPath, ruleTestTemplate);
95
95
  }
96
96
  const ruleReadmeTemplate = `# \`${ruleName}\`
@@ -116,7 +116,7 @@ export default iterateJsdoc(({
116
116
  <!-- assertions-passing ${camelCasedRuleName} -->
117
117
  `;
118
118
  const ruleReadmePath = `./.README/rules/${ruleName}.md`;
119
- if (!(0, _fs.existsSync)(ruleReadmePath)) {
119
+ if (!(0, _nodeFs.existsSync)(ruleReadmePath)) {
120
120
  await _promises.default.writeFile(ruleReadmePath, ruleReadmeTemplate);
121
121
  }
122
122
 
@@ -240,7 +240,7 @@ export default iterateJsdoc(({
240
240
  */
241
241
 
242
242
  // Set chdir as somehow still in operation from other test
243
- process.chdir((0, _path.resolve)(__dirname, '../../'));
243
+ process.chdir((0, _nodePath.resolve)(__dirname, '../../'));
244
244
  await (0, _openEditor.default)([
245
245
  // Could even add editor line column numbers like `${rulePath}:1:1`
246
246
  ruleReadmePath, ruleTestPath, rulePath]);
@@ -1 +1 @@
1
- {"version":3,"file":"generateRule.cjs","names":["_camelcase","_interopRequireDefault","require","_fs","_promises","_openEditor","_path","e","__esModule","default","_interopRequireWildcard","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","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","checkName","newLine","oldIsCamel","oldRegex","path","offsets","readme","replace","matchedLine","n1","offset","str","oldRule","oldRuleB","alreadyIncluded","itemIndex","findIndex","item","undefined","pop","length","slice","repeat","Promise","resolve","then","chdir","__dirname","open"],"sources":["../src/bin/generateRule.js"],"sourcesContent":["/* eslint-disable no-console -- CLI */\n\nimport camelCase from 'camelcase';\nimport {\n existsSync,\n} from 'fs';\nimport fs from 'fs/promises';\n/**\n * @example\n * ```shell\n * pnpm run create-rule my-new-rule -- --recommended\n * ```\n */\nimport open from 'open-editor';\nimport {\n resolve,\n} from 'path';\n\n// Todo: Would ideally have prompts, e.g., to ask for whether\n// 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]/v).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 // eslint-disable-next-line unicorn/prefer-json-parse-buffer -- TypeScript\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.js';\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/blob/main/docs/rules/${ruleName}.md#repos-sticky-header',\n },\n schema: [\n {\n additionalProperties: 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 {\n line: 2,\n message: '',\n },\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## Options\n\n{\"gitdown\": \"options\"}\n\n|||\n|---|---|\n|Context|everywhere|\n|Tags|\\`\\`|\n|Recommended|${recommended ? 'true' : 'false'}|\n|Settings||\n|Options||\n\n## Failing examples\n\n<!-- assertions-failing ${camelCasedRuleName} -->\n\n## Passing examples\n\n<!-- assertions-passing ${camelCasedRuleName} -->\n`;\n\n const ruleReadmePath = `./.README/rules/${ruleName}.md`;\n if (!existsSync(ruleReadmePath)) {\n await fs.writeFile(ruleReadmePath, ruleReadmeTemplate);\n }\n\n /**\n * @param {object} cfg\n * @param {string} cfg.path\n * @param {RegExp} cfg.oldRegex\n * @param {string} cfg.checkName\n * @param {string} cfg.newLine\n * @param {boolean} [cfg.oldIsCamel]\n * @returns {Promise<void>}\n */\n const replaceInOrder = async ({\n checkName,\n newLine,\n oldIsCamel,\n oldRegex,\n path,\n }) => {\n /**\n * @typedef {number} Integer\n */\n /**\n * @typedef {{\n * matchedLine: string,\n * offset: Integer,\n * oldRule: string,\n * }} OffsetInfo\n */\n /**\n * @type {OffsetInfo[]}\n */\n const offsets = [];\n\n let readme = await fs.readFile(path, 'utf8');\n readme.replace(\n oldRegex,\n /**\n * @param {string} matchedLine\n * @param {string} n1\n * @param {Integer} offset\n * @param {string} str\n * @param {object} groups\n * @param {string} groups.oldRule\n * @returns {string}\n */\n (matchedLine, n1, offset, str, {\n oldRule,\n }) => {\n offsets.push({\n matchedLine,\n offset,\n oldRule,\n });\n\n return matchedLine;\n },\n );\n\n offsets.sort(({\n oldRule,\n }, {\n oldRule: oldRuleB,\n }) => {\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 = /** @type {OffsetInfo} */ (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\"\\}/gv,\n // path: './.README/README.md',\n // });\n\n await replaceInOrder({\n checkName: 'index import',\n newLine: `import ${camelCasedRuleName} from './rules/${camelCasedRuleName}.js';`,\n oldIsCamel: true,\n oldRegex: /\\nimport (?<oldRule>[^ ]*) from '.\\/rules\\/\\1\\.js';/gv,\n path: './src/index-cjs.js',\n });\n\n await replaceInOrder({\n checkName: 'index recommended',\n newLine: `${' '.repeat(6)}'jsdoc/${ruleName}': ${recommended ? 'warnOrError' : '\\'off\\''},`,\n oldRegex: /\\n\\s{6}'jsdoc\\/(?<oldRule>[^']*)': .*?,/gv,\n path: './src/index-cjs.js',\n });\n\n await replaceInOrder({\n checkName: 'index rules',\n newLine: `${' '.repeat(2)}'${ruleName}': ${camelCasedRuleName},`,\n oldRegex: /\\n\\s{2}'(?<oldRule>[^']*)': [^,]*,/gv,\n path: './src/index-cjs.js',\n });\n\n await import('./buildEntryFileForTS.js');\n\n await import('./generateDocs.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(import.meta.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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","ignoreList":[]}
1
+ {"version":3,"file":"generateRule.cjs","names":["_camelcase","_interopRequireDefault","require","_nodeFs","_promises","_nodePath","_openEditor","e","__esModule","default","_interopRequireWildcard","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","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","checkName","newLine","oldIsCamel","oldRegex","path","offsets","readme","replace","matchedLine","n1","offset","str","oldRule","oldRuleB","alreadyIncluded","itemIndex","findIndex","item","undefined","pop","length","slice","repeat","Promise","resolve","then","chdir","__dirname","open"],"sources":["../src/bin/generateRule.js"],"sourcesContent":["/* eslint-disable no-console -- CLI */\n/**\n * @example\n * ```shell\n * pnpm run create-rule my-new-rule -- --recommended\n * ```\n */\n\nimport camelCase from 'camelcase';\nimport {\n existsSync,\n} from 'node:fs';\nimport fs from 'node:fs/promises';\nimport {\n resolve,\n} from 'node:path';\nimport open from 'open-editor';\n\n// Todo: Would ideally have prompts, e.g., to ask for whether\n// 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]/v).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 // eslint-disable-next-line unicorn/prefer-json-parse-buffer -- TypeScript\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.js';\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/blob/main/docs/rules/${ruleName}.md#repos-sticky-header',\n },\n schema: [\n {\n additionalProperties: 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 {\n line: 2,\n message: '',\n },\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## Options\n\n{\"gitdown\": \"options\"}\n\n|||\n|---|---|\n|Context|everywhere|\n|Tags|\\`\\`|\n|Recommended|${recommended ? 'true' : 'false'}|\n|Settings||\n|Options||\n\n## Failing examples\n\n<!-- assertions-failing ${camelCasedRuleName} -->\n\n## Passing examples\n\n<!-- assertions-passing ${camelCasedRuleName} -->\n`;\n\n const ruleReadmePath = `./.README/rules/${ruleName}.md`;\n if (!existsSync(ruleReadmePath)) {\n await fs.writeFile(ruleReadmePath, ruleReadmeTemplate);\n }\n\n /**\n * @param {object} cfg\n * @param {string} cfg.path\n * @param {RegExp} cfg.oldRegex\n * @param {string} cfg.checkName\n * @param {string} cfg.newLine\n * @param {boolean} [cfg.oldIsCamel]\n * @returns {Promise<void>}\n */\n const replaceInOrder = async ({\n checkName,\n newLine,\n oldIsCamel,\n oldRegex,\n path,\n }) => {\n /**\n * @typedef {number} Integer\n */\n /**\n * @typedef {{\n * matchedLine: string,\n * offset: Integer,\n * oldRule: string,\n * }} OffsetInfo\n */\n /**\n * @type {OffsetInfo[]}\n */\n const offsets = [];\n\n let readme = await fs.readFile(path, 'utf8');\n readme.replace(\n oldRegex,\n /**\n * @param {string} matchedLine\n * @param {string} n1\n * @param {Integer} offset\n * @param {string} str\n * @param {object} groups\n * @param {string} groups.oldRule\n * @returns {string}\n */\n (matchedLine, n1, offset, str, {\n oldRule,\n }) => {\n offsets.push({\n matchedLine,\n offset,\n oldRule,\n });\n\n return matchedLine;\n },\n );\n\n offsets.sort(({\n oldRule,\n }, {\n oldRule: oldRuleB,\n }) => {\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 = /** @type {OffsetInfo} */ (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\"\\}/gv,\n // path: './.README/README.md',\n // });\n\n await replaceInOrder({\n checkName: 'index import',\n newLine: `import ${camelCasedRuleName} from './rules/${camelCasedRuleName}.js';`,\n oldIsCamel: true,\n oldRegex: /\\nimport (?<oldRule>[^ ]*) from '.\\/rules\\/\\1\\.js';/gv,\n path: './src/index-cjs.js',\n });\n\n await replaceInOrder({\n checkName: 'index recommended',\n newLine: `${' '.repeat(6)}'jsdoc/${ruleName}': ${recommended ? 'warnOrError' : '\\'off\\''},`,\n oldRegex: /\\n\\s{6}'jsdoc\\/(?<oldRule>[^']*)': .*?,/gv,\n path: './src/index-cjs.js',\n });\n\n await replaceInOrder({\n checkName: 'index rules',\n newLine: `${' '.repeat(2)}'${ruleName}': ${camelCasedRuleName},`,\n oldRegex: /\\n\\s{2}'(?<oldRule>[^']*)': [^,]*,/gv,\n path: './src/index-cjs.js',\n });\n\n await import('./buildEntryFileForTS.js');\n\n await import('./generateDocs.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(import.meta.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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","ignoreList":[]}
@@ -6,9 +6,11 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.default = void 0;
7
7
  var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc.cjs"));
8
8
  var _jsdoccomment = require("@es-joy/jsdoccomment");
9
- var _fs = require("fs");
9
+ var resolve = _interopRequireWildcard(require("@es-joy/resolve.exports"));
10
+ var _nodeFs = require("node:fs");
10
11
  var _nodeModule = require("node:module");
11
- var _path = require("path");
12
+ var _nodePath = require("node:path");
13
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
12
14
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
13
15
  /**
14
16
  * @type {Set<string>|null}
@@ -16,7 +18,7 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
16
18
  let deps;
17
19
  const setDeps = function () {
18
20
  try {
19
- const pkg = JSON.parse((0, _fs.readFileSync)((0, _path.join)(process.cwd(), './package.json'), 'utf8'));
21
+ const pkg = JSON.parse((0, _nodeFs.readFileSync)((0, _nodePath.join)(process.cwd(), './package.json'), 'utf8'));
20
22
  deps = new Set([...(pkg.dependencies ? /* c8 ignore next 2 */
21
23
  Object.keys(pkg.dependencies) : []), ...(pkg.devDependencies ? /* c8 ignore next 2 */
22
24
  Object.keys(pkg.devDependencies) : [])]);
@@ -73,11 +75,17 @@ var _default = exports.default = (0, _iterateJsdoc.default)(({
73
75
  } else if (!moduleCheck.has(mod)) {
74
76
  let pkg;
75
77
  try {
76
- pkg = JSON.parse((0, _fs.readFileSync)((0, _path.join)(process.cwd(), 'node_modules', mod, './package.json'), 'utf8'));
78
+ pkg = JSON.parse((0, _nodeFs.readFileSync)((0, _nodePath.join)(process.cwd(), 'node_modules', mod, './package.json'), 'utf8'));
77
79
  } catch {
78
80
  // Ignore
79
81
  }
80
- if (!pkg || !pkg.types && !pkg.typings) {
82
+ try {
83
+ if (!pkg || !pkg.types && !pkg.typings && !resolve.exports(pkg, '.', {
84
+ conditions: ['!default', '!import', '!node', 'types']
85
+ })) {
86
+ mod = `@types/${mod}`;
87
+ }
88
+ } catch {
81
89
  mod = `@types/${mod}`;
82
90
  }
83
91
  moduleCheck.set(mod, !deps.has(mod));
@@ -1 +1 @@
1
- {"version":3,"file":"importsAsDependencies.cjs","names":["_iterateJsdoc","_interopRequireDefault","require","_jsdoccomment","_fs","_nodeModule","_path","e","__esModule","default","deps","setDeps","pkg","JSON","parse","readFileSync","join","process","cwd","Set","dependencies","Object","keys","devDependencies","error","console","log","moduleCheck","Map","_default","exports","iterateJsdoc","jsdoc","settings","utils","undefined","mode","tag","tags","typeAst","tryParse","type","traverse","nde","mod","element","value","replace","test","isBuiltinModule","has","types","typings","set","get","reportJSDoc","iterateAllJsdocs","meta","docs","description","url","module"],"sources":["../../src/rules/importsAsDependencies.js"],"sourcesContent":["import iterateJsdoc from '../iterateJsdoc.js';\nimport {\n parse,\n traverse,\n tryParse,\n} from '@es-joy/jsdoccomment';\nimport {\n readFileSync,\n} from 'fs';\nimport {\n isBuiltin as isBuiltinModule,\n} from 'node:module';\nimport {\n join,\n} from 'path';\n\n/**\n * @type {Set<string>|null}\n */\nlet deps;\n\nconst setDeps = function () {\n try {\n const pkg = JSON.parse(\n readFileSync(join(process.cwd(), './package.json'), 'utf8'),\n );\n deps = new Set([\n ...(pkg.dependencies ?\n /* c8 ignore next 2 */\n Object.keys(pkg.dependencies) :\n []),\n ...(pkg.devDependencies ?\n /* c8 ignore next 2 */\n Object.keys(pkg.devDependencies) :\n []),\n ]);\n /* c8 ignore next -- our package.json exists */\n } catch (error) {\n /* c8 ignore next -- our package.json exists */\n deps = null;\n /* c8 ignore next 4 -- our package.json exists */\n /* eslint-disable no-console -- Inform user */\n console.log(error);\n /* eslint-enable no-console -- Inform user */\n }\n};\n\nconst moduleCheck = new Map();\n\nexport default iterateJsdoc(({\n jsdoc,\n settings,\n utils,\n}) => {\n if (deps === undefined) {\n setDeps();\n }\n\n /* c8 ignore next 3 -- our package.json exists */\n if (deps === null) {\n return;\n }\n\n const {\n mode,\n } = settings;\n\n for (const tag of jsdoc.tags) {\n let typeAst;\n try {\n typeAst = mode === 'permissive' ? tryParse(tag.type) : parse(tag.type, mode);\n } catch {\n continue;\n }\n\n // eslint-disable-next-line no-loop-func -- Safe\n traverse(typeAst, (nde) => {\n /* c8 ignore next 3 -- TS guard */\n if (deps === null) {\n return;\n }\n\n if (nde.type === 'JsdocTypeImport') {\n let mod = nde.element.value.replace(\n /^(@[^\\/]+\\/[^\\/]+|[^\\/]+).*$/v, '$1',\n );\n\n if ((/^[.\\/]/v).test(mod)) {\n return;\n }\n\n if (isBuiltinModule(mod)) {\n // mod = '@types/node';\n // moduleCheck.set(mod, !deps.has(mod));\n return;\n } else if (!moduleCheck.has(mod)) {\n let pkg;\n try {\n pkg = JSON.parse(\n readFileSync(join(process.cwd(), 'node_modules', mod, './package.json'), 'utf8'),\n );\n } catch {\n // Ignore\n }\n\n if (!pkg || (!pkg.types && !pkg.typings)) {\n mod = `@types/${mod}`;\n }\n\n moduleCheck.set(mod, !deps.has(mod));\n }\n\n if (moduleCheck.get(mod)) {\n utils.reportJSDoc(\n 'import points to package which is not found in dependencies',\n tag,\n );\n }\n }\n });\n }\n}, {\n iterateAllJsdocs: true,\n meta: {\n docs: {\n description: 'Reports if JSDoc `import()` statements point to a package which is not listed in `dependencies` or `devDependencies`',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/imports-as-dependencies.md#repos-sticky-header',\n },\n type: 'suggestion',\n },\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"importsAsDependencies.cjs","names":["_iterateJsdoc","_interopRequireDefault","require","_jsdoccomment","resolve","_interopRequireWildcard","_nodeFs","_nodeModule","_nodePath","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","deps","setDeps","pkg","JSON","parse","readFileSync","join","process","cwd","Set","dependencies","keys","devDependencies","error","console","log","moduleCheck","Map","_default","exports","iterateJsdoc","jsdoc","settings","utils","undefined","mode","tag","tags","typeAst","tryParse","type","traverse","nde","mod","element","value","replace","test","isBuiltinModule","types","typings","conditions","reportJSDoc","iterateAllJsdocs","meta","docs","description","url","module"],"sources":["../../src/rules/importsAsDependencies.js"],"sourcesContent":["import iterateJsdoc from '../iterateJsdoc.js';\nimport {\n parse,\n traverse,\n tryParse,\n} from '@es-joy/jsdoccomment';\nimport * as resolve from '@es-joy/resolve.exports';\nimport {\n readFileSync,\n} from 'node:fs';\nimport {\n isBuiltin as isBuiltinModule,\n} from 'node:module';\nimport {\n join,\n} from 'node:path';\n\n/**\n * @type {Set<string>|null}\n */\nlet deps;\n\nconst setDeps = function () {\n try {\n const pkg = JSON.parse(\n readFileSync(join(process.cwd(), './package.json'), 'utf8'),\n );\n deps = new Set([\n ...(pkg.dependencies ?\n /* c8 ignore next 2 */\n Object.keys(pkg.dependencies) :\n []),\n ...(pkg.devDependencies ?\n /* c8 ignore next 2 */\n Object.keys(pkg.devDependencies) :\n []),\n ]);\n /* c8 ignore next -- our package.json exists */\n } catch (error) {\n /* c8 ignore next -- our package.json exists */\n deps = null;\n /* c8 ignore next 4 -- our package.json exists */\n /* eslint-disable no-console -- Inform user */\n console.log(error);\n /* eslint-enable no-console -- Inform user */\n }\n};\n\nconst moduleCheck = new Map();\n\nexport default iterateJsdoc(({\n jsdoc,\n settings,\n utils,\n}) => {\n if (deps === undefined) {\n setDeps();\n }\n\n /* c8 ignore next 3 -- our package.json exists */\n if (deps === null) {\n return;\n }\n\n const {\n mode,\n } = settings;\n\n for (const tag of jsdoc.tags) {\n let typeAst;\n try {\n typeAst = mode === 'permissive' ? tryParse(tag.type) : parse(tag.type, mode);\n } catch {\n continue;\n }\n\n // eslint-disable-next-line no-loop-func -- Safe\n traverse(typeAst, (nde) => {\n /* c8 ignore next 3 -- TS guard */\n if (deps === null) {\n return;\n }\n\n if (nde.type === 'JsdocTypeImport') {\n let mod = nde.element.value.replace(\n /^(@[^\\/]+\\/[^\\/]+|[^\\/]+).*$/v, '$1',\n );\n\n if ((/^[.\\/]/v).test(mod)) {\n return;\n }\n\n if (isBuiltinModule(mod)) {\n // mod = '@types/node';\n // moduleCheck.set(mod, !deps.has(mod));\n return;\n } else if (!moduleCheck.has(mod)) {\n let pkg;\n try {\n pkg = JSON.parse(\n readFileSync(join(process.cwd(), 'node_modules', mod, './package.json'), 'utf8'),\n );\n } catch {\n // Ignore\n }\n\n try {\n if (!pkg || (!pkg.types && !pkg.typings && !resolve.exports(pkg, '.', {\n conditions: [\n '!default', '!import', '!node', 'types',\n ],\n }))) {\n mod = `@types/${mod}`;\n }\n } catch {\n mod = `@types/${mod}`;\n }\n\n moduleCheck.set(mod, !deps.has(mod));\n }\n\n if (moduleCheck.get(mod)) {\n utils.reportJSDoc(\n 'import points to package which is not found in dependencies',\n tag,\n );\n }\n }\n });\n }\n}, {\n iterateAllJsdocs: true,\n meta: {\n docs: {\n description: 'Reports if JSDoc `import()` statements point to a package which is not listed in `dependencies` or `devDependencies`',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/imports-as-dependencies.md#repos-sticky-header',\n },\n type: 'suggestion',\n },\n});\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -6,6 +6,7 @@
6
6
  },
7
7
  "dependencies": {
8
8
  "@es-joy/jsdoccomment": "~0.76.0",
9
+ "@es-joy/resolve.exports": "1.0.0",
9
10
  "are-docs-informative": "^0.0.2",
10
11
  "comment-parser": "1.4.1",
11
12
  "debug": "^4.4.3",
@@ -23,29 +24,29 @@
23
24
  "devDependencies": {
24
25
  "@arethetypeswrong/cli": "^0.18.2",
25
26
  "@babel/cli": "^7.28.3",
26
- "@babel/core": "^7.28.4",
27
- "@babel/eslint-parser": "^7.28.4",
27
+ "@babel/core": "^7.28.5",
28
+ "@babel/eslint-parser": "^7.28.5",
28
29
  "@babel/plugin-syntax-class-properties": "^7.12.13",
29
30
  "@babel/plugin-transform-flow-strip-types": "^7.27.1",
30
- "@babel/preset-env": "^7.28.3",
31
+ "@babel/preset-env": "^7.28.5",
31
32
  "@es-joy/escodegen": "^4.2.0",
32
- "@es-joy/jsdoc-eslint-parser": "^0.24.0",
33
+ "@es-joy/jsdoc-eslint-parser": "^0.25.0",
33
34
  "@eslint/core": "^0.16.0",
34
35
  "@hkdobrev/run-if-changed": "^0.6.3",
35
36
  "@semantic-release/commit-analyzer": "^13.0.1",
36
37
  "@semantic-release/github": "^12.0.0",
37
38
  "@semantic-release/npm": "^13.1.1",
38
- "@types/chai": "^5.2.2",
39
+ "@types/chai": "^5.2.3",
39
40
  "@types/debug": "^4.1.12",
40
41
  "@types/espree": "^10.1.0",
41
42
  "@types/esquery": "^1.5.4",
42
43
  "@types/estree": "^1.0.8",
43
44
  "@types/json-schema": "^7.0.15",
44
45
  "@types/mocha": "^10.0.10",
45
- "@types/node": "^24.8.1",
46
+ "@types/node": "^24.9.1",
46
47
  "@types/semver": "^7.7.1",
47
48
  "@types/spdx-expression-parse": "^3.0.5",
48
- "@typescript-eslint/types": "^8.46.1",
49
+ "@typescript-eslint/types": "^8.46.2",
49
50
  "babel-plugin-add-module-exports": "^1.0.4",
50
51
  "babel-plugin-istanbul": "^7.0.1",
51
52
  "babel-plugin-transform-import-meta": "^2.3.3",
@@ -62,14 +63,16 @@
62
63
  "jsdoc-type-pratt-parser": "^6.11.0",
63
64
  "json-schema": "^0.4.0",
64
65
  "json-schema-to-typescript": "^15.0.4",
65
- "lint-staged": "^16.2.4",
66
+ "lint-staged": "^16.2.6",
66
67
  "mocha": "^11.7.4",
67
68
  "open-editor": "^5.1.0",
69
+ "playwright": "^1.56.1",
68
70
  "replace": "^1.2.2",
69
71
  "rimraf": "^6.0.1",
70
72
  "semantic-release": "^25.0.1",
73
+ "sinon": "^21.0.0",
71
74
  "typescript": "5.9.3",
72
- "typescript-eslint": "^8.46.1"
75
+ "typescript-eslint": "^8.46.2"
73
76
  },
74
77
  "engines": {
75
78
  "node": ">=20.11.0"
@@ -179,5 +182,5 @@
179
182
  "test-cov": "TIMING=1 c8 --reporter text pnpm run test-no-cov",
180
183
  "test-index": "pnpm run test-no-cov test/rules/index.js"
181
184
  },
182
- "version": "61.1.5"
185
+ "version": "61.1.7"
183
186
  }
@@ -4,15 +4,16 @@ import {
4
4
  traverse,
5
5
  tryParse,
6
6
  } from '@es-joy/jsdoccomment';
7
+ import * as resolve from '@es-joy/resolve.exports';
7
8
  import {
8
9
  readFileSync,
9
- } from 'fs';
10
+ } from 'node:fs';
10
11
  import {
11
12
  isBuiltin as isBuiltinModule,
12
13
  } from 'node:module';
13
14
  import {
14
15
  join,
15
- } from 'path';
16
+ } from 'node:path';
16
17
 
17
18
  /**
18
19
  * @type {Set<string>|null}
@@ -103,7 +104,15 @@ export default iterateJsdoc(({
103
104
  // Ignore
104
105
  }
105
106
 
106
- if (!pkg || (!pkg.types && !pkg.typings)) {
107
+ try {
108
+ if (!pkg || (!pkg.types && !pkg.typings && !resolve.exports(pkg, '.', {
109
+ conditions: [
110
+ '!default', '!import', '!node', 'types',
111
+ ],
112
+ }))) {
113
+ mod = `@types/${mod}`;
114
+ }
115
+ } catch {
107
116
  mod = `@types/${mod}`;
108
117
  }
109
118