UNPKG

@intlify/eslint-plugin-vue-i18n

Version:
280 lines (279 loc) 9.37 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getYAMLPlainStringOffset = exports.getYAMLDoubleQuotedStringOffset = exports.getYAMLSingleQuotedStringOffset = exports.getJSONStringOffset = exports.getReportIndex = exports.getMessageSyntaxVersions = exports.NodeTypes = void 0; const semver_1 = require("semver"); exports.NodeTypes = { Resource: 0, Plural: 1, Message: 2, Text: 3, Named: 4, List: 5, Linked: 6, LinkedKey: 7, LinkedModifier: 8, Literal: 9 }; const puttedSettingsError = new WeakSet(); function getMessageSyntaxVersions(context) { const { settings } = context; const messageSyntaxVersion = settings['vue-i18n'] && settings['vue-i18n'].messageSyntaxVersion; if (!messageSyntaxVersion) { return { v9: true, v10: true, v11: true, isNotSet: true, reportIfMissingSetting: () => { if (!puttedSettingsError.has(context)) { const ruleName = context.id; context.report({ loc: { line: 1, column: 0 }, message: `If you want to use '${ruleName}' rule, you need to set 'messageSyntaxVersion' at 'settings'. See the 'eslint-plugin-vue-i18n' documentation` }); puttedSettingsError.add(context); } return true; } }; } const range = new semver_1.Range(messageSyntaxVersion); const v9 = (0, semver_1.intersects)(range, '^9.0.0-0'); const v10 = (0, semver_1.intersects)(range, '^10.0.0-0'); const v11 = (0, semver_1.intersects)(range, '>=11.0.0-0'); if (!v9 && !v10 && !v11 && !puttedSettingsError.has(context)) { context.report({ loc: { line: 1, column: 0 }, message: `Please specify 9 or higher for 'messageSyntaxVersion' at 'settings'.` }); puttedSettingsError.add(context); } return { v9, v10, v11, isNotSet: false, reportIfMissingSetting: () => false }; } exports.getMessageSyntaxVersions = getMessageSyntaxVersions; function getReportIndex(node, stringOffset) { if (node.type === 'JSONLiteral' || node.type === 'JSONTemplateLiteral') { const stringCode = node.type === 'JSONLiteral' ? node.raw.slice(1, -1) : node.quasis[0].value.raw; return (node.range[0] + 1 + getJSONStringOffset(stringCode, stringOffset)); } if (node.type === 'YAMLScalar') { if (node.style === 'single-quoted' || node.style === 'double-quoted') { const stringCode = node.raw.slice(1, -1); return (node.range[0] + 1 + (node.style === 'single-quoted' ? getYAMLSingleQuotedStringOffset(stringCode, stringOffset) : getYAMLDoubleQuotedStringOffset(stringCode, stringOffset))); } if (node.style === 'plain') { const stringCode = node.raw; return node.range[0] + getYAMLPlainStringOffset(stringCode, stringOffset); } } return null; } exports.getReportIndex = getReportIndex; function getJSONStringOffset(code, stringOffset) { let offset = stringOffset; let codeIndex = 0; let char; while ((char = code[codeIndex++]) && offset > 0) { if (char === '\\') { char = code[codeIndex++]; if (char === 'x') { codeIndex += 2; } else if (char === 'u') { char = code[codeIndex++]; if (char === '{') { let pointStr = ''; while ((char = code[codeIndex++]) && char !== '}') { pointStr += char; } let point = parseInt(pointStr, 16); while (point > 0xffff) { offset--; point >>= 16; } } else { codeIndex += 3; } } else if (char >= '0' && char <= '9') { let octalStr = code.substr(codeIndex - 1, 3).match(/^[0-7]+/u)[0]; const octal = parseInt(octalStr, 8); if (octal > 255) { octalStr = octalStr.slice(0, -1); } if (octalStr.length >= 2) { codeIndex += octalStr.length - 1; } } } offset--; } return Math.min(codeIndex - 1, code.length); } exports.getJSONStringOffset = getJSONStringOffset; function getYAMLSingleQuotedStringOffset(code, stringOffset) { let offset = stringOffset; let codeIndex = 0; let char; let lineFolding = 0; while ((char = code[codeIndex++]) && offset > 0) { if (char === "'" && code[codeIndex] === "'") { codeIndex++; lineFolding = 0; } else if (isSpaceOrEOL(char)) { let nextCodeIndex = processMaybeLineFolding(code, codeIndex - 1); if (nextCodeIndex != null) { if (lineFolding === 0 && isEOL(code[nextCodeIndex])) { nextCodeIndex = processMaybeLineFolding(code, nextCodeIndex); } codeIndex = nextCodeIndex; lineFolding++; } else { lineFolding = 0; } } else { lineFolding = 0; } offset--; } return Math.min(codeIndex - 1, code.length); } exports.getYAMLSingleQuotedStringOffset = getYAMLSingleQuotedStringOffset; function getYAMLDoubleQuotedStringOffset(code, stringOffset) { let offset = stringOffset; let codeIndex = 0; let char; let lineFolding = 0; while ((char = code[codeIndex++]) && offset > 0) { if (char === '\\') { char = code[codeIndex++]; if (char === 'x') { codeIndex += 2; } else if (char === 'u') { codeIndex += 4; } else if (char === 'U') { if (code.substr(codeIndex, 4) !== '0000') { offset--; } codeIndex += 8; } else if (isEOL(char)) { const nextCodeIndex = processMaybeLineFolding(code, codeIndex - 1); if (nextCodeIndex != null) { codeIndex = nextCodeIndex + 1; if (code[nextCodeIndex] === '\\') { codeIndex--; lineFolding = 0; continue; } } } lineFolding = 0; } else if (isSpaceOrEOL(char)) { let nextCodeIndex = processMaybeLineFolding(code, codeIndex - 1); if (nextCodeIndex != null) { if (lineFolding === 0 && isEOL(code[nextCodeIndex])) { nextCodeIndex = processMaybeLineFolding(code, nextCodeIndex); } codeIndex = nextCodeIndex; lineFolding++; } else { lineFolding = 0; } } else { lineFolding = 0; } offset--; } return Math.min(codeIndex - 1, code.length); } exports.getYAMLDoubleQuotedStringOffset = getYAMLDoubleQuotedStringOffset; function getYAMLPlainStringOffset(code, stringOffset) { let offset = stringOffset; let codeIndex = 0; let char; let lineFolding = 0; while ((char = code[codeIndex++]) && offset > 0) { if (isSpaceOrEOL(char)) { let nextCodeIndex = processMaybeLineFolding(code, codeIndex - 1); if (nextCodeIndex != null) { if (lineFolding === 0 && isEOL(code[nextCodeIndex])) { nextCodeIndex = processMaybeLineFolding(code, nextCodeIndex); } codeIndex = nextCodeIndex; lineFolding++; } else { lineFolding = 0; } } else { lineFolding = 0; } offset--; } return Math.min(codeIndex - 1, code.length); } exports.getYAMLPlainStringOffset = getYAMLPlainStringOffset; function isSpace(char) { return char === ' ' || char === '\t'; } function isSpaceOrEOL(char) { return isSpace(char) || isEOL(char); } function isEOL(char) { return char === '\n' || char === '\r'; } function processMaybeLineFolding(code, spaceIndex) { let codeIndex = spaceIndex; let char; let hasNewline = false; while ((char = code[codeIndex++])) { if (isEOL(char)) { if (hasNewline) { return codeIndex - 1; } if (char === '\r' && code[codeIndex] === '\n') { codeIndex++; } hasNewline = true; } else if (!isSpace(char)) { if (hasNewline) { return codeIndex - 1; } else { return null; } } } if (hasNewline) { return codeIndex - 1; } else { return null; } }