"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } const defaultTags = { file: { initialCommentsOnly: true, mustExist: true, preventDuplicates: true } }; const setDefaults = state => { // First iteration if (!state.globalTags) { state.globalTags = {}; state.hasDuplicates = {}; state.hasTag = {}; state.hasNonCommentBeforeTag = {}; } }; var _default = (0, _iterateJsdoc.default)(({ jsdocNode, state, utils, context }) => { const _ref = context.options[0] || {}, _ref$tags = _ref.tags, tags = _ref$tags === void 0 ? defaultTags : _ref$tags; setDefaults(state); for (var _i = 0, _Object$keys = Object.keys(tags); _i < _Object$keys.length; _i++) { const tagName = _Object$keys[_i]; const targetTagName = utils.getPreferredTagName({ tagName }); const hasTag = targetTagName && utils.hasTag(targetTagName); state.hasTag[tagName] = hasTag || state.hasTag[tagName]; const hasDuplicate = state.hasDuplicates[tagName]; if (hasDuplicate === false) { // Was marked before, so if a tag now, is a dupe state.hasDuplicates[tagName] = hasTag; } else if (!hasDuplicate && hasTag) { // No dupes set before, but has first tag, so change state // from `undefined` to `false` so can detect next time state.hasDuplicates[tagName] = false; state.hasNonCommentBeforeTag[tagName] = state.hasNonComment && state.hasNonComment < jsdocNode.start; } } }, { exit({ context, state, utils }) { setDefaults(state); const _ref2 = context.options[0] || {}, _ref2$tags = _ref2.tags, tags = _ref2$tags === void 0 ? defaultTags : _ref2$tags; for (var _i2 = 0, _Object$entries = Object.entries(tags); _i2 < _Object$entries.length; _i2++) { const _Object$entries$_i = _slicedToArray(_Object$entries[_i2], 2), tagName = _Object$entries$_i[0], _Object$entries$_i$ = _Object$entries$_i[1], _Object$entries$_i$$m = _Object$entries$_i$.mustExist, mustExist = _Object$entries$_i$$m === void 0 ? false : _Object$entries$_i$$m, _Object$entries$_i$$p = _Object$entries$_i$.preventDuplicates, preventDuplicates = _Object$entries$_i$$p === void 0 ? false : _Object$entries$_i$$p, _Object$entries$_i$$i = _Object$entries$_i$.initialCommentsOnly, initialCommentsOnly = _Object$entries$_i$$i === void 0 ? false : _Object$entries$_i$$i; const obj = utils.getPreferredTagNameObject({ tagName }); if (obj && obj.blocked) { utils.reportSettings(`\`settings.jsdoc.tagNamePreference\` cannot block @${obj.tagName} ` + 'for the `require-file-overview` rule'); } else { const targetTagName = obj && obj.replacement || obj; if (mustExist && !state.hasTag[tagName]) { utils.reportSettings(`Missing @${targetTagName}`); } if (preventDuplicates && state.hasDuplicates[tagName]) { utils.reportSettings(`Duplicate @${targetTagName}`); } if (initialCommentsOnly && state.hasNonCommentBeforeTag[tagName]) { utils.reportSettings(`@${targetTagName} should be at the beginning of the file`); } } } }, iterateAllJsdocs: true, meta: { schema: [{ additionalProperties: false, properties: { tags: { patternProperties: { '.*': { additionalProperties: false, properties: { initialCommentsOnly: { type: 'boolean' }, mustExist: { type: 'boolean' }, preventDuplicates: { type: 'boolean' } }, type: 'object' } }, type: 'object' } }, type: 'object' }], type: 'suggestion' }, nonComment({ state, node }) { if (!state.hasNonComment) { state.hasNonComment = node.start; } } }); exports.default = _default; module.exports = exports.default; //# sourceMappingURL=requireFileOverview.js.map