From f04ad114f460dfb75a6599c1d26eaecb8bd2a408 Mon Sep 17 00:00:00 2001 From: yosuke ota Date: Wed, 29 Jan 2025 15:36:06 +0900 Subject: [PATCH] refactor --- scripts/update-fixtures-ast.js | 10 +-- scripts/update-fixtures-document-fragment.js | 11 +-- src/ast/traverse.ts | 3 +- src/common/ast-utils.ts | 4 +- src/common/eslint-scope.ts | 2 +- src/common/espree.ts | 2 +- src/common/fix-locations.ts | 4 +- src/common/location-calculator.ts | 2 +- src/external/token-store/index.ts | 2 +- src/html/intermediate-tokenizer.ts | 2 +- src/html/parser.ts | 7 +- src/html/tokenizer.ts | 3 +- src/index.ts | 30 ++++---- src/parser-services.ts | 2 +- src/script-setup/index.ts | 10 +-- src/script-setup/scope-analyzer.ts | 2 +- src/script/index.ts | 40 +++++------ src/script/scope-analyzer.ts | 6 +- src/sfc/custom-block/index.ts | 12 ++-- src/style/index.ts | 6 +- src/template/index.ts | 14 ++-- test/ast.js | 20 +++--- test/document-fragment.js | 10 +-- test/test-utils.js | 8 +-- test/tokens.js | 5 +- test/variables-references.js | 55 +++----------- tsconfig.json | 76 ++++++++++---------- 27 files changed, 153 insertions(+), 195 deletions(-) diff --git a/scripts/update-fixtures-ast.js b/scripts/update-fixtures-ast.js index a998c3f8..6f6e780b 100644 --- a/scripts/update-fixtures-ast.js +++ b/scripts/update-fixtures-ast.js @@ -102,11 +102,11 @@ for (const name of TARGETS) { const servicesPath = path.join(ROOT, `${name}/services.json`) const source = fs.readFileSync(sourcePath, "utf8") const parserOptions = optionsPath ? require(optionsPath) : {} - const options = Object.assign( - { filePath: sourcePath }, - PARSER_OPTIONS, - parserOptions, - ) + const options = { + filePath: sourcePath, + ...PARSER_OPTIONS, + ...parserOptions, + } // console.log("Start:", name) const actual = parser.parseForESLint(source, options) const tokenRanges = getAllTokens(actual.ast).map((t) => diff --git a/scripts/update-fixtures-document-fragment.js b/scripts/update-fixtures-document-fragment.js index a0a0c64e..470bc262 100644 --- a/scripts/update-fixtures-document-fragment.js +++ b/scripts/update-fixtures-document-fragment.js @@ -58,11 +58,12 @@ for (const name of TARGETS) { path.join(ROOT, `${name}/parser-options.js`), ].find((fp) => fs.existsSync(fp)) const source = fs.readFileSync(sourcePath, "utf8") - const options = Object.assign( - { filePath: sourcePath }, - PARSER_OPTIONS, - optionsPath ? require(optionsPath) : {}, - ) + const options = { + filePath: sourcePath, + ...PARSER_OPTIONS, + ...(optionsPath ? require(optionsPath) : {}), + } + const result = parser.parseForESLint(source, options) const actual = result.services.getDocumentFragment() diff --git a/src/ast/traverse.ts b/src/ast/traverse.ts index 448f210a..13cec66a 100644 --- a/src/ast/traverse.ts +++ b/src/ast/traverse.ts @@ -27,6 +27,7 @@ export const KEYS = Evk.unionWith({ VSlotScopeExpression: ["params"], VStartTag: ["attributes"], VText: [], + VGenericExpression: ["expression"], }) /** @@ -82,7 +83,7 @@ function traverse(node: Node, parent: Node | null, visitor: Visitor): void { visitor.enterNode(node, parent) const keys = - (visitor.visitorKeys || KEYS)[node.type] || getFallbackKeys(node) + (visitor.visitorKeys ?? KEYS)[node.type] ?? getFallbackKeys(node) for (i = 0; i < keys.length; ++i) { const child = (node as any)[keys[i]] diff --git a/src/common/ast-utils.ts b/src/common/ast-utils.ts index 689b373c..ae541bc6 100644 --- a/src/common/ast-utils.ts +++ b/src/common/ast-utils.ts @@ -78,8 +78,8 @@ export function isLang( * @returns The `lang` attribute value. */ export function getLang(element: VElement | undefined): string | null { - const langAttr = element && element.startTag.attributes.find(isLang) - const lang = langAttr && langAttr.value && langAttr.value.value + const langAttr = element?.startTag.attributes.find(isLang) + const lang = langAttr?.value?.value return lang || null } /** diff --git a/src/common/eslint-scope.ts b/src/common/eslint-scope.ts index a0e96810..d5a0db21 100644 --- a/src/common/eslint-scope.ts +++ b/src/common/eslint-scope.ts @@ -12,7 +12,7 @@ let escopeCache: ESLintScope | null = null * Load the newest `eslint-scope` from the loaded ESLint or dependency. */ export function getEslintScope(): ESLintScope { - return escopeCache || (escopeCache = getNewest()) + return escopeCache ?? (escopeCache = getNewest()) } /** diff --git a/src/common/espree.ts b/src/common/espree.ts index f9c1efcc..8622ff32 100644 --- a/src/common/espree.ts +++ b/src/common/espree.ts @@ -16,7 +16,7 @@ let espreeCache: Espree | null = null * Gets the espree that the given ecmaVersion can parse. */ export function getEspree(): Espree { - return espreeCache || (espreeCache = getNewestEspree()) + return espreeCache ?? (espreeCache = getNewestEspree()) } export function getEcmaVersionIfUseEspree( diff --git a/src/common/fix-locations.ts b/src/common/fix-locations.ts index 8772ba84..6bdbdb06 100644 --- a/src/common/fix-locations.ts +++ b/src/common/fix-locations.ts @@ -24,10 +24,10 @@ export function fixLocations( ): void { fixNodeLocations(result.ast, result.visitorKeys, locationCalculator) - for (const token of result.ast.tokens || []) { + for (const token of result.ast.tokens ?? []) { fixLocation(token, locationCalculator) } - for (const comment of result.ast.comments || []) { + for (const comment of result.ast.comments ?? []) { fixLocation(comment, locationCalculator) } } diff --git a/src/common/location-calculator.ts b/src/common/location-calculator.ts index 6f45ceca..8c8cf344 100644 --- a/src/common/location-calculator.ts +++ b/src/common/location-calculator.ts @@ -62,7 +62,7 @@ export class LocationCalculatorForHtml super(ltOffsets) this.gapOffsets = gapOffsets this.ltOffsets = ltOffsets - this.baseOffset = baseOffset || 0 + this.baseOffset = baseOffset ?? 0 this.baseIndexOfGap = this.baseOffset === 0 ? 0 diff --git a/src/external/token-store/index.ts b/src/external/token-store/index.ts index 1a6af0b8..a0bdabbe 100644 --- a/src/external/token-store/index.ts +++ b/src/external/token-store/index.ts @@ -334,7 +334,7 @@ export default class TokenStore { ) .getOneToken() - if (token && token.range[0] === offset) { + if (token?.range[0] === offset) { return token } return null diff --git a/src/html/intermediate-tokenizer.ts b/src/html/intermediate-tokenizer.ts index 50b31cae..62d4ca90 100644 --- a/src/html/intermediate-tokenizer.ts +++ b/src/html/intermediate-tokenizer.ts @@ -222,7 +222,7 @@ export class IntermediateTokenizer { private processComment(token: Token): IntermediateToken | null { this.comments.push(token) - if (this.currentToken != null && this.currentToken.type === "Text") { + if (this.currentToken?.type === "Text") { return this.commit() } return null diff --git a/src/html/parser.ts b/src/html/parser.ts index 367eecc4..ed155e9a 100644 --- a/src/html/parser.ts +++ b/src/html/parser.ts @@ -421,7 +421,7 @@ export class Parser { if (name === "template") { const xmlns = token.attributes.find((a) => a.key.name === "xmlns") - const value = xmlns && xmlns.value && xmlns.value.value + const value = xmlns?.value?.value if (value === NS.HTML || value === NS.MathML || value === NS.SVG) { return value @@ -477,7 +477,7 @@ export class Parser { node.key.name = adjustAttributeName(node.key.name, namespace) const key = this.getTagName(node.key) - const value = node.value && node.value.value + const value = node.value?.value if (key === "xmlns" && value !== namespace) { this.reportParseError(node, "x-invalid-namespace") @@ -616,8 +616,7 @@ export class Parser { for (const attribute of element.startTag.attributes) { if (attribute.directive) { if ( - attribute.key.argument != null && - attribute.key.argument.type === "VExpressionContainer" + attribute.key.argument?.type === "VExpressionContainer" ) { resolveReferences(attribute.key.argument) } diff --git a/src/html/tokenizer.ts b/src/html/tokenizer.ts index 220eb5e4..6285cdfa 100644 --- a/src/html/tokenizer.ts +++ b/src/html/tokenizer.ts @@ -980,8 +980,7 @@ export class Tokenizer { function maybeValidCustomBlock(this: Tokenizer, nextCp: number) { return ( this.currentToken && - this.lastTagOpenToken && - this.lastTagOpenToken.value.startsWith( + this.lastTagOpenToken?.value.startsWith( this.currentToken.value + String.fromCodePoint(nextCp), ) ) diff --git a/src/index.ts b/src/index.ts index 3b45a182..3b0c462e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -49,15 +49,13 @@ export function parseForESLint( code: string, parserOptions: any, ): AST.ESLintExtendedProgram { - const options: ParserOptions = Object.assign( - { - comment: true, - loc: true, - range: true, - tokens: true, - }, - parserOptions || {}, - ) + const options: ParserOptions = { + comment: true, + loc: true, + range: true, + tokens: true, + ...(parserOptions ?? {}), + } let result: AST.ESLintExtendedProgram let document: AST.VDocumentFragment | null @@ -70,12 +68,12 @@ export function parseForESLint( ;({ result, document, locationCalculator } = parseAsSFC(code, options)) } - result.services = Object.assign( - result.services || {}, - services.define(code, result.ast, document, locationCalculator, { + result.services = { + ...(result.services || {}), + ...services.define(code, result.ast, document, locationCalculator, { parserOptions: options, }), - ) + } return result } @@ -96,7 +94,7 @@ export { AST } function parseAsSFC(code: string, options: ParserOptions) { const optionsForTemplate = { ...options, - ecmaVersion: options.ecmaVersion || DEFAULT_ECMA_VERSION, + ecmaVersion: options.ecmaVersion ?? DEFAULT_ECMA_VERSION, } const skipParsingScript = options.parser === false const tokenizer = new HTMLTokenizer(code, optionsForTemplate) @@ -128,7 +126,7 @@ function parseAsSFC(code: string, options: ParserOptions) { if (skipParsingScript || !scripts.length) { result = parseScript("", { ...options, - ecmaVersion: options.ecmaVersion || DEFAULT_ECMA_VERSION, + ecmaVersion: options.ecmaVersion ?? DEFAULT_ECMA_VERSION, parser: scriptParser, }) } else if ( @@ -195,7 +193,7 @@ function parseAsSFC(code: string, options: ParserOptions) { function parseAsScript(code: string, options: ParserOptions) { return parseScript(code, { ...options, - ecmaVersion: options.ecmaVersion || DEFAULT_ECMA_VERSION, + ecmaVersion: options.ecmaVersion ?? DEFAULT_ECMA_VERSION, parser: getScriptParser(options.parser, () => { const ext = ( path.extname(options.filePath || "unknown.js").toLowerCase() || diff --git a/src/parser-services.ts b/src/parser-services.ts index 5916c1aa..3b830c41 100644 --- a/src/parser-services.ts +++ b/src/parser-services.ts @@ -341,7 +341,7 @@ export function define( ) // Register handlers into the intermediate event emitter. for (const selector of Object.keys( - visitor || {}, + visitor ?? {}, )) { emitter.on(selector, visitor![selector]) } diff --git a/src/script-setup/index.ts b/src/script-setup/index.ts index 52c15eeb..671a2bc5 100644 --- a/src/script-setup/index.ts +++ b/src/script-setup/index.ts @@ -216,7 +216,7 @@ export function parseScriptSetupElements( ): ESLintExtendedProgram { const parserOptions: ParserOptions = { ...originalParserOptions, - ecmaVersion: originalParserOptions.ecmaVersion || DEFAULT_ECMA_VERSION, + ecmaVersion: originalParserOptions.ecmaVersion ?? DEFAULT_ECMA_VERSION, } const scriptSetupModuleCodeBlocks = getScriptSetupModuleCodeBlocks( scriptSetupElement, @@ -323,7 +323,7 @@ export function parseScriptSetupElements( const textNode = node.children[0] return Math.min( start, - textNode != null && textNode.type === "VText" + textNode?.type === "VText" ? textNode.range[0] : node.startTag.range[1], ) @@ -344,7 +344,7 @@ export function parseScriptSetupElements( const textNode = node.children[0] return Math.max( end, - textNode != null && textNode.type === "VText" + textNode?.type === "VText" ? textNode.range[1] : (node.endTag?.range[0] ?? node.range[1]), ) @@ -575,7 +575,7 @@ function getScriptSetupCodeBlocks( (t) => t.range[0] === body.range[0], ) const exportToken = tokens[exportTokenIndex] - if (exportToken && exportToken.value === "export") { + if (exportToken?.value === "export") { // Consume code up to the start position of `export`. // The code may contain legacy decorators. append(statementCodeBlocks, usedOffset, exportToken.range[0]) @@ -958,7 +958,7 @@ function remapLocationAndTokens( { codeBlocks }: ScriptSetupModuleCodeBlocks, locationCalculator: LocationCalculator, ) { - const tokens = result.ast.tokens || [] + const tokens = result.ast.tokens ?? [] const endMap = new Map() const buffer: number[] = [] diff --git a/src/script-setup/scope-analyzer.ts b/src/script-setup/scope-analyzer.ts index a7e3dee6..0016b991 100644 --- a/src/script-setup/scope-analyzer.ts +++ b/src/script-setup/scope-analyzer.ts @@ -131,7 +131,7 @@ function extractVariables(scopeManager: escopeTypes.ScopeManager) { const moduleScope = globalScope.childScopes.find( (scope) => scope.type === "module", ) - for (const variable of (moduleScope && moduleScope.variables) || []) { + for (const variable of moduleScope?.variables ?? []) { scriptVariables.set(variable.name, variable) } return scriptVariables diff --git a/src/script/index.ts b/src/script/index.ts index 5677e0f4..261e575b 100644 --- a/src/script/index.ts +++ b/src/script/index.ts @@ -375,8 +375,8 @@ function parseExpressionBody( parserOptions, ) const { ast } = result - const tokens = ast.tokens || [] - const comments = ast.comments || [] + const tokens = ast.tokens ?? [] + const comments = ast.comments ?? [] const references = analyzeExternalReferences(result, parserOptions) const statement = ast.body[0] as ESLintExpressionStatement const callExpression = statement.expression as ESLintCallExpression @@ -385,7 +385,7 @@ function parseExpressionBody( if (!allowEmpty && !expression) { return throwEmptyError(locationCalculator, "an expression") } - if (expression && expression.type === "SpreadElement") { + if (expression?.type === "SpreadElement") { return throwUnexpectedTokenError("...", expression) } if (callExpression.arguments[1]) { @@ -610,14 +610,14 @@ export function parseScriptElement( ): ESLintExtendedProgram { const parserOptions: ParserOptions = { ...originalParserOptions, - ecmaVersion: originalParserOptions.ecmaVersion || DEFAULT_ECMA_VERSION, + ecmaVersion: originalParserOptions.ecmaVersion ?? DEFAULT_ECMA_VERSION, } let generic: GenericProcessInfo | null = null let code: string let offset: number const textNode = node.children[0] - if (textNode != null && textNode.type === "VText") { + if (textNode?.type === "VText") { const [scriptStartOffset, scriptEndOffset] = textNode.range code = sfcCode.slice(scriptStartOffset, scriptEndOffset) offset = scriptStartOffset @@ -738,8 +738,8 @@ export function parseExpression( parent: null as any, expression: retB.expression, filters: [], - range: retB.expression.range.slice(0) as [number, number], - loc: Object.assign({}, retB.expression.loc), + range: [...retB.expression.range] as const, + loc: { ...retB.expression.loc }, } ret.expression.expression.parent = ret.expression @@ -831,8 +831,8 @@ export function parseVForExpression( parserOptions, ) const { ast } = result - const tokens = ast.tokens || [] - const comments = ast.comments || [] + const tokens = ast.tokens ?? [] + const comments = ast.comments ?? [] const scope = analyzeVariablesAndExternalReferences( result, "v-for", @@ -1013,8 +1013,8 @@ function parseVForAliasesForEcmaVersion5( parserOptions, ) const { ast } = result - const tokens = ast.tokens || [] - const comments = ast.comments || [] + const tokens = ast.tokens ?? [] + const comments = ast.comments ?? [] const variables = analyzeExternalReferences(result, parserOptions).map( transformVariable, ) @@ -1064,8 +1064,8 @@ function parseVForIteratorForEcmaVersion5( parserOptions, ) const { ast } = result - const tokens = ast.tokens || [] - const comments = ast.comments || [] + const tokens = ast.tokens ?? [] + const comments = ast.comments ?? [] const references = analyzeExternalReferences(result, parserOptions) const statement = ast.body[0] as ESLintExpressionStatement @@ -1075,7 +1075,7 @@ function parseVForIteratorForEcmaVersion5( if (!expression) { return throwEmptyError(locationCalculator, "an expression") } - if (expression && expression.type === "SpreadElement") { + if (expression?.type === "SpreadElement") { return throwUnexpectedTokenError("...", expression) } const right = expression @@ -1162,8 +1162,8 @@ function parseVOnExpressionBody( parent: DUMMY_PARENT, body, } - const tokens = ast.tokens || [] - const comments = ast.comments || [] + const tokens = ast.tokens ?? [] + const comments = ast.comments ?? [] // Modify parent. for (const b of body) { @@ -1223,8 +1223,8 @@ export function parseSlotScopeExpression( } } - const tokens = ast.tokens || [] - const comments = ast.comments || [] + const tokens = ast.tokens ?? [] + const comments = ast.comments ?? [] const scope = analyzeVariablesAndExternalReferences( result, "scope", @@ -1322,8 +1322,8 @@ export function parseGenericExpression( } } - const tokens = ast.tokens || [] - const comments = ast.comments || [] + const tokens = ast.tokens ?? [] + const comments = ast.comments ?? [] const scope = analyzeVariablesAndExternalReferences( result, "generic", diff --git a/src/script/scope-analyzer.ts b/src/script/scope-analyzer.ts index 0f42cab6..309bc682 100644 --- a/src/script/scope-analyzer.ts +++ b/src/script/scope-analyzer.ts @@ -102,10 +102,10 @@ export function analyzeScope( parserOptions: ParserOptions, ): escopeTypes.ScopeManager { const ecmaVersion = - getEcmaVersionIfUseEspree(parserOptions) || + getEcmaVersionIfUseEspree(parserOptions) ?? ANALYZE_SCOPE_DEFAULT_ECMA_VERSION - const ecmaFeatures = parserOptions.ecmaFeatures || {} - const sourceType = parserOptions.sourceType || "script" + const ecmaFeatures = parserOptions.ecmaFeatures ?? {} + const sourceType = parserOptions.sourceType ?? "script" const result = getEslintScope().analyze(ast, { ignoreEval: true, nodejsScope: false, diff --git a/src/sfc/custom-block/index.ts b/src/sfc/custom-block/index.ts index 734824ea..6ccfd4c4 100644 --- a/src/sfc/custom-block/index.ts +++ b/src/sfc/custom-block/index.ts @@ -87,7 +87,7 @@ export function parseCustomBlockElement( ): ESLintExtendedProgram & { error?: ParseError | Error } { const text = node.children[0] const { code, range, loc } = - text != null && text.type === "VText" + text?.type === "VText" ? { code: text.value, range: text.range, @@ -263,7 +263,7 @@ export function createCustomBlockSharedContext({ { ...parserOptions, ...options }, ) }, - ...(parsedResult.services || {}), + ...(parsedResult.services ?? {}), ...(parsedResult.error ? { parseError: parsedResult.error } : {}), @@ -295,10 +295,10 @@ export function createCustomBlockSharedContext({ } const ecmaVersion = - getEcmaVersionIfUseEspree(parserOptions) || + getEcmaVersionIfUseEspree(parserOptions) ?? ANALYZE_SCOPE_DEFAULT_ECMA_VERSION - const ecmaFeatures = parserOptions.ecmaFeatures || {} - const sourceType = parserOptions.sourceType || "script" + const ecmaFeatures = parserOptions.ecmaFeatures ?? {} + const sourceType = parserOptions.sourceType ?? "script" return getEslintScope().analyze(parsedResult.ast, { ignoreEval: true, nodejsScope: false, @@ -341,7 +341,7 @@ function getScope(scopeManager: ScopeManager, currentNode: Node) { for ( let node: Node | null = currentNode; node; - node = node.parent || null + node = node.parent ?? null ) { const scope = scopeManager.acquire(node as any, inner) diff --git a/src/style/index.ts b/src/style/index.ts index 2b3be867..bcc01dcd 100644 --- a/src/style/index.ts +++ b/src/style/index.ts @@ -36,7 +36,7 @@ class CSSTokenScanner { this.tokenizer = new CSSTokenizer(text, 0, options) } public nextToken(): CSSToken | null { - return this.reconsuming.shift() || this.tokenizer.nextToken() + return this.reconsuming.shift() ?? this.tokenizer.nextToken() } public reconsume(...tokens: CSSToken[]) { this.reconsuming.push(...tokens) @@ -57,7 +57,7 @@ export function parseStyleElements( ): void { const parserOptions: ParserOptions = { ...originalParserOptions, - ecmaVersion: originalParserOptions.ecmaVersion || DEFAULT_ECMA_VERSION, + ecmaVersion: originalParserOptions.ecmaVersion ?? DEFAULT_ECMA_VERSION, } for (const style of elements) { @@ -372,7 +372,7 @@ function parseVBindArg(tokenizer: CSSTokenScanner): { comments, } } - const startToken = tokensBuffer[0] || token + const startToken = tokensBuffer[0] ?? token return { exprRange: [startToken.range[0], token.range[0]], quote: null, diff --git a/src/template/index.ts b/src/template/index.ts index 1440e05a..80c3f766 100644 --- a/src/template/index.ts +++ b/src/template/index.ts @@ -159,7 +159,7 @@ function parseDirectiveKeyStatically( if (directiveKey.name == null) { directiveKey.name = modifiers.shift()! } else if (directiveKey.argument == null && modifiers[0].name !== "") { - directiveKey.argument = modifiers.shift() || null + directiveKey.argument = modifiers.shift() ?? null } directiveKey.modifiers = modifiers.filter(isNotEmptyModifier) @@ -553,7 +553,7 @@ function resolveReference(referene: Reference, element: VElement): void { let node: VNode | null = element // Find the variable of this reference. - while (node != null && node.type === "VElement") { + while (node?.type === "VElement") { for (const variable of node.variables) { if (variable.id.name === referene.id.name) { referene.variable = variable @@ -592,7 +592,7 @@ export function convertToDirective( debug( '[template] convert to directive: %s="%s" %j', node.key.name, - node.value && node.value.value, + node.value?.value, node.range, ) @@ -607,11 +607,7 @@ export function convertToDirective( ) const { argument } = directive.key - if ( - argument && - argument.type === "VIdentifier" && - argument.name.startsWith("[") - ) { + if (argument?.type === "VIdentifier" && argument.name.startsWith("[")) { const nextChar = code[argument.range[1]] if (nextChar == null || invalidDynamicArgumentNextChar.test(nextChar)) { const char = @@ -778,7 +774,7 @@ export function processMustache( { allowEmpty: true, allowFilters: true }, ) - node.expression = ret.expression || null + node.expression = ret.expression ?? null node.references = ret.references if (ret.expression != null) { ret.expression.parent = node diff --git a/test/ast.js b/test/ast.js index c984b824..c033c807 100644 --- a/test/ast.js +++ b/test/ast.js @@ -77,8 +77,8 @@ function getTree(source, parserOptions) { }, languageOptions: { parser: parser, - ecmaVersion: parserOptions.ecmaVersion || "latest", - sourceType: parserOptions.sourceType || "module", + ecmaVersion: parserOptions.ecmaVersion ?? "latest", + sourceType: parserOptions.sourceType ?? "module", parserOptions: parserOptions, }, rules: { "test/maketree": "error" }, @@ -148,8 +148,8 @@ function validateParent(source, parserOptions) { }, languageOptions: { parser, - ecmaVersion: parserOptions.ecmaVersion || "latest", - sourceType: parserOptions.sourceType || "module", + ecmaVersion: parserOptions.ecmaVersion ?? "latest", + sourceType: parserOptions.sourceType ?? "module", parserOptions: parserOptions, }, rules: { "test/validateparent": "error" }, @@ -191,11 +191,11 @@ describe("Template AST", () => { ), ) } - const options = Object.assign( - { filePath: sourcePath }, - PARSER_OPTIONS, - parserOptions, - ) + const options = { + filePath: sourcePath, + ...PARSER_OPTIONS, + ...parserOptions, + } if ( Object.entries(requirements).some(([pkgName, pkgVersion]) => { @@ -253,7 +253,7 @@ describe("Template AST", () => { }) it("should have correct location.", () => { - const lines = source.match(/[^\r\n]*(?:\r?\n|$)/gu) || [] + const lines = source.match(/[^\r\n]*(?:\r?\n|$)/gu) ?? [] lines.push(String.fromCodePoint(0)) for (const token of getAllTokens(actual.ast)) { const line0 = token.loc.start.line - 1 diff --git a/test/document-fragment.js b/test/document-fragment.js index b824ca7c..9204ce7d 100644 --- a/test/document-fragment.js +++ b/test/document-fragment.js @@ -61,11 +61,11 @@ describe("services.getDocumentFragment", () => { ].find((fp) => fs.existsSync(fp)) const source = fs.readFileSync(sourcePath, "utf8") const parserOptions = optionsPath ? require(optionsPath) : {} - const options = Object.assign( - { filePath: sourcePath }, - PARSER_OPTIONS, - parserOptions, - ) + const options = { + filePath: sourcePath, + ...PARSER_OPTIONS, + ...parserOptions, + } const result = parser.parseForESLint(source, options) const actual = result.services.getDocumentFragment() diff --git a/test/test-utils.js b/test/test-utils.js index 7ffa8e12..8ea0b760 100644 --- a/test/test-utils.js +++ b/test/test-utils.js @@ -68,7 +68,7 @@ function scopeToJSON(scopeManager) { reference.resolved.defs[0] && reference.resolved.defs[0].name, ), - init: reference.init || null, + init: reference.init ?? null, vueUsedInTemplate: reference.vueUsedInTemplate ? reference.vueUsedInTemplate : undefined, @@ -105,9 +105,9 @@ function scopeToJSON(scopeManager) { * Analyze scope */ function analyze(ast, parserOptions) { - const ecmaVersion = parserOptions.ecmaVersion || 2022 - const ecmaFeatures = parserOptions.ecmaFeatures || {} - const sourceType = parserOptions.sourceType || "script" + const ecmaVersion = parserOptions.ecmaVersion ?? 2022 + const ecmaFeatures = parserOptions.ecmaFeatures ?? {} + const sourceType = parserOptions.sourceType ?? "script" const result = escope.analyze(ast, { ignoreEval: true, nodejsScope: false, diff --git a/test/tokens.js b/test/tokens.js index 09cc4a2c..51a68c27 100644 --- a/test/tokens.js +++ b/test/tokens.js @@ -52,10 +52,7 @@ describe("services.getTemplateBodyTokenStore", () => { let tokens = null before(() => { - const result = parse( - code, - Object.assign({ filePath: "test.vue" }, PARSER_OPTIONS), - ) + const result = parse(code, { filePath: "test.vue", ...PARSER_OPTIONS }) ast = result.ast tokens = result.services.getTemplateBodyTokenStore() }) diff --git a/test/variables-references.js b/test/variables-references.js index 8a43d0a3..4e6a590b 100644 --- a/test/variables-references.js +++ b/test/variables-references.js @@ -34,10 +34,7 @@ describe("[references] expression containers", () => { let ast = null before(() => { - ast = parse( - code, - Object.assign({ filePath: "test.vue" }, PARSER_OPTIONS), - ).ast + ast = parse(code, { filePath: "test.vue", ...PARSER_OPTIONS }).ast }) it("should have references", () => { @@ -62,10 +59,7 @@ describe("[references] expression containers", () => { let ast = null before(() => { - ast = parse( - code, - Object.assign({ filePath: "test.vue" }, PARSER_OPTIONS), - ).ast + ast = parse(code, { filePath: "test.vue", ...PARSER_OPTIONS }).ast }) it("should have references", () => { @@ -83,10 +77,7 @@ describe("[references] expression containers", () => { let ast = null before(() => { - ast = parse( - code, - Object.assign({ filePath: "test.vue" }, PARSER_OPTIONS), - ).ast + ast = parse(code, { filePath: "test.vue", ...PARSER_OPTIONS }).ast }) it("should not include $event references.", () => { @@ -110,10 +101,7 @@ describe("[variables] elements", () => { let ast = null before(() => { - ast = parse( - code, - Object.assign({ filePath: "test.vue" }, PARSER_OPTIONS), - ).ast + ast = parse(code, { filePath: "test.vue", ...PARSER_OPTIONS }).ast }) it("should have references", () => { @@ -138,10 +126,7 @@ describe("[variables] elements", () => { let ast = null before(() => { - ast = parse( - code, - Object.assign({ filePath: "test.vue" }, PARSER_OPTIONS), - ).ast + ast = parse(code, { filePath: "test.vue", ...PARSER_OPTIONS }).ast }) it("should have references", () => { @@ -169,10 +154,7 @@ describe("[variables] elements", () => { let ast = null before(() => { - ast = parse( - code, - Object.assign({ filePath: "test.vue" }, PARSER_OPTIONS), - ).ast + ast = parse(code, { filePath: "test.vue", ...PARSER_OPTIONS }).ast }) it("should have variables", () => { @@ -204,10 +186,7 @@ describe("Variables of v-for and references", () => { let mustacheReferences3 = null before(() => { - const ast = parse( - code, - Object.assign({ filePath: "test.vue" }, PARSER_OPTIONS), - ).ast + const ast = parse(code, { filePath: "test.vue", ...PARSER_OPTIONS }).ast variables = ast.templateBody.children[0].variables vForReferences = ast.templateBody.children[0].startTag.attributes[0].value.references @@ -274,10 +253,7 @@ describe("Variables of template-scope and references", () => { let mustacheReferences3 = null before(() => { - const ast = parse( - code, - Object.assign({ filePath: "test.vue" }, PARSER_OPTIONS), - ).ast + const ast = parse(code, { filePath: "test.vue", ...PARSER_OPTIONS }).ast variables = ast.templateBody.children[0].variables vBindKeyReferences = ast.templateBody.children[0].startTag.attributes[1].value.references @@ -336,10 +312,7 @@ describe("Variables of v-for and references of dynamic arguments", () => { let vBindKeyReferences = null before(() => { - const ast = parse( - code, - Object.assign({ filePath: "test.vue" }, PARSER_OPTIONS), - ).ast + const ast = parse(code, { filePath: "test.vue", ...PARSER_OPTIONS }).ast variables = ast.templateBody.children[0].variables vForReferences = ast.templateBody.children[0].startTag.attributes[0].value.references @@ -366,10 +339,7 @@ describe("Variables of v-for and references of v-bind same-name shorthand", () = let vBindReferences = null before(() => { - const ast = parse( - code, - Object.assign({ filePath: "test.vue" }, PARSER_OPTIONS), - ).ast + const ast = parse(code, { filePath: "test.vue", ...PARSER_OPTIONS }).ast variables = ast.templateBody.children[0].variables vForReferences = ast.templateBody.children[0].startTag.attributes[0].value.references @@ -395,10 +365,7 @@ describe("Variables of v-for and references of v-bind same-name shorthand with k let vBindReferences = null before(() => { - const ast = parse( - code, - Object.assign({ filePath: "test.vue" }, PARSER_OPTIONS), - ).ast + const ast = parse(code, { filePath: "test.vue", ...PARSER_OPTIONS }).ast variables = ast.templateBody.children[0].variables vForReferences = ast.templateBody.children[0].startTag.attributes[0].value.references diff --git a/tsconfig.json b/tsconfig.json index e4397962..e4cbfcc2 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,41 +1,41 @@ { - "compileOnSave": true, - "compilerOptions": { - "allowJs": false, - "allowSyntheticDefaultImports": true, - "allowUnreachableCode": false, - "allowUnusedLabels": false, - "alwaysStrict": true, - "baseUrl": ".", - "checkJs": false, - "declaration": true, - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "inlineSources": true, - "lib": ["es2015"], - "module": "commonjs", - "moduleResolution": "node", - "newLine": "LF", - "noEmitOnError": true, - "noFallthroughCasesInSwitch": true, - "noImplicitAny": true, - "noImplicitReturns": true, - "noImplicitThis": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "outDir": ".temp", - "paths": { - "*": ["typings/*"] - }, - "pretty": true, - "removeComments": true, - "sourceMap": true, - "sourceRoot": "src", - "strict": true, - "strictNullChecks": true, - "target": "es2015", - - "skipLibCheck": true, + "compileOnSave": true, + "compilerOptions": { + "allowJs": false, + "allowSyntheticDefaultImports": true, + "allowUnreachableCode": false, + "allowUnusedLabels": false, + "alwaysStrict": true, + "baseUrl": ".", + "checkJs": false, + "declaration": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "inlineSources": true, + "lib": ["es2015"], + "module": "commonjs", + "moduleResolution": "node", + "newLine": "LF", + "noEmitOnError": true, + "noFallthroughCasesInSwitch": true, + "noImplicitAny": true, + "noImplicitReturns": true, + "noImplicitThis": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "outDir": ".temp", + "paths": { + "*": ["typings/*"] }, - "include": ["src/**/*.ts"] + "pretty": true, + "removeComments": true, + "sourceMap": true, + "sourceRoot": "src", + "strict": true, + "strictNullChecks": true, + "target": "ES2024", + + "skipLibCheck": true + }, + "include": ["src/**/*.ts"] } pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy