eslint-plugin-jsdoc 61.1.4 → 61.1.6

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.
Files changed (37) hide show
  1. package/dist/WarnSettings.cjs +2 -2
  2. package/dist/WarnSettings.cjs.map +1 -1
  3. package/dist/WarnSettings.d.ts +4 -4
  4. package/dist/cjs/WarnSettings.d.ts +4 -4
  5. package/dist/cjs/iterateJsdoc.d.ts +2 -2
  6. package/dist/cjs/jsdocUtils.d.ts +2 -2
  7. package/dist/generateDocs.cjs +20 -20
  8. package/dist/generateDocs.cjs.map +1 -1
  9. package/dist/generateOptions.cjs +4 -4
  10. package/dist/generateOptions.cjs.map +1 -1
  11. package/dist/generateRule.cjs +7 -7
  12. package/dist/generateRule.cjs.map +1 -1
  13. package/dist/iterateJsdoc.cjs +2 -2
  14. package/dist/iterateJsdoc.cjs.map +1 -1
  15. package/dist/iterateJsdoc.d.ts +2 -2
  16. package/dist/jsdocUtils.cjs +3 -2
  17. package/dist/jsdocUtils.cjs.map +1 -1
  18. package/dist/jsdocUtils.d.ts +2 -2
  19. package/dist/rules/checkParamNames.cjs +2 -2
  20. package/dist/rules/checkParamNames.cjs.map +1 -1
  21. package/dist/rules/importsAsDependencies.cjs +9 -5
  22. package/dist/rules/importsAsDependencies.cjs.map +1 -1
  23. package/dist/rules/requireFileOverview.cjs +1 -1
  24. package/dist/rules/requireFileOverview.cjs.map +1 -1
  25. package/dist/rules/typeFormatting.cjs +1 -2
  26. package/dist/rules/typeFormatting.cjs.map +1 -1
  27. package/dist/rules/validTypes.cjs +1 -2
  28. package/dist/rules/validTypes.cjs.map +1 -1
  29. package/package.json +19 -17
  30. package/src/WarnSettings.js +2 -2
  31. package/src/iterateJsdoc.js +2 -2
  32. package/src/jsdocUtils.js +3 -2
  33. package/src/rules/checkParamNames.js +1 -1
  34. package/src/rules/importsAsDependencies.js +8 -3
  35. package/src/rules/requireFileOverview.js +1 -1
  36. package/src/rules/typeFormatting.js +1 -1
  37. package/src/rules/validTypes.js +1 -1
@@ -10,7 +10,7 @@ const WarnSettings = function () {
10
10
  return {
11
11
  /**
12
12
  * Warn only once for each context and setting
13
- * @param {{}} context
13
+ * @param {import('eslint').Rule.RuleContext} context
14
14
  * @param {string} setting
15
15
  * @returns {boolean}
16
16
  */
@@ -18,7 +18,7 @@ const WarnSettings = function () {
18
18
  return warnedSettings.has(context) && /** @type {Set<string>} */warnedSettings.get(context).has(setting);
19
19
  },
20
20
  /**
21
- * @param {{}} context
21
+ * @param {import('eslint').Rule.RuleContext} context
22
22
  * @param {string} setting
23
23
  * @returns {void}
24
24
  */
@@ -1 +1 @@
1
- {"version":3,"file":"WarnSettings.cjs","names":["WarnSettings","warnedSettings","WeakMap","hasBeenWarned","context","setting","has","get","markSettingAsWarned","set","Set","add","_default","exports","default","module"],"sources":["../src/WarnSettings.js"],"sourcesContent":["const WarnSettings = function () {\n /** @type {WeakMap<object, Set<string>>} */\n const warnedSettings = new WeakMap();\n\n return {\n /**\n * Warn only once for each context and setting\n * @param {{}} context\n * @param {string} setting\n * @returns {boolean}\n */\n hasBeenWarned (context, setting) {\n return warnedSettings.has(context) && /** @type {Set<string>} */ (\n warnedSettings.get(context)\n ).has(setting);\n },\n\n /**\n * @param {{}} context\n * @param {string} setting\n * @returns {void}\n */\n markSettingAsWarned (context, setting) {\n // c8 ignore else\n if (!warnedSettings.has(context)) {\n warnedSettings.set(context, new Set());\n }\n\n /** @type {Set<string>} */ (warnedSettings.get(context)).add(setting);\n },\n };\n};\n\nexport default WarnSettings;\n"],"mappings":";;;;;;AAAA,MAAMA,YAAY,GAAG,SAAAA,CAAA,EAAY;EAC/B;EACA,MAAMC,cAAc,GAAG,IAAIC,OAAO,CAAC,CAAC;EAEpC,OAAO;IACL;AACJ;AACA;AACA;AACA;AACA;IACIC,aAAaA,CAAEC,OAAO,EAAEC,OAAO,EAAE;MAC/B,OAAOJ,cAAc,CAACK,GAAG,CAACF,OAAO,CAAC,IAAI,0BACpCH,cAAc,CAACM,GAAG,CAACH,OAAO,CAAC,CAC3BE,GAAG,CAACD,OAAO,CAAC;IAChB,CAAC;IAED;AACJ;AACA;AACA;AACA;IACIG,mBAAmBA,CAAEJ,OAAO,EAAEC,OAAO,EAAE;MACrC;MACA,IAAI,CAACJ,cAAc,CAACK,GAAG,CAACF,OAAO,CAAC,EAAE;QAChCH,cAAc,CAACQ,GAAG,CAACL,OAAO,EAAE,IAAIM,GAAG,CAAC,CAAC,CAAC;MACxC;;MAEA;MAA4BT,cAAc,CAACM,GAAG,CAACH,OAAO,CAAC,CAAEO,GAAG,CAACN,OAAO,CAAC;IACvE;EACF,CAAC;AACH,CAAC;AAAC,IAAAO,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAEad,YAAY;AAAAe,MAAA,CAAAF,OAAA,GAAAA,OAAA,CAAAC,OAAA","ignoreList":[]}
1
+ {"version":3,"file":"WarnSettings.cjs","names":["WarnSettings","warnedSettings","WeakMap","hasBeenWarned","context","setting","has","get","markSettingAsWarned","set","Set","add","_default","exports","default","module"],"sources":["../src/WarnSettings.js"],"sourcesContent":["const WarnSettings = function () {\n /** @type {WeakMap<object, Set<string>>} */\n const warnedSettings = new WeakMap();\n\n return {\n /**\n * Warn only once for each context and setting\n * @param {import('eslint').Rule.RuleContext} context\n * @param {string} setting\n * @returns {boolean}\n */\n hasBeenWarned (context, setting) {\n return warnedSettings.has(context) && /** @type {Set<string>} */ (\n warnedSettings.get(context)\n ).has(setting);\n },\n\n /**\n * @param {import('eslint').Rule.RuleContext} context\n * @param {string} setting\n * @returns {void}\n */\n markSettingAsWarned (context, setting) {\n // c8 ignore else\n if (!warnedSettings.has(context)) {\n warnedSettings.set(context, new Set());\n }\n\n /** @type {Set<string>} */ (warnedSettings.get(context)).add(setting);\n },\n };\n};\n\nexport default WarnSettings;\n"],"mappings":";;;;;;AAAA,MAAMA,YAAY,GAAG,SAAAA,CAAA,EAAY;EAC/B;EACA,MAAMC,cAAc,GAAG,IAAIC,OAAO,CAAC,CAAC;EAEpC,OAAO;IACL;AACJ;AACA;AACA;AACA;AACA;IACIC,aAAaA,CAAEC,OAAO,EAAEC,OAAO,EAAE;MAC/B,OAAOJ,cAAc,CAACK,GAAG,CAACF,OAAO,CAAC,IAAI,0BACpCH,cAAc,CAACM,GAAG,CAACH,OAAO,CAAC,CAC3BE,GAAG,CAACD,OAAO,CAAC;IAChB,CAAC;IAED;AACJ;AACA;AACA;AACA;IACIG,mBAAmBA,CAAEJ,OAAO,EAAEC,OAAO,EAAE;MACrC;MACA,IAAI,CAACJ,cAAc,CAACK,GAAG,CAACF,OAAO,CAAC,EAAE;QAChCH,cAAc,CAACQ,GAAG,CAACL,OAAO,EAAE,IAAIM,GAAG,CAAC,CAAC,CAAC;MACxC;;MAEA;MAA4BT,cAAc,CAACM,GAAG,CAACH,OAAO,CAAC,CAAEO,GAAG,CAACN,OAAO,CAAC;IACvE;EACF,CAAC;AACH,CAAC;AAAC,IAAAO,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAEad,YAAY;AAAAe,MAAA,CAAAF,OAAA,GAAAA,OAAA,CAAAC,OAAA","ignoreList":[]}
@@ -2,16 +2,16 @@ export default WarnSettings;
2
2
  declare function WarnSettings(): {
3
3
  /**
4
4
  * Warn only once for each context and setting
5
- * @param {{}} context
5
+ * @param {import('eslint').Rule.RuleContext} context
6
6
  * @param {string} setting
7
7
  * @returns {boolean}
8
8
  */
9
- hasBeenWarned(context: {}, setting: string): boolean;
9
+ hasBeenWarned(context: import("eslint").Rule.RuleContext, setting: string): boolean;
10
10
  /**
11
- * @param {{}} context
11
+ * @param {import('eslint').Rule.RuleContext} context
12
12
  * @param {string} setting
13
13
  * @returns {void}
14
14
  */
15
- markSettingAsWarned(context: {}, setting: string): void;
15
+ markSettingAsWarned(context: import("eslint").Rule.RuleContext, setting: string): void;
16
16
  };
17
17
  //# sourceMappingURL=WarnSettings.d.ts.map
@@ -2,15 +2,15 @@ export default WarnSettings;
2
2
  declare function WarnSettings(): {
3
3
  /**
4
4
  * Warn only once for each context and setting
5
- * @param {{}} context
5
+ * @param {import('eslint').Rule.RuleContext} context
6
6
  * @param {string} setting
7
7
  * @returns {boolean}
8
8
  */
9
- hasBeenWarned(context: {}, setting: string): boolean;
9
+ hasBeenWarned(context: import("eslint").Rule.RuleContext, setting: string): boolean;
10
10
  /**
11
- * @param {{}} context
11
+ * @param {import('eslint').Rule.RuleContext} context
12
12
  * @param {string} setting
13
13
  * @returns {void}
14
14
  */
15
- markSettingAsWarned(context: {}, setting: string): void;
15
+ markSettingAsWarned(context: import("eslint").Rule.RuleContext, setting: string): void;
16
16
  };
@@ -80,7 +80,7 @@ export type RemoveTag = (tagIndex: Integer, cfg?: {
80
80
  removeEmptyBlock?: boolean;
81
81
  tagSourceOffset?: Integer;
82
82
  } | undefined) => void;
83
- export type AddTag = (targetTagName: string, number?: number | undefined, tokens?: {} | import("comment-parser").Tokens | undefined) => void;
83
+ export type AddTag = (targetTagName: string, number?: number | undefined, tokens?: Partial<import("comment-parser").Tokens> | undefined) => void;
84
84
  export type GetFirstLine = () => Integer | undefined;
85
85
  export type SeedTokens = (tokens?: Partial<import("comment-parser").Tokens> | undefined) => import("comment-parser").Tokens;
86
86
  /**
@@ -227,7 +227,7 @@ export type EslintRuleMeta = import("eslint").Rule.RuleMetaData;
227
227
  * A plain object for tracking state as needed by rules across iterations.
228
228
  */
229
229
  export type StateObject = {
230
- globalTags: {};
230
+ globalTags: boolean;
231
231
  hasDuplicates: {
232
232
  [key: string]: boolean;
233
233
  };
@@ -262,13 +262,13 @@ export function getPreferredTagName(jsdoc: import("./iterateJsdoc.js").JsdocBloc
262
262
  * @param {string} name
263
263
  * @param {ParserMode|undefined} mode
264
264
  * @param {TagNamePreference} tagPreference
265
- * @param {Reporter} context
265
+ * @param {import('eslint').Rule.RuleContext} context
266
266
  * @returns {string|false|{
267
267
  * message: string;
268
268
  * replacement?: string|undefined;
269
269
  * }}
270
270
  */
271
- export function getPreferredTagNameSimple(name: string, mode: ParserMode | undefined, tagPreference?: TagNamePreference, context?: Reporter): string | false | {
271
+ export function getPreferredTagNameSimple(name: string, mode: ParserMode | undefined, tagPreference?: TagNamePreference, context?: import("eslint").Rule.RuleContext): string | false | {
272
272
  message: string;
273
273
  replacement?: string | undefined;
274
274
  };
@@ -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":[]}
@@ -219,7 +219,7 @@ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r
219
219
  * @callback AddTag
220
220
  * @param {string} targetTagName
221
221
  * @param {Integer} [number]
222
- * @param {import('comment-parser').Tokens|{}} [tokens]
222
+ * @param {Partial<import('comment-parser').Tokens>} [tokens]
223
223
  * @returns {void}
224
224
  */
225
225
 
@@ -574,7 +574,7 @@ const {
574
574
  /**
575
575
  * A plain object for tracking state as needed by rules across iterations.
576
576
  * @typedef {{
577
- * globalTags: {},
577
+ * globalTags: boolean,
578
578
  * hasDuplicates: {
579
579
  * [key: string]: boolean
580
580
  * },