diff --git a/.changeset/eager-snails-follow.md b/.changeset/eager-snails-follow.md new file mode 100644 index 000000000..458e4a54a --- /dev/null +++ b/.changeset/eager-snails-follow.md @@ -0,0 +1,5 @@ +--- +'eslint-plugin-svelte': minor +--- + +feat(no-navigation-without-resolve): not reporting pure query URLs diff --git a/.changeset/perky-chefs-hope.md b/.changeset/perky-chefs-hope.md new file mode 100644 index 000000000..6a2bf93cf --- /dev/null +++ b/.changeset/perky-chefs-hope.md @@ -0,0 +1,5 @@ +--- +'eslint-plugin-svelte': patch +--- + +fix(no-navigation-without-resolve): fixed nullish link shorthands not being allowed diff --git a/.changeset/salty-plants-juggle.md b/.changeset/salty-plants-juggle.md new file mode 100644 index 000000000..f5d0301ad --- /dev/null +++ b/.changeset/salty-plants-juggle.md @@ -0,0 +1,5 @@ +--- +'eslint-plugin-svelte': minor +--- + +feat(no-navigation-without-resolve): for links, the rule now reports on the whole attribute diff --git a/.changeset/six-mugs-pick.md b/.changeset/six-mugs-pick.md new file mode 100644 index 000000000..cfc7df1c8 --- /dev/null +++ b/.changeset/six-mugs-pick.md @@ -0,0 +1,5 @@ +--- +'eslint-plugin-svelte': minor +--- + +feat(no-navigation-without-resolve): recognizing resolved values with queries and fragments diff --git a/packages/eslint-plugin-svelte/src/rules/no-navigation-without-resolve.ts b/packages/eslint-plugin-svelte/src/rules/no-navigation-without-resolve.ts index 9fa001223..7f4a82674 100644 --- a/packages/eslint-plugin-svelte/src/rules/no-navigation-without-resolve.ts +++ b/packages/eslint-plugin-svelte/src/rules/no-navigation-without-resolve.ts @@ -90,55 +90,19 @@ export default createRule('no-navigation-without-resolve', { } } }, - SvelteShorthandAttribute(node) { - if ( - ignoreLinks || - node.parent.parent.type !== 'SvelteElement' || - node.parent.parent.kind !== 'html' || - node.parent.parent.name.type !== 'SvelteName' || - node.parent.parent.name.name !== 'a' || - node.key.name !== 'href' || - node.value.type !== 'Identifier' - ) { - return; - } - if ( - !expressionIsAbsolute(new FindVariableContext(context), node.value) && - !expressionIsFragment(new FindVariableContext(context), node.value) && - !isResolveCall(new FindVariableContext(context), node.value, resolveReferences) - ) { - context.report({ loc: node.loc, messageId: 'linkWithoutResolve' }); - } - }, - SvelteAttribute(node) { - if ( - ignoreLinks || - node.parent.parent.type !== 'SvelteElement' || - node.parent.parent.kind !== 'html' || - node.parent.parent.name.type !== 'SvelteName' || - node.parent.parent.name.name !== 'a' || - node.key.name !== 'href' - ) { - return; - } - if ( - (node.value[0].type === 'SvelteLiteral' && - !expressionIsNullish(new FindVariableContext(context), node.value[0]) && - !expressionIsAbsolute(new FindVariableContext(context), node.value[0]) && - !expressionIsFragment(new FindVariableContext(context), node.value[0])) || - (node.value[0].type === 'SvelteMustacheTag' && - !expressionIsNullish(new FindVariableContext(context), node.value[0].expression) && - !expressionIsAbsolute(new FindVariableContext(context), node.value[0].expression) && - !expressionIsFragment(new FindVariableContext(context), node.value[0].expression) && - !isResolveCall( - new FindVariableContext(context), - node.value[0].expression, - resolveReferences - )) - ) { - context.report({ loc: node.value[0].loc, messageId: 'linkWithoutResolve' }); + ...(!ignoreLinks && { + SvelteShorthandAttribute(node) { + checkLinkAttribute(context, node, node.value, resolveReferences); + }, + SvelteAttribute(node) { + checkLinkAttribute( + context, + node, + node.value[0].type === 'SvelteMustacheTag' ? node.value[0].expression : node.value[0], + resolveReferences + ); } - } + }) }; } }); @@ -223,12 +187,17 @@ function checkGotoCall( call: TSESTree.CallExpression, resolveReferences: Set ): void { - if (call.arguments.length < 1) { - return; - } - const url = call.arguments[0]; - if (!isResolveCall(new FindVariableContext(context), url, resolveReferences)) { - context.report({ loc: url.loc, messageId: 'gotoWithoutResolve' }); + if ( + call.arguments.length > 0 && + !isValueAllowed( + context, + new FindVariableContext(context), + call.arguments[0], + resolveReferences, + {} + ) + ) { + context.report({ loc: call.arguments[0].loc, messageId: 'gotoWithoutResolve' }); } } @@ -238,23 +207,124 @@ function checkShallowNavigationCall( resolveReferences: Set, messageId: string ): void { - if (call.arguments.length < 1) { - return; + if ( + call.arguments.length > 0 && + !isValueAllowed( + context, + new FindVariableContext(context), + call.arguments[0], + resolveReferences, + { + allowEmpty: true + } + ) + ) { + context.report({ loc: call.arguments[0].loc, messageId }); } - const url = call.arguments[0]; +} + +function checkLinkAttribute( + context: RuleContext, + attribute: AST.SvelteAttribute | AST.SvelteShorthandAttribute, + value: TSESTree.Expression | AST.SvelteLiteral, + resolveReferences: Set +): void { if ( - !expressionIsEmpty(url) && - !isResolveCall(new FindVariableContext(context), url, resolveReferences) + attribute.parent.parent.type === 'SvelteElement' && + attribute.parent.parent.kind === 'html' && + attribute.parent.parent.name.type === 'SvelteName' && + attribute.parent.parent.name.name === 'a' && + attribute.key.name === 'href' && + !isValueAllowed(context, new FindVariableContext(context), value, resolveReferences, { + allowAbsolute: true, + allowFragment: true, + allowNullish: true + }) ) { - context.report({ loc: url.loc, messageId }); + context.report({ loc: attribute.loc, messageId: 'linkWithoutResolve' }); } } +function isValueAllowed( + context: RuleContext, + findContext: FindVariableContext, + value: TSESTree.CallExpressionArgument | TSESTree.Expression | AST.SvelteLiteral, + resolveReferences: Set, + config: { + allowAbsolute?: boolean; + allowEmpty?: boolean; + allowFragment?: boolean; + allowNullish?: boolean; + } +): boolean { + if (value.type === 'Identifier') { + const variable = findContext.findVariable(value); + if ( + variable !== null && + variable.identifiers.length > 0 && + variable.identifiers[0].parent.type === 'VariableDeclarator' && + variable.identifiers[0].parent.init !== null + ) { + return isValueAllowed( + context, + findContext, + variable.identifiers[0].parent.init, + resolveReferences, + config + ); + } + } + if ( + (config.allowAbsolute && expressionIsAbsoluteUrl(new FindVariableContext(context), value)) || + (config.allowEmpty && expressionIsEmpty(new FindVariableContext(context), value)) || + (config.allowFragment && expressionStartsWith(new FindVariableContext(context), value, '#')) || + (config.allowNullish && expressionIsNullish(value)) || + expressionStartsWith(new FindVariableContext(context), value, '?') || + expressionIsResolveCall(new FindVariableContext(context), value, resolveReferences) + ) { + return true; + } + if (value.type === 'BinaryExpression' && value.left.type !== 'PrivateIdentifier') { + if (['BinaryExpression', 'TemplateLiteral'].includes(value.left.type)) { + return isValueAllowed( + context, + new FindVariableContext(context), + value.left, + resolveReferences, + config + ); + } + if ( + expressionIsResolveCall(new FindVariableContext(context), value.left, resolveReferences) && + (expressionIsEmpty(new FindVariableContext(context), value.right) || + expressionStartsWith(new FindVariableContext(context), value.right, '?') || + expressionStartsWith(new FindVariableContext(context), value.right, '#')) + ) { + return true; + } + } + if (value.type === 'TemplateLiteral') { + const parts = [ + ...value.expressions, + ...value.quasis.filter((quasi) => quasi.value.raw !== '') + ].sort((a, b) => a.range[0] - b.range[0]); + if ( + expressionIsResolveCall(new FindVariableContext(context), parts[0], resolveReferences) && + (expressionIsEmpty(new FindVariableContext(context), parts[1]) || + expressionStartsWith(new FindVariableContext(context), parts[1], '?') || + expressionStartsWith(new FindVariableContext(context), parts[1], '#')) + ) { + return true; + } + } + return false; +} + // Helper functions -function isResolveCall( +function expressionIsResolveCall( ctx: FindVariableContext, - node: TSESTree.CallExpressionArgument, + node: TSESTree.CallExpressionArgument | TSESTree.TemplateElement | AST.SvelteLiteral, resolveReferences: Set ): boolean { if ( @@ -278,38 +348,31 @@ function isResolveCall( ) { return false; } - return isResolveCall(ctx, variable.identifiers[0].parent.init, resolveReferences); -} - -function expressionIsEmpty(url: TSESTree.CallExpressionArgument): boolean { - return ( - (url.type === 'Literal' && url.value === '') || - (url.type === 'TemplateLiteral' && - url.expressions.length === 0 && - url.quasis.length === 1 && - url.quasis[0].value.raw === '') - ); + return expressionIsResolveCall(ctx, variable.identifiers[0].parent.init, resolveReferences); } -function expressionIsNullish( +function expressionIsEmpty( ctx: FindVariableContext, - url: AST.SvelteLiteral | TSESTree.Expression + node: + | TSESTree.CallExpressionArgument + | TSESTree.Expression + | TSESTree.TemplateElement + | AST.SvelteLiteral ): boolean { - switch (url.type) { - case 'Identifier': - return identifierIsNullish(ctx, url); - case 'Literal': - return url.value === null; // Undefined is an Identifier in ESTree, null is a Literal - default: - return false; - } -} - -function identifierIsNullish(ctx: FindVariableContext, url: TSESTree.Identifier): boolean { - if (url.name === 'undefined') { + if ( + (node.type === 'Literal' && node.value === '') || + (node.type === 'TemplateElement' && node.value.raw === '') || + (node.type === 'TemplateLiteral' && + node.expressions.length === 0 && + node.quasis.length === 1 && + expressionIsEmpty(ctx, node.quasis[0])) + ) { return true; } - const variable = ctx.findVariable(url); + if (node.type !== 'Identifier') { + return false; + } + const variable = ctx.findVariable(node); if ( variable === null || variable.identifiers.length === 0 || @@ -318,95 +381,105 @@ function identifierIsNullish(ctx: FindVariableContext, url: TSESTree.Identifier) ) { return false; } - return expressionIsNullish(ctx, variable.identifiers[0].parent.init); + return expressionIsEmpty(ctx, variable.identifiers[0].parent.init); } -function expressionIsAbsolute( +function expressionIsNullish( + node: TSESTree.CallExpressionArgument | TSESTree.Expression | AST.SvelteLiteral +): boolean { + switch (node.type) { + case 'Identifier': + return node.name === 'undefined'; + case 'Literal': + return node.value === null; // Undefined is an Identifier in ESTree, null is a Literal + default: + return false; + } +} + +function expressionIsAbsoluteUrl( ctx: FindVariableContext, - url: AST.SvelteLiteral | TSESTree.Expression + node: TSESTree.CallExpressionArgument | TSESTree.Expression | AST.SvelteLiteral ): boolean { - switch (url.type) { + switch (node.type) { case 'BinaryExpression': - return binaryExpressionIsAbsolute(ctx, url); - case 'Identifier': - return identifierIsAbsolute(ctx, url); + return binaryExpressionIsAbsoluteUrl(ctx, node); case 'Literal': - return typeof url.value === 'string' && urlValueIsAbsolute(url.value); + return typeof node.value === 'string' && valueIsAbsoluteUrl(node.value); case 'SvelteLiteral': - return urlValueIsAbsolute(url.value); + return valueIsAbsoluteUrl(node.value); case 'TemplateLiteral': - return templateLiteralIsAbsolute(ctx, url); + return templateLiteralIsAbsoluteUrl(ctx, node); default: return false; } } -function binaryExpressionIsAbsolute( +function binaryExpressionIsAbsoluteUrl( ctx: FindVariableContext, - url: TSESTree.BinaryExpression + node: TSESTree.BinaryExpression ): boolean { return ( - (url.left.type !== 'PrivateIdentifier' && expressionIsAbsolute(ctx, url.left)) || - expressionIsAbsolute(ctx, url.right) + (node.left.type !== 'PrivateIdentifier' && expressionIsAbsoluteUrl(ctx, node.left)) || + expressionIsAbsoluteUrl(ctx, node.right) ); } -function identifierIsAbsolute(ctx: FindVariableContext, url: TSESTree.Identifier): boolean { - const variable = ctx.findVariable(url); - if ( - variable === null || - variable.identifiers.length === 0 || - variable.identifiers[0].parent.type !== 'VariableDeclarator' || - variable.identifiers[0].parent.init === null - ) { - return false; - } - return expressionIsAbsolute(ctx, variable.identifiers[0].parent.init); -} - -function templateLiteralIsAbsolute( +function templateLiteralIsAbsoluteUrl( ctx: FindVariableContext, - url: TSESTree.TemplateLiteral + node: TSESTree.TemplateLiteral ): boolean { return ( - url.expressions.some((expression) => expressionIsAbsolute(ctx, expression)) || - url.quasis.some((quasi) => urlValueIsAbsolute(quasi.value.raw)) + node.expressions.some((expression) => expressionIsAbsoluteUrl(ctx, expression)) || + node.quasis.some((quasi) => valueIsAbsoluteUrl(quasi.value.raw)) ); } -function urlValueIsAbsolute(url: string): boolean { - return /^[+a-z]*:/i.test(url); +function valueIsAbsoluteUrl(node: string): boolean { + return /^[+a-z]*:/i.test(node); } -function expressionIsFragment( +function expressionStartsWith( ctx: FindVariableContext, - url: AST.SvelteLiteral | TSESTree.Expression + node: + | TSESTree.CallExpressionArgument + | TSESTree.Expression + | TSESTree.TemplateElement + | AST.SvelteLiteral, + prefix: string ): boolean { - switch (url.type) { + switch (node.type) { case 'BinaryExpression': - return binaryExpressionIsFragment(ctx, url); + return binaryExpressionStartsWith(ctx, node, prefix); case 'Identifier': - return identifierIsFragment(ctx, url); + return identifierStartsWith(ctx, node, prefix); case 'Literal': - return typeof url.value === 'string' && urlValueIsFragment(url.value); + return typeof node.value === 'string' && node.value.startsWith(prefix); case 'SvelteLiteral': - return urlValueIsFragment(url.value); + return node.value.startsWith(prefix); + case 'TemplateElement': + return node.value.raw.startsWith(prefix); case 'TemplateLiteral': - return templateLiteralIsFragment(ctx, url); + return templateLiteralStartsWith(ctx, node, prefix); default: return false; } } -function binaryExpressionIsFragment( +function binaryExpressionStartsWith( ctx: FindVariableContext, - url: TSESTree.BinaryExpression + node: TSESTree.BinaryExpression, + prefix: string ): boolean { - return url.left.type !== 'PrivateIdentifier' && expressionIsFragment(ctx, url.left); + return node.left.type !== 'PrivateIdentifier' && expressionStartsWith(ctx, node.left, prefix); } -function identifierIsFragment(ctx: FindVariableContext, url: TSESTree.Identifier): boolean { - const variable = ctx.findVariable(url); +function identifierStartsWith( + ctx: FindVariableContext, + node: TSESTree.Identifier, + prefix: string +): boolean { + const variable = ctx.findVariable(node); if ( variable === null || variable.identifiers.length === 0 || @@ -415,19 +488,16 @@ function identifierIsFragment(ctx: FindVariableContext, url: TSESTree.Identifier ) { return false; } - return expressionIsFragment(ctx, variable.identifiers[0].parent.init); + return expressionStartsWith(ctx, variable.identifiers[0].parent.init, prefix); } -function templateLiteralIsFragment( +function templateLiteralStartsWith( ctx: FindVariableContext, - url: TSESTree.TemplateLiteral + node: TSESTree.TemplateLiteral, + prefix: string ): boolean { return ( - (url.expressions.length >= 1 && expressionIsFragment(ctx, url.expressions[0])) || - (url.quasis.length >= 1 && urlValueIsFragment(url.quasis[0].value.raw)) + (node.expressions.length >= 1 && expressionStartsWith(ctx, node.expressions[0], prefix)) || + (node.quasis.length >= 1 && expressionStartsWith(ctx, node.quasis[0], prefix)) ); } - -function urlValueIsFragment(url: string): boolean { - return url.startsWith('#'); -} diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/goto-combined01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/goto-combined01-errors.yaml new file mode 100644 index 000000000..d1ad63541 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/goto-combined01-errors.yaml @@ -0,0 +1,240 @@ +- message: Unexpected goto() call without resolve(). + line: 24 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 25 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 26 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 27 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 28 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 29 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 30 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 31 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 32 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 33 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 34 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 35 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 36 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 37 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 38 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 39 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 40 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 41 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 42 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 43 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 44 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 45 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 46 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 47 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 48 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 49 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 50 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 51 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 52 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 53 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 54 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 55 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 56 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 57 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 58 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 59 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 60 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 61 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 62 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 63 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 64 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 65 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 66 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 67 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 68 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 69 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 70 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 71 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 72 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 73 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 74 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 75 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 76 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 77 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 78 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 79 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 80 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 81 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 82 + column: 7 + suggestions: null +- message: Unexpected goto() call without resolve(). + line: 83 + column: 7 + suggestions: null diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/goto-combined01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/goto-combined01-input.svelte new file mode 100644 index 000000000..4786d4d7c --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/goto-combined01-input.svelte @@ -0,0 +1,84 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-combined01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-combined01-errors.yaml new file mode 100644 index 000000000..6159c928a --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-combined01-errors.yaml @@ -0,0 +1,244 @@ +- message: Unexpected href link without resolve(). + line: 25 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 26 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 27 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 28 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 29 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 30 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 31 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 32 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 33 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 34 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 35 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 36 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 37 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 38 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 39 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 40 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 41 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 42 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 43 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 44 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 45 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 46 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 47 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 48 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 49 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 50 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 51 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 52 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 53 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 54 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 55 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 56 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 57 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 58 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 59 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 60 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 61 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 62 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 63 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 64 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 65 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 66 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 67 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 68 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 69 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 70 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 71 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 72 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 73 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 74 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 75 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 76 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 77 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 78 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 79 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 80 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 81 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 82 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 83 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 84 + column: 4 + suggestions: null +- message: Unexpected href link without resolve(). + line: 85 + column: 4 + suggestions: null diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-combined01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-combined01-input.svelte new file mode 100644 index 000000000..e7a74396f --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-combined01-input.svelte @@ -0,0 +1,85 @@ + + +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-nullish-like-literal01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-nullish-like-literal01-errors.yaml index 67911091d..c88a227b2 100644 --- a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-nullish-like-literal01-errors.yaml +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-nullish-like-literal01-errors.yaml @@ -1,40 +1,40 @@ - message: Unexpected href link without resolve(). line: 6 - column: 10 + column: 4 suggestions: null - message: Unexpected href link without resolve(). line: 7 - column: 10 + column: 4 suggestions: null - message: Unexpected href link without resolve(). line: 8 - column: 9 + column: 4 suggestions: null - message: Unexpected href link without resolve(). line: 9 - column: 9 + column: 4 suggestions: null - message: Unexpected href link without resolve(). line: 10 - column: 9 + column: 4 suggestions: null - message: Unexpected href link without resolve(). line: 11 - column: 9 + column: 4 suggestions: null - message: Unexpected href link without resolve(). line: 12 - column: 9 + column: 4 suggestions: null - message: Unexpected href link without resolve(). line: 13 - column: 9 + column: 4 suggestions: null - message: Unexpected href link without resolve(). line: 14 - column: 9 + column: 4 suggestions: null - message: Unexpected href link without resolve(). line: 15 - column: 9 + column: 4 suggestions: null diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-partial-asset01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-partial-asset01-errors.yaml index 2d1f90f38..892f497fa 100644 --- a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-partial-asset01-errors.yaml +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-partial-asset01-errors.yaml @@ -1,8 +1,8 @@ - message: Unexpected href link without resolve(). line: 5 - column: 9 + column: 4 suggestions: null - message: Unexpected href link without resolve(). line: 6 - column: 9 + column: 4 suggestions: null diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-partial-resolve01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-partial-resolve01-errors.yaml index ad7407ad2..a4d460d8d 100644 --- a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-partial-resolve01-errors.yaml +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-partial-resolve01-errors.yaml @@ -1,14 +1,14 @@ - message: Unexpected href link without resolve(). line: 8 - column: 9 + column: 4 suggestions: null - message: Unexpected href link without resolve(). line: 9 - column: 9 + column: 4 suggestions: null - message: Unexpected href link without resolve(). line: 10 - column: 9 + column: 4 suggestions: null - message: Unexpected href link without resolve(). line: 11 diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-with-fragment01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-with-fragment01-errors.yaml index a714ee1d9..dba608241 100644 --- a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-with-fragment01-errors.yaml +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-with-fragment01-errors.yaml @@ -1,18 +1,18 @@ - message: Unexpected href link without resolve(). line: 6 - column: 10 + column: 4 suggestions: null - message: Unexpected href link without resolve(). line: 7 - column: 9 + column: 4 suggestions: null - message: Unexpected href link without resolve(). line: 8 - column: 9 + column: 4 suggestions: null - message: Unexpected href link without resolve(). line: 9 - column: 9 + column: 4 suggestions: null - message: Unexpected href link without resolve(). line: 10 @@ -20,5 +20,5 @@ suggestions: null - message: Unexpected href link without resolve(). line: 11 - column: 9 + column: 4 suggestions: null diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-without-resolve01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-without-resolve01-errors.yaml index a714ee1d9..dba608241 100644 --- a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-without-resolve01-errors.yaml +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-without-resolve01-errors.yaml @@ -1,18 +1,18 @@ - message: Unexpected href link without resolve(). line: 6 - column: 10 + column: 4 suggestions: null - message: Unexpected href link without resolve(). line: 7 - column: 9 + column: 4 suggestions: null - message: Unexpected href link without resolve(). line: 8 - column: 9 + column: 4 suggestions: null - message: Unexpected href link without resolve(). line: 9 - column: 9 + column: 4 suggestions: null - message: Unexpected href link without resolve(). line: 10 @@ -20,5 +20,5 @@ suggestions: null - message: Unexpected href link without resolve(). line: 11 - column: 9 + column: 4 suggestions: null diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/pushState-combined01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/pushState-combined01-errors.yaml new file mode 100644 index 000000000..3edfe55ee --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/pushState-combined01-errors.yaml @@ -0,0 +1,240 @@ +- message: Unexpected pushState() call without resolve(). + line: 24 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 25 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 26 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 27 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 28 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 29 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 30 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 31 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 32 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 33 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 34 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 35 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 36 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 37 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 38 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 39 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 40 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 41 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 42 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 43 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 44 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 45 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 46 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 47 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 48 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 49 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 50 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 51 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 52 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 53 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 54 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 55 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 56 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 57 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 58 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 59 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 60 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 61 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 62 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 63 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 64 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 65 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 66 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 67 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 68 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 69 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 70 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 71 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 72 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 73 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 74 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 75 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 76 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 77 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 78 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 79 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 80 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 81 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 82 + column: 12 + suggestions: null +- message: Unexpected pushState() call without resolve(). + line: 83 + column: 12 + suggestions: null diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/pushState-combined01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/pushState-combined01-input.svelte new file mode 100644 index 000000000..9f5bfd0e5 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/pushState-combined01-input.svelte @@ -0,0 +1,84 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/recursive-loop01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/recursive-loop01-errors.yaml index d75ac7bd1..5264bac81 100644 --- a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/recursive-loop01-errors.yaml +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/recursive-loop01-errors.yaml @@ -1,4 +1,4 @@ - message: Unexpected href link without resolve(). line: 6 - column: 9 + column: 4 suggestions: null diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/replaceState-combined01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/replaceState-combined01-errors.yaml new file mode 100644 index 000000000..8c1a3a55d --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/replaceState-combined01-errors.yaml @@ -0,0 +1,240 @@ +- message: Unexpected replaceState() call without resolve(). + line: 24 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 25 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 26 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 27 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 28 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 29 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 30 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 31 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 32 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 33 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 34 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 35 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 36 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 37 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 38 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 39 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 40 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 41 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 42 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 43 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 44 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 45 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 46 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 47 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 48 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 49 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 50 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 51 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 52 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 53 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 54 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 55 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 56 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 57 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 58 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 59 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 60 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 61 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 62 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 63 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 64 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 65 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 66 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 67 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 68 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 69 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 70 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 71 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 72 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 73 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 74 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 75 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 76 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 77 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 78 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 79 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 80 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 81 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 82 + column: 15 + suggestions: null +- message: Unexpected replaceState() call without resolve(). + line: 83 + column: 15 + suggestions: null diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/replaceState-combined01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/replaceState-combined01-input.svelte new file mode 100644 index 000000000..61ea7155a --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/replaceState-combined01-input.svelte @@ -0,0 +1,84 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/goto-combined01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/goto-combined01-input.svelte new file mode 100644 index 000000000..56dea921b --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/goto-combined01-input.svelte @@ -0,0 +1,87 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/goto-query01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/goto-query01-input.svelte new file mode 100644 index 000000000..76135ab03 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/goto-query01-input.svelte @@ -0,0 +1,13 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/link-combined01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/link-combined01-input.svelte new file mode 100644 index 000000000..2298cfaae --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/link-combined01-input.svelte @@ -0,0 +1,88 @@ + + +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/link-fragment-url01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/link-fragment01-input.svelte similarity index 100% rename from packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/link-fragment-url01-input.svelte rename to packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/link-fragment01-input.svelte diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/link-nullish01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/link-nullish01-input.svelte index 120d79102..fb11063c7 100644 --- a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/link-nullish01-input.svelte +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/link-nullish01-input.svelte @@ -1,9 +1,11 @@ Click me! Click me! Click me! Click me! +Click me! diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/link-query01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/link-query01-input.svelte new file mode 100644 index 000000000..15c60df04 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/link-query01-input.svelte @@ -0,0 +1,15 @@ + + +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! +Click me! diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/pushState-combined01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/pushState-combined01-input.svelte new file mode 100644 index 000000000..7412eec78 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/pushState-combined01-input.svelte @@ -0,0 +1,87 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/pushState-query01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/pushState-query01-input.svelte new file mode 100644 index 000000000..37a4d0371 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/pushState-query01-input.svelte @@ -0,0 +1,13 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/replaceState-combined01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/replaceState-combined01-input.svelte new file mode 100644 index 000000000..209f7a419 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/replaceState-combined01-input.svelte @@ -0,0 +1,87 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/replaceState-query01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/replaceState-query01-input.svelte new file mode 100644 index 000000000..a160ee314 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/replaceState-query01-input.svelte @@ -0,0 +1,13 @@ +