eslint-plugin-jsdoc 37.6.2 → 37.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,165 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _defaultTagOrder = _interopRequireDefault(require("../defaultTagOrder"));
9
+
10
+ var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc"));
11
+
12
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
+
14
+ var _default = (0, _iterateJsdoc.default)(({
15
+ context,
16
+ jsdoc,
17
+ utils
18
+ }) => {
19
+ const {
20
+ tagSequence = _defaultTagOrder.default,
21
+ alphabetizeExtras = false
22
+ } = context.options[0] || {};
23
+ const otherPos = tagSequence.indexOf('-other');
24
+ const endPos = otherPos > -1 ? otherPos : tagSequence.length;
25
+ let ongoingCount = 0;
26
+
27
+ for (const [idx, tag] of jsdoc.tags.entries()) {
28
+ tag.originalIndex = idx;
29
+ ongoingCount += tag.source.length;
30
+ tag.originalLine = ongoingCount;
31
+ }
32
+
33
+ let firstChangedTagLine;
34
+ let firstChangedTagIndex;
35
+ const sortedTags = JSON.parse(JSON.stringify(jsdoc.tags));
36
+ sortedTags.sort(({
37
+ tag: tagNew
38
+ }, {
39
+ originalIndex,
40
+ originalLine,
41
+ tag: tagOld
42
+ }) => {
43
+ // Optimize: Just keep relative positions if the same tag name
44
+ if (tagNew === tagOld) {
45
+ return 0;
46
+ }
47
+
48
+ const checkOrSetFirstChanged = () => {
49
+ if (!firstChangedTagLine || originalLine < firstChangedTagLine) {
50
+ firstChangedTagLine = originalLine;
51
+ firstChangedTagIndex = originalIndex;
52
+ }
53
+ };
54
+
55
+ const newPos = tagSequence.indexOf(tagNew);
56
+ const oldPos = tagSequence.indexOf(tagOld);
57
+ const preferredNewPos = newPos === -1 ? endPos : newPos;
58
+ const preferredOldPos = oldPos === -1 ? endPos : oldPos;
59
+
60
+ if (preferredNewPos < preferredOldPos) {
61
+ checkOrSetFirstChanged();
62
+ return -1;
63
+ }
64
+
65
+ if (preferredNewPos > preferredOldPos) {
66
+ return 1;
67
+ } // preferredNewPos === preferredOldPos
68
+
69
+
70
+ if (!alphabetizeExtras || // Optimize: If tagNew (or tagOld which is the same) was found in the
71
+ // priority array, it can maintain its relative position—without need
72
+ // of alphabetizing (secondary sorting)
73
+ newPos >= 0) {
74
+ return 0;
75
+ }
76
+
77
+ if (tagNew < tagOld) {
78
+ checkOrSetFirstChanged();
79
+ return -1;
80
+ } // tagNew > tagOld
81
+
82
+
83
+ return 1;
84
+ });
85
+
86
+ if (firstChangedTagLine === undefined) {
87
+ return;
88
+ }
89
+
90
+ const firstLine = utils.getFirstLine();
91
+
92
+ const fix = () => {
93
+ const itemsToMoveRange = [...Array.from({
94
+ length: jsdoc.tags.length - firstChangedTagIndex
95
+ }).keys()];
96
+ const unchangedPriorTagDescriptions = jsdoc.tags.slice(0, firstChangedTagIndex).reduce((ct, {
97
+ source
98
+ }) => {
99
+ return ct + source.length - 1;
100
+ }, 0); // This offset includes not only the offset from where the first tag
101
+ // must begin, and the additional offset of where the first changed
102
+ // tag begins, but it must also account for prior descriptions
103
+
104
+ const initialOffset = firstLine + firstChangedTagIndex + // May be the first tag, so don't try finding a prior one if so
105
+ unchangedPriorTagDescriptions; // Use `firstChangedTagLine` for line number to begin reporting/splicing
106
+
107
+ for (const idx of itemsToMoveRange) {
108
+ utils.removeTag(idx + firstChangedTagIndex);
109
+ }
110
+
111
+ const changedTags = sortedTags.slice(firstChangedTagIndex);
112
+ let extraTagCount = 0;
113
+
114
+ for (const idx of itemsToMoveRange) {
115
+ const changedTag = changedTags[idx];
116
+ utils.addTag(changedTag.tag, extraTagCount + initialOffset + idx, { ...changedTag.source[0].tokens,
117
+ // `comment-parser` puts the `end` within the `tags` section, so
118
+ // avoid adding another to jsdoc.source
119
+ end: ''
120
+ });
121
+
122
+ for (const {
123
+ tokens
124
+ } of changedTag.source.slice(1)) {
125
+ if (!tokens.end) {
126
+ utils.addLine(extraTagCount + initialOffset + idx + 1, { ...tokens,
127
+ end: ''
128
+ });
129
+ extraTagCount++;
130
+ }
131
+ }
132
+ }
133
+ };
134
+
135
+ utils.reportJSDoc(`Tags are not in the prescribed order: ${tagSequence.join(', ')}`, jsdoc.tags[firstChangedTagIndex], fix, true);
136
+ }, {
137
+ iterateAllJsdocs: true,
138
+ meta: {
139
+ docs: {
140
+ description: '',
141
+ url: 'https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-sort-tags'
142
+ },
143
+ fixable: 'code',
144
+ schema: [{
145
+ additionalProperies: false,
146
+ properties: {
147
+ alphabetizeExtras: {
148
+ type: 'boolean'
149
+ },
150
+ tagSequence: {
151
+ items: {
152
+ type: 'string'
153
+ },
154
+ type: 'array'
155
+ }
156
+ },
157
+ type: 'object'
158
+ }],
159
+ type: 'suggestion'
160
+ }
161
+ });
162
+
163
+ exports.default = _default;
164
+ module.exports = exports.default;
165
+ //# sourceMappingURL=sortTags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/rules/sortTags.js"],"names":["context","jsdoc","utils","tagSequence","defaultTagOrder","alphabetizeExtras","options","otherPos","indexOf","endPos","length","ongoingCount","idx","tag","tags","entries","originalIndex","source","originalLine","firstChangedTagLine","firstChangedTagIndex","sortedTags","JSON","parse","stringify","sort","tagNew","tagOld","checkOrSetFirstChanged","newPos","oldPos","preferredNewPos","preferredOldPos","undefined","firstLine","getFirstLine","fix","itemsToMoveRange","Array","from","keys","unchangedPriorTagDescriptions","slice","reduce","ct","initialOffset","removeTag","changedTags","extraTagCount","changedTag","addTag","tokens","end","addLine","reportJSDoc","join","iterateAllJsdocs","meta","docs","description","url","fixable","schema","additionalProperies","properties","type","items"],"mappings":"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","sourcesContent":["import defaultTagOrder from '../defaultTagOrder';\nimport iterateJsdoc from '../iterateJsdoc';\n\nexport default iterateJsdoc(({\n context,\n jsdoc,\n utils,\n}) => {\n const {\n tagSequence = defaultTagOrder,\n alphabetizeExtras = false,\n } = context.options[0] || {};\n\n const otherPos = tagSequence.indexOf('-other');\n const endPos = otherPos > -1 ? otherPos : tagSequence.length;\n\n let ongoingCount = 0;\n for (const [\n idx,\n tag,\n ] of jsdoc.tags.entries()) {\n tag.originalIndex = idx;\n ongoingCount += tag.source.length;\n tag.originalLine = ongoingCount;\n }\n\n let firstChangedTagLine;\n let firstChangedTagIndex;\n const sortedTags = JSON.parse(JSON.stringify(jsdoc.tags));\n sortedTags.sort(({\n tag: tagNew,\n }, {\n originalIndex,\n originalLine,\n tag: tagOld,\n }) => {\n // Optimize: Just keep relative positions if the same tag name\n if (tagNew === tagOld) {\n return 0;\n }\n\n const checkOrSetFirstChanged = () => {\n if (!firstChangedTagLine || originalLine < firstChangedTagLine) {\n firstChangedTagLine = originalLine;\n firstChangedTagIndex = originalIndex;\n }\n };\n\n const newPos = tagSequence.indexOf(tagNew);\n const oldPos = tagSequence.indexOf(tagOld);\n\n const preferredNewPos = newPos === -1 ? endPos : newPos;\n const preferredOldPos = oldPos === -1 ? endPos : oldPos;\n\n if (preferredNewPos < preferredOldPos) {\n checkOrSetFirstChanged();\n return -1;\n }\n\n if (preferredNewPos > preferredOldPos) {\n return 1;\n }\n\n // preferredNewPos === preferredOldPos\n if (\n !alphabetizeExtras ||\n\n // Optimize: If tagNew (or tagOld which is the same) was found in the\n // priority array, it can maintain its relative position—without need\n // of alphabetizing (secondary sorting)\n newPos >= 0\n ) {\n return 0;\n }\n\n if (tagNew < tagOld) {\n checkOrSetFirstChanged();\n return -1;\n }\n\n // tagNew > tagOld\n return 1;\n });\n\n if (firstChangedTagLine === undefined) {\n return;\n }\n\n const firstLine = utils.getFirstLine();\n\n const fix = () => {\n const itemsToMoveRange = [\n ...Array.from({\n length: jsdoc.tags.length - firstChangedTagIndex,\n }).keys(),\n ];\n\n const unchangedPriorTagDescriptions = jsdoc.tags.slice(\n 0,\n firstChangedTagIndex,\n ).reduce((ct, {\n source,\n }) => {\n return ct + source.length - 1;\n }, 0);\n\n // This offset includes not only the offset from where the first tag\n // must begin, and the additional offset of where the first changed\n // tag begins, but it must also account for prior descriptions\n const initialOffset = firstLine + firstChangedTagIndex +\n\n // May be the first tag, so don't try finding a prior one if so\n unchangedPriorTagDescriptions;\n\n // Use `firstChangedTagLine` for line number to begin reporting/splicing\n for (const idx of itemsToMoveRange) {\n utils.removeTag(idx + firstChangedTagIndex);\n }\n\n const changedTags = sortedTags.slice(firstChangedTagIndex);\n let extraTagCount = 0;\n\n for (const idx of itemsToMoveRange) {\n const changedTag = changedTags[idx];\n\n utils.addTag(\n changedTag.tag,\n extraTagCount + initialOffset + idx,\n {\n ...changedTag.source[0].tokens,\n\n // `comment-parser` puts the `end` within the `tags` section, so\n // avoid adding another to jsdoc.source\n end: '',\n },\n );\n\n for (const {\n tokens,\n } of changedTag.source.slice(1)) {\n if (!tokens.end) {\n utils.addLine(\n extraTagCount + initialOffset + idx + 1,\n {\n ...tokens,\n end: '',\n },\n );\n extraTagCount++;\n }\n }\n }\n };\n\n utils.reportJSDoc(\n `Tags are not in the prescribed order: ${tagSequence.join(', ')}`,\n jsdoc.tags[firstChangedTagIndex],\n fix,\n true,\n );\n}, {\n iterateAllJsdocs: true,\n meta: {\n docs: {\n description: '',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-sort-tags',\n },\n fixable: 'code',\n schema: [\n {\n additionalProperies: false,\n properties: {\n alphabetizeExtras: {\n type: 'boolean',\n },\n tagSequence: {\n items: {\n type: 'string',\n },\n type: 'array',\n },\n },\n type: 'object',\n },\n ],\n type: 'suggestion',\n },\n});\n"],"file":"sortTags.js"}
package/package.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "url": "http://gajus.com"
6
6
  },
7
7
  "dependencies": {
8
- "@es-joy/jsdoccomment": "~0.17.0",
8
+ "@es-joy/jsdoccomment": "~0.18.0",
9
9
  "comment-parser": "1.3.0",
10
10
  "debug": "^4.3.3",
11
11
  "escape-string-regexp": "^4.0.0",
@@ -16,30 +16,30 @@
16
16
  },
17
17
  "description": "JSDoc linting rules for ESLint.",
18
18
  "devDependencies": {
19
- "@babel/cli": "^7.16.8",
20
- "@babel/core": "^7.16.10",
21
- "@babel/eslint-parser": "^7.16.5",
19
+ "@babel/cli": "^7.17.0",
20
+ "@babel/core": "^7.17.0",
21
+ "@babel/eslint-parser": "^7.17.0",
22
22
  "@babel/node": "^7.16.8",
23
23
  "@babel/plugin-syntax-class-properties": "^7.12.13",
24
24
  "@babel/plugin-transform-flow-strip-types": "^7.16.7",
25
25
  "@babel/preset-env": "^7.16.11",
26
- "@babel/register": "^7.16.9",
26
+ "@babel/register": "^7.17.0",
27
27
  "@hkdobrev/run-if-changed": "^0.3.1",
28
- "@typescript-eslint/parser": "^5.10.0",
28
+ "@typescript-eslint/parser": "^5.10.2",
29
29
  "babel-plugin-add-module-exports": "^1.0.4",
30
30
  "babel-plugin-istanbul": "^6.1.1",
31
31
  "camelcase": "^6.3.0",
32
- "chai": "^4.3.4",
32
+ "chai": "^4.3.6",
33
33
  "cross-env": "^7.0.3",
34
34
  "decamelize": "^5.0.1",
35
- "eslint": "^8.7.0",
35
+ "eslint": "^8.8.0",
36
36
  "eslint-config-canonical": "^33.0.1",
37
37
  "gitdown": "^3.1.4",
38
38
  "glob": "^7.2.0",
39
39
  "husky": "^7.0.4",
40
- "lint-staged": "^12.2.2",
40
+ "lint-staged": "^12.3.3",
41
41
  "lodash.defaultsdeep": "^4.6.1",
42
- "mocha": "^9.1.4",
42
+ "mocha": "^9.2.0",
43
43
  "nyc": "^15.1.0",
44
44
  "open-editor": "^3.0.0",
45
45
  "rimraf": "^3.0.2",
@@ -107,5 +107,5 @@
107
107
  "test-index": "cross-env BABEL_ENV=test mocha --recursive --require @babel/register --reporter progress --timeout 12000 test/rules/index.js",
108
108
  "test-no-cov": "cross-env BABEL_ENV=test mocha --reporter dot --recursive --require @babel/register --timeout 12000"
109
109
  },
110
- "version": "37.6.2"
110
+ "version": "37.8.0"
111
111
  }