diff --git a/.changeset/huge-taxis-jog.md b/.changeset/huge-taxis-jog.md new file mode 100644 index 000000000..fa0333bfd --- /dev/null +++ b/.changeset/huge-taxis-jog.md @@ -0,0 +1,5 @@ +--- +'eslint-plugin-svelte': minor +--- + +feat: added the no-navigation-without-resolve rule diff --git a/.changeset/loud-rockets-lay.md b/.changeset/loud-rockets-lay.md new file mode 100644 index 000000000..1cccf4e3b --- /dev/null +++ b/.changeset/loud-rockets-lay.md @@ -0,0 +1,5 @@ +--- +'eslint-plugin-svelte': minor +--- + +chore: deprecated the no-navigation-without-base rule diff --git a/README.md b/README.md index c8018284f..1638f6805 100644 --- a/README.md +++ b/README.md @@ -363,7 +363,7 @@ These rules relate to SvelteKit and its best Practices. | Rule ID | Description | | |:--------|:------------|:---| | [svelte/no-export-load-in-svelte-module-in-kit-pages](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-export-load-in-svelte-module-in-kit-pages/) | disallow exporting load functions in `*.svelte` module in SvelteKit page components. | :star: | -| [svelte/no-navigation-without-base](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-navigation-without-base/) | disallow using navigation (links, goto, pushState, replaceState) without the base path | | +| [svelte/no-navigation-without-resolve](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-navigation-without-resolve/) | disallow using navigation (links, goto, pushState, replaceState) without a resolve() | | | [svelte/valid-prop-names-in-kit-pages](https://sveltejs.github.io/eslint-plugin-svelte/rules/valid-prop-names-in-kit-pages/) | disallow props other than data or errors in SvelteKit page components. | :star: | ## Experimental @@ -393,7 +393,8 @@ These rules relate to this plugin works: |:--------|:------------| | [svelte/@typescript-eslint/no-unnecessary-condition](https://sveltejs.github.io/eslint-plugin-svelte/rules/@typescript-eslint/no-unnecessary-condition/) | This rule is no longer needed when using svelte-eslint-parser>=v0.19.0. | | [svelte/no-dynamic-slot-name](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-dynamic-slot-name/) | Now Svelte compiler itself throws an compile error. | -| [svelte/no-goto-without-base](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-goto-without-base/) | [svelte/no-navigation-without-base](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-navigation-without-base/) | +| [svelte/no-goto-without-base](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-goto-without-base/) | [svelte/no-navigation-without-resolve](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-navigation-without-resolve/) | +| [svelte/no-navigation-without-base](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-navigation-without-base/) | [svelte/no-navigation-without-resolve](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-navigation-without-resolve/) | diff --git a/docs/rules.md b/docs/rules.md index 3465a4066..7baeae5ee 100644 --- a/docs/rules.md +++ b/docs/rules.md @@ -117,11 +117,11 @@ These rules extend the rules provided by ESLint itself, or other plugins to work These rules relate to SvelteKit and its best Practices. -| Rule ID | Description | | -| :------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------- | :----- | -| [svelte/no-export-load-in-svelte-module-in-kit-pages](./rules/no-export-load-in-svelte-module-in-kit-pages.md) | disallow exporting load functions in `*.svelte` module in SvelteKit page components. | :star: | -| [svelte/no-navigation-without-base](./rules/no-navigation-without-base.md) | disallow using navigation (links, goto, pushState, replaceState) without the base path | | -| [svelte/valid-prop-names-in-kit-pages](./rules/valid-prop-names-in-kit-pages.md) | disallow props other than data or errors in SvelteKit page components. | :star: | +| Rule ID | Description | | +| :------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------- | :----- | +| [svelte/no-export-load-in-svelte-module-in-kit-pages](./rules/no-export-load-in-svelte-module-in-kit-pages.md) | disallow exporting load functions in `*.svelte` module in SvelteKit page components. | :star: | +| [svelte/no-navigation-without-resolve](./rules/no-navigation-without-resolve.md) | disallow using navigation (links, goto, pushState, replaceState) without a resolve() | | +| [svelte/valid-prop-names-in-kit-pages](./rules/valid-prop-names-in-kit-pages.md) | disallow props other than data or errors in SvelteKit page components. | :star: | ## Experimental @@ -146,8 +146,9 @@ These rules relate to this plugin works: - :warning: We're going to remove deprecated rules in the next major release. Please migrate to successor/new rules. - :innocent: We don't fix bugs which are in deprecated rules since we don't have enough resources. -| Rule ID | Replaced by | -| :----------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------- | -| [svelte/@typescript-eslint/no-unnecessary-condition](./rules/@typescript-eslint/no-unnecessary-condition.md) | This rule is no longer needed when using svelte-eslint-parser>=v0.19.0. | -| [svelte/no-dynamic-slot-name](./rules/no-dynamic-slot-name.md) | Now Svelte compiler itself throws an compile error. | -| [svelte/no-goto-without-base](./rules/no-goto-without-base.md) | [svelte/no-navigation-without-base](./rules/no-navigation-without-base.md) | +| Rule ID | Replaced by | +| :----------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------- | +| [svelte/@typescript-eslint/no-unnecessary-condition](./rules/@typescript-eslint/no-unnecessary-condition.md) | This rule is no longer needed when using svelte-eslint-parser>=v0.19.0. | +| [svelte/no-dynamic-slot-name](./rules/no-dynamic-slot-name.md) | Now Svelte compiler itself throws an compile error. | +| [svelte/no-goto-without-base](./rules/no-goto-without-base.md) | [svelte/no-navigation-without-resolve](./rules/no-navigation-without-resolve.md) | +| [svelte/no-navigation-without-base](./rules/no-navigation-without-base.md) | [svelte/no-navigation-without-resolve](./rules/no-navigation-without-resolve.md) | diff --git a/docs/rules/no-goto-without-base.md b/docs/rules/no-goto-without-base.md index 727b4dc02..16470b2fd 100644 --- a/docs/rules/no-goto-without-base.md +++ b/docs/rules/no-goto-without-base.md @@ -10,7 +10,7 @@ since: 'v2.36.0-next.9' > disallow using goto() without the base path -- :warning: This rule was **deprecated** and replaced by [svelte/no-navigation-without-base](no-navigation-without-base.md) rule. +- :warning: This rule was **deprecated** and replaced by [svelte/no-navigation-without-resolve](no-navigation-without-resolve.md) rule. ## :book: Rule Details diff --git a/docs/rules/no-navigation-without-base.md b/docs/rules/no-navigation-without-base.md index 436a6e509..d7dec0ca6 100644 --- a/docs/rules/no-navigation-without-base.md +++ b/docs/rules/no-navigation-without-base.md @@ -10,6 +10,8 @@ since: 'v2.36.0-next.9' > disallow using navigation (links, goto, pushState, replaceState) without the base path +- :warning: This rule was **deprecated** and replaced by [svelte/no-navigation-without-resolve](no-navigation-without-resolve.md) rule. + ## :book: Rule Details This rule reports navigation using HTML `` tags, SvelteKit's `goto()`, `pushState()` and `replaceState()` functions without prefixing a relative URL with the base path. All four of these may be used for navigation, with `goto()`, `pushState()` and `replaceState()` being intended solely for iternal navigation (i.e. not leaving the site), while `` tags may be used for both internal and external navigation. When using any way of internal navigation, the base path must be prepended, otherwise the site may break. For programmatic navigation to external URLs, using `window.location` is advised. diff --git a/docs/rules/no-navigation-without-resolve.md b/docs/rules/no-navigation-without-resolve.md new file mode 100644 index 000000000..79cfe09a9 --- /dev/null +++ b/docs/rules/no-navigation-without-resolve.md @@ -0,0 +1,91 @@ +--- +pageClass: 'rule-details' +sidebarDepth: 0 +title: 'svelte/no-navigation-without-resolve' +description: 'disallow using navigation (links, goto, pushState, replaceState) without a resolve()' +since: 'v2.36.0-next.9' +--- + +# svelte/no-navigation-without-resolve + +> disallow using navigation (links, goto, pushState, replaceState) without a resolve() + +## :book: Rule Details + +This rule reports navigation using HTML `` tags, SvelteKit's `goto()`, `pushState()` and `replaceState()` functions without resolving a relative URL. All four of these may be used for navigation, with `goto()`, `pushState()` and `replaceState()` being intended solely for iternal navigation (i.e. not leaving the site), while `` tags may be used for both internal and external navigation. When using any way of internal navigation, the URL must be resolved using SvelteKit's `resolve()`, otherwise the site may break. For programmatic navigation to external URLs, using `window.location` is advised. + +This rule checks all 4 navigation options for the presence of the `resolve()` fucntion call, with an exception for `` links to absolute URLs (and fragment URLs), which are assumed to be used for external navigation and so do not require the `resolve()` function, and for shallow outing functions with an empty string as the path, which keeps the current URL. + + + +```svelte + + + +Click me! +Click me! + + +Click me! +Click me! +``` + +## :wrench: Options + +```json +{ + "svelte/no-navigation-without-resolve": [ + "error", + { + "ignoreGoto": false, + "ignoreLinks": false, + "ignorePushState": false, + "ignoreReplaceState": false + } + ] +} +``` + +- `ignoreGoto` ... Whether to ignore all `goto()` calls. Default `false`. +- `ignoreLinks` ... Whether to ignore all `` tags. Default `false`. +- `ignorePushState` ... Whether to ignore all `pushState()` calls. Default `false`. +- `ignoreReplaceState` ... Whether to ignore all `replaceState()` calls. Default `false`. + +## :books: Further Reading + +- [`resolve()` documentation](https://svelte.dev/docs/kit/$app-paths#resolve) +- [Shallow routing](https://svelte.dev/docs/kit/shallow-routing) +- [`goto()` documentation](https://svelte.dev/docs/kit/$app-navigation#goto) +- [`pushState()` documentation](https://svelte.dev/docs/kit/$app-navigation#pushState) +- [`replaceState()` documentation](https://svelte.dev/docs/kit/$app-navigation#replaceState) + +## :rocket: Version + +This rule was introduced in eslint-plugin-svelte v2.36.0-next.9 + +## :mag: Implementation + +- [Rule source](https://github.com/sveltejs/eslint-plugin-svelte/blob/main/packages/eslint-plugin-svelte/src/rules/no-navigation-without-resolve.ts) +- [Test source](https://github.com/sveltejs/eslint-plugin-svelte/blob/main/packages/eslint-plugin-svelte/tests/src/rules/no-navigation-without-resolve.ts) diff --git a/packages/eslint-plugin-svelte/src/rule-types.ts b/packages/eslint-plugin-svelte/src/rule-types.ts index f4fd5c81d..f58b636f9 100644 --- a/packages/eslint-plugin-svelte/src/rule-types.ts +++ b/packages/eslint-plugin-svelte/src/rule-types.ts @@ -189,8 +189,14 @@ export interface RuleOptions { /** * disallow using navigation (links, goto, pushState, replaceState) without the base path * @see https://sveltejs.github.io/eslint-plugin-svelte/rules/no-navigation-without-base/ + * @deprecated */ 'svelte/no-navigation-without-base'?: Linter.RuleEntry + /** + * disallow using navigation (links, goto, pushState, replaceState) without a resolve() + * @see https://sveltejs.github.io/eslint-plugin-svelte/rules/no-navigation-without-resolve/ + */ + 'svelte/no-navigation-without-resolve'?: Linter.RuleEntry /** * disallow use of not function in event handler * @see https://sveltejs.github.io/eslint-plugin-svelte/rules/no-not-function-handler/ @@ -518,6 +524,13 @@ type SvelteNoNavigationWithoutBase = []|[{ ignorePushState?: boolean ignoreReplaceState?: boolean }] +// ----- svelte/no-navigation-without-resolve ----- +type SvelteNoNavigationWithoutResolve = []|[{ + ignoreGoto?: boolean + ignoreLinks?: boolean + ignorePushState?: boolean + ignoreReplaceState?: boolean +}] // ----- svelte/no-reactive-reassign ----- type SvelteNoReactiveReassign = []|[{ props?: boolean diff --git a/packages/eslint-plugin-svelte/src/rules/no-goto-without-base.ts b/packages/eslint-plugin-svelte/src/rules/no-goto-without-base.ts index 78182e0d0..610b0922b 100644 --- a/packages/eslint-plugin-svelte/src/rules/no-goto-without-base.ts +++ b/packages/eslint-plugin-svelte/src/rules/no-goto-without-base.ts @@ -7,7 +7,7 @@ import type { RuleContext } from '../types.js'; export default createRule('no-goto-without-base', { meta: { deprecated: true, - replacedBy: ['no-navigation-without-base'], + replacedBy: ['no-navigation-without-resolve'], docs: { description: 'disallow using goto() without the base path', category: 'SvelteKit', diff --git a/packages/eslint-plugin-svelte/src/rules/no-navigation-without-base.ts b/packages/eslint-plugin-svelte/src/rules/no-navigation-without-base.ts index 1e19b9b99..9a1e89e27 100644 --- a/packages/eslint-plugin-svelte/src/rules/no-navigation-without-base.ts +++ b/packages/eslint-plugin-svelte/src/rules/no-navigation-without-base.ts @@ -8,6 +8,8 @@ import type { AST } from 'svelte-eslint-parser'; export default createRule('no-navigation-without-base', { meta: { + deprecated: true, + replacedBy: ['no-navigation-without-resolve'], docs: { description: 'disallow using navigation (links, goto, pushState, replaceState) without the base path', 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 new file mode 100644 index 000000000..7bb4c79ba --- /dev/null +++ b/packages/eslint-plugin-svelte/src/rules/no-navigation-without-resolve.ts @@ -0,0 +1,311 @@ +import type { TSESTree } from '@typescript-eslint/types'; +import { createRule } from '../utils/index.js'; +import { ReferenceTracker } from '@eslint-community/eslint-utils'; +import { findVariable } from '../utils/ast-utils.js'; +import type { RuleContext } from '../types.js'; +import type { AST } from 'svelte-eslint-parser'; + +export default createRule('no-navigation-without-resolve', { + meta: { + docs: { + description: + 'disallow using navigation (links, goto, pushState, replaceState) without a resolve()', + category: 'SvelteKit', + recommended: false + }, + schema: [ + { + type: 'object', + properties: { + ignoreGoto: { + type: 'boolean' + }, + ignoreLinks: { + type: 'boolean' + }, + ignorePushState: { + type: 'boolean' + }, + ignoreReplaceState: { + type: 'boolean' + } + }, + additionalProperties: false + } + ], + messages: { + gotoWithoutResolve: "Found a goto() call with a url that isn't resolved.", + linkWithoutResolve: "Found a link with a url that isn't resolved.", + pushStateWithoutResolve: "Found a pushState() call with a url that isn't resolved.", + replaceStateWithoutResolve: "Found a replaceState() call with a url that isn't resolved." + }, + type: 'suggestion' + }, + create(context) { + let resolveReferences: Set = new Set(); + return { + Program() { + const referenceTracker = new ReferenceTracker(context.sourceCode.scopeManager.globalScope!); + resolveReferences = extractResolveReferences(referenceTracker, context); + const { + goto: gotoCalls, + pushState: pushStateCalls, + replaceState: replaceStateCalls + } = extractFunctionCallReferences(referenceTracker); + if (context.options[0]?.ignoreGoto !== true) { + for (const gotoCall of gotoCalls) { + checkGotoCall(context, gotoCall, resolveReferences); + } + } + if (context.options[0]?.ignorePushState !== true) { + for (const pushStateCall of pushStateCalls) { + checkShallowNavigationCall( + context, + pushStateCall, + resolveReferences, + 'pushStateWithoutResolve' + ); + } + } + if (context.options[0]?.ignoreReplaceState !== true) { + for (const replaceStateCall of replaceStateCalls) { + checkShallowNavigationCall( + context, + replaceStateCall, + resolveReferences, + 'replaceStateWithoutResolve' + ); + } + } + }, + SvelteAttribute(node) { + if ( + context.options[0]?.ignoreLinks === true || + 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' && + !expressionIsAbsolute(node.value[0]) && + !expressionIsFragment(node.value[0])) || + (node.value[0].type === 'SvelteMustacheTag' && + !expressionIsAbsolute(node.value[0].expression) && + !expressionIsFragment(node.value[0].expression) && + !isResolveCall(context, node.value[0].expression, resolveReferences)) + ) { + context.report({ loc: node.value[0].loc, messageId: 'linkWithoutResolve' }); + } + } + }; + } +}); + +// Extract all imports of the resolve() function + +function extractResolveReferences( + referenceTracker: ReferenceTracker, + context: RuleContext +): Set { + const set = new Set(); + for (const { node } of referenceTracker.iterateEsmReferences({ + '$app/paths': { + [ReferenceTracker.ESM]: true, + resolve: { + [ReferenceTracker.READ]: true + } + } + })) { + if (node.type === 'ImportSpecifier') { + const variable = findVariable(context, node.local); + if (variable === null) { + continue; + } + for (const reference of variable.references) { + if (reference.identifier.type === 'Identifier') set.add(reference.identifier); + } + } else if ( + node.type === 'MemberExpression' && + node.property.type === 'Identifier' && + node.property.name === 'resolve' + ) { + set.add(node.property); + } + } + return set; +} + +// Extract all references to goto, pushState and replaceState + +function extractFunctionCallReferences(referenceTracker: ReferenceTracker): { + goto: TSESTree.CallExpression[]; + pushState: TSESTree.CallExpression[]; + replaceState: TSESTree.CallExpression[]; +} { + const rawReferences = Array.from( + referenceTracker.iterateEsmReferences({ + '$app/navigation': { + [ReferenceTracker.ESM]: true, + goto: { + [ReferenceTracker.CALL]: true + }, + pushState: { + [ReferenceTracker.CALL]: true + }, + replaceState: { + [ReferenceTracker.CALL]: true + } + } + }) + ); + return { + goto: rawReferences + .filter(({ path }) => path[path.length - 1] === 'goto') + .map(({ node }) => node as TSESTree.CallExpression), + pushState: rawReferences + .filter(({ path }) => path[path.length - 1] === 'pushState') + .map(({ node }) => node as TSESTree.CallExpression), + replaceState: rawReferences + .filter(({ path }) => path[path.length - 1] === 'replaceState') + .map(({ node }) => node as TSESTree.CallExpression) + }; +} + +// Actual function checking + +function checkGotoCall( + context: RuleContext, + call: TSESTree.CallExpression, + resolveReferences: Set +): void { + if (call.arguments.length < 1) { + return; + } + const url = call.arguments[0]; + if (!isResolveCall(context, url, resolveReferences)) { + context.report({ loc: url.loc, messageId: 'gotoWithoutResolve' }); + } +} + +function checkShallowNavigationCall( + context: RuleContext, + call: TSESTree.CallExpression, + resolveReferences: Set, + messageId: string +): void { + if (call.arguments.length < 1) { + return; + } + const url = call.arguments[0]; + if (!expressionIsEmpty(url) && !isResolveCall(context, url, resolveReferences)) { + context.report({ loc: url.loc, messageId }); + } +} + +// Helper functions + +function isResolveCall( + context: RuleContext, + node: TSESTree.CallExpressionArgument, + resolveReferences: Set +): boolean { + if ( + node.type === 'CallExpression' && + ((node.callee.type === 'Identifier' && resolveReferences.has(node.callee)) || + (node.callee.type === 'MemberExpression' && + node.callee.property.type === 'Identifier' && + resolveReferences.has(node.callee.property))) + ) { + return true; + } + if (node.type === 'Identifier') { + const variable = findVariable(context, node); + if ( + variable !== null && + variable.identifiers.length > 0 && + variable.identifiers[0].parent.type === 'VariableDeclarator' && + variable.identifiers[0].parent.init !== null && + isResolveCall(context, variable.identifiers[0].parent.init, resolveReferences) + ) { + return true; + } + } + return false; +} + +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 === '') + ); +} + +function expressionIsAbsolute(url: AST.SvelteLiteral | TSESTree.Expression): boolean { + switch (url.type) { + case 'BinaryExpression': + return binaryExpressionIsAbsolute(url); + case 'Literal': + return typeof url.value === 'string' && urlValueIsAbsolute(url.value); + case 'SvelteLiteral': + return urlValueIsAbsolute(url.value); + case 'TemplateLiteral': + return templateLiteralIsAbsolute(url); + default: + return false; + } +} + +function binaryExpressionIsAbsolute(url: TSESTree.BinaryExpression): boolean { + return ( + (url.left.type !== 'PrivateIdentifier' && expressionIsAbsolute(url.left)) || + expressionIsAbsolute(url.right) + ); +} + +function templateLiteralIsAbsolute(url: TSESTree.TemplateLiteral): boolean { + return ( + url.expressions.some(expressionIsAbsolute) || + url.quasis.some((quasi) => urlValueIsAbsolute(quasi.value.raw)) + ); +} + +function urlValueIsAbsolute(url: string): boolean { + return url.includes('://'); +} + +function expressionIsFragment(url: AST.SvelteLiteral | TSESTree.Expression): boolean { + switch (url.type) { + case 'BinaryExpression': + return binaryExpressionIsFragment(url); + case 'Literal': + return typeof url.value === 'string' && urlValueIsFragment(url.value); + case 'SvelteLiteral': + return urlValueIsFragment(url.value); + case 'TemplateLiteral': + return templateLiteralIsFragment(url); + default: + return false; + } +} + +function binaryExpressionIsFragment(url: TSESTree.BinaryExpression): boolean { + return url.left.type !== 'PrivateIdentifier' && expressionIsFragment(url.left); +} + +function templateLiteralIsFragment(url: TSESTree.TemplateLiteral): boolean { + return ( + (url.expressions.length >= 1 && expressionIsFragment(url.expressions[0])) || + (url.quasis.length >= 1 && urlValueIsFragment(url.quasis[0].value.raw)) + ); +} + +function urlValueIsFragment(url: string): boolean { + return url.startsWith('#'); +} diff --git a/packages/eslint-plugin-svelte/src/utils/rules.ts b/packages/eslint-plugin-svelte/src/utils/rules.ts index fa43f58b7..4451367c2 100644 --- a/packages/eslint-plugin-svelte/src/utils/rules.ts +++ b/packages/eslint-plugin-svelte/src/utils/rules.ts @@ -37,6 +37,7 @@ import noInlineStyles from '../rules/no-inline-styles.js'; import noInnerDeclarations from '../rules/no-inner-declarations.js'; import noInspect from '../rules/no-inspect.js'; import noNavigationWithoutBase from '../rules/no-navigation-without-base.js'; +import noNavigationWithoutResolve from '../rules/no-navigation-without-resolve.js'; import noNotFunctionHandler from '../rules/no-not-function-handler.js'; import noObjectInTextMustaches from '../rules/no-object-in-text-mustaches.js'; import noRawSpecialElements from '../rules/no-raw-special-elements.js'; @@ -117,6 +118,7 @@ export const rules = [ noInnerDeclarations, noInspect, noNavigationWithoutBase, + noNavigationWithoutResolve, noNotFunctionHandler, noObjectInTextMustaches, noRawSpecialElements, diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/goto-aliased01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/goto-aliased01-errors.yaml new file mode 100644 index 000000000..ce6b7669f --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/goto-aliased01-errors.yaml @@ -0,0 +1,4 @@ +- message: Found a goto() call with a url that isn't resolved. + line: 4 + column: 8 + suggestions: null diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/goto-aliased01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/goto-aliased01-input.svelte new file mode 100644 index 000000000..00f19edec --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/goto-aliased01-input.svelte @@ -0,0 +1,5 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/goto-namespace-import01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/goto-namespace-import01-errors.yaml new file mode 100644 index 000000000..00c6c11c9 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/goto-namespace-import01-errors.yaml @@ -0,0 +1,4 @@ +- message: Found a goto() call with a url that isn't resolved. + line: 4 + column: 18 + suggestions: null diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/goto-namespace-import01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/goto-namespace-import01-input.svelte new file mode 100644 index 000000000..9e9868428 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/goto-namespace-import01-input.svelte @@ -0,0 +1,5 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/goto-partial-resolve01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/goto-partial-resolve01-errors.yaml new file mode 100644 index 000000000..aa29dec0c --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/goto-partial-resolve01-errors.yaml @@ -0,0 +1,8 @@ +- message: Found a goto() call with a url that isn't resolved. + line: 5 + column: 7 + suggestions: null +- message: Found a goto() call with a url that isn't resolved. + line: 6 + column: 7 + suggestions: null diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/goto-partial-resolve01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/goto-partial-resolve01-input.svelte new file mode 100644 index 000000000..d0fd857d5 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/goto-partial-resolve01-input.svelte @@ -0,0 +1,7 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/goto-without-resolve01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/goto-without-resolve01-errors.yaml new file mode 100644 index 000000000..e63634672 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/goto-without-resolve01-errors.yaml @@ -0,0 +1,8 @@ +- message: Found a goto() call with a url that isn't resolved. + line: 6 + column: 7 + suggestions: null +- message: Found a goto() call with a url that isn't resolved. + line: 7 + column: 7 + suggestions: null diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/goto-without-resolve01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/goto-without-resolve01-input.svelte new file mode 100644 index 000000000..7cb58ea20 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/goto-without-resolve01-input.svelte @@ -0,0 +1,8 @@ + 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 new file mode 100644 index 000000000..7b8b81c68 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-partial-resolve01-errors.yaml @@ -0,0 +1,8 @@ +- message: Found a link with a url that isn't resolved. + line: 5 + column: 9 + suggestions: null +- message: Found a link with a url that isn't resolved. + line: 6 + column: 9 + suggestions: null diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-partial-resolve01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-partial-resolve01-input.svelte new file mode 100644 index 000000000..1ab747a3c --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-partial-resolve01-input.svelte @@ -0,0 +1,6 @@ + + +Click me! +Click me! 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 new file mode 100644 index 000000000..bfe0aa41b --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-with-fragment01-errors.yaml @@ -0,0 +1,16 @@ +- message: Found a link with a url that isn't resolved. + line: 5 + column: 10 + suggestions: null +- message: Found a link with a url that isn't resolved. + line: 6 + column: 9 + suggestions: null +- message: Found a link with a url that isn't resolved. + line: 7 + column: 9 + suggestions: null +- message: Found a link with a url that isn't resolved. + line: 8 + column: 9 + suggestions: null diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-with-fragment01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-with-fragment01-input.svelte new file mode 100644 index 000000000..ae42ef579 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-with-fragment01-input.svelte @@ -0,0 +1,8 @@ + + +Click me! +Click me! +Click me! +Click me! 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 new file mode 100644 index 000000000..bfe0aa41b --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-without-resolve01-errors.yaml @@ -0,0 +1,16 @@ +- message: Found a link with a url that isn't resolved. + line: 5 + column: 10 + suggestions: null +- message: Found a link with a url that isn't resolved. + line: 6 + column: 9 + suggestions: null +- message: Found a link with a url that isn't resolved. + line: 7 + column: 9 + suggestions: null +- message: Found a link with a url that isn't resolved. + line: 8 + column: 9 + suggestions: null diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-without-resolve01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-without-resolve01-input.svelte new file mode 100644 index 000000000..7e3bfb730 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-without-resolve01-input.svelte @@ -0,0 +1,8 @@ + + +Click me! +Click me! +Click me! +Click me! diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/pushState-aliased01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/pushState-aliased01-errors.yaml new file mode 100644 index 000000000..d2cdd8a01 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/pushState-aliased01-errors.yaml @@ -0,0 +1,4 @@ +- message: Found a pushState() call with a url that isn't resolved. + line: 4 + column: 8 + suggestions: null diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/pushState-aliased01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/pushState-aliased01-input.svelte new file mode 100644 index 000000000..066397bf9 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/pushState-aliased01-input.svelte @@ -0,0 +1,5 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/pushState-namespace-import01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/pushState-namespace-import01-errors.yaml new file mode 100644 index 000000000..1f1d8f07c --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/pushState-namespace-import01-errors.yaml @@ -0,0 +1,4 @@ +- message: Found a pushState() call with a url that isn't resolved. + line: 4 + column: 23 + suggestions: null diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/pushState-namespace-import01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/pushState-namespace-import01-input.svelte new file mode 100644 index 000000000..a3c883949 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/pushState-namespace-import01-input.svelte @@ -0,0 +1,5 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/pushState-partial-resolve01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/pushState-partial-resolve01-errors.yaml new file mode 100644 index 000000000..fb9c724ad --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/pushState-partial-resolve01-errors.yaml @@ -0,0 +1,8 @@ +- message: Found a pushState() call with a url that isn't resolved. + line: 5 + column: 12 + suggestions: null +- message: Found a pushState() call with a url that isn't resolved. + line: 6 + column: 12 + suggestions: null diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/pushState-partial-resolve01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/pushState-partial-resolve01-input.svelte new file mode 100644 index 000000000..8fc117dd1 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/pushState-partial-resolve01-input.svelte @@ -0,0 +1,7 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/pushState-without-resolve01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/pushState-without-resolve01-errors.yaml new file mode 100644 index 000000000..874b38fa2 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/pushState-without-resolve01-errors.yaml @@ -0,0 +1,8 @@ +- message: Found a pushState() call with a url that isn't resolved. + line: 6 + column: 12 + suggestions: null +- message: Found a pushState() call with a url that isn't resolved. + line: 7 + column: 12 + suggestions: null diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/pushState-without-resolve01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/pushState-without-resolve01-input.svelte new file mode 100644 index 000000000..19fe76cf3 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/pushState-without-resolve01-input.svelte @@ -0,0 +1,8 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/replaceState-aliased01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/replaceState-aliased01-errors.yaml new file mode 100644 index 000000000..0f9bb334f --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/replaceState-aliased01-errors.yaml @@ -0,0 +1,4 @@ +- message: Found a replaceState() call with a url that isn't resolved. + line: 4 + column: 8 + suggestions: null diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/replaceState-aliased01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/replaceState-aliased01-input.svelte new file mode 100644 index 000000000..de4169926 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/replaceState-aliased01-input.svelte @@ -0,0 +1,5 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/replaceState-namespace-import01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/replaceState-namespace-import01-errors.yaml new file mode 100644 index 000000000..d3ce4f0b3 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/replaceState-namespace-import01-errors.yaml @@ -0,0 +1,4 @@ +- message: Found a replaceState() call with a url that isn't resolved. + line: 4 + column: 26 + suggestions: null diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/replaceState-namespace-import01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/replaceState-namespace-import01-input.svelte new file mode 100644 index 000000000..47db8ff31 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/replaceState-namespace-import01-input.svelte @@ -0,0 +1,5 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/replaceState-partial-resolve01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/replaceState-partial-resolve01-errors.yaml new file mode 100644 index 000000000..59a969704 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/replaceState-partial-resolve01-errors.yaml @@ -0,0 +1,8 @@ +- message: Found a replaceState() call with a url that isn't resolved. + line: 5 + column: 15 + suggestions: null +- message: Found a replaceState() call with a url that isn't resolved. + line: 6 + column: 15 + suggestions: null diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/replaceState-partial-resolve01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/replaceState-partial-resolve01-input.svelte new file mode 100644 index 000000000..002bfcead --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/replaceState-partial-resolve01-input.svelte @@ -0,0 +1,7 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/replaceState-without-resolve01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/replaceState-without-resolve01-errors.yaml new file mode 100644 index 000000000..feee113b5 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/replaceState-without-resolve01-errors.yaml @@ -0,0 +1,8 @@ +- message: Found a replaceState() call with a url that isn't resolved. + line: 6 + column: 15 + suggestions: null +- message: Found a replaceState() call with a url that isn't resolved. + line: 7 + column: 15 + suggestions: null diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/replaceState-without-resolve01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/replaceState-without-resolve01-input.svelte new file mode 100644 index 000000000..4738c2ccb --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/replaceState-without-resolve01-input.svelte @@ -0,0 +1,8 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/goto-namespace-import01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/goto-namespace-import01-input.svelte new file mode 100644 index 000000000..53f70b0b5 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/goto-namespace-import01-input.svelte @@ -0,0 +1,6 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/goto-resolve-aliased01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/goto-resolve-aliased01-input.svelte new file mode 100644 index 000000000..6adf6883c --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/goto-resolve-aliased01-input.svelte @@ -0,0 +1,6 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/goto-resolved01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/goto-resolved01-input.svelte new file mode 100644 index 000000000..e29e15798 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/goto-resolved01-input.svelte @@ -0,0 +1,9 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/ignoreGoto/_config.json b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/ignoreGoto/_config.json new file mode 100644 index 000000000..f21168640 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/ignoreGoto/_config.json @@ -0,0 +1,7 @@ +{ + "options": [ + { + "ignoreGoto": true + } + ] +} diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/ignoreGoto/goto-ignored01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/ignoreGoto/goto-ignored01-input.svelte new file mode 100644 index 000000000..6f011fe2d --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/ignoreGoto/goto-ignored01-input.svelte @@ -0,0 +1,5 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/ignoreLinks/_config.json b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/ignoreLinks/_config.json new file mode 100644 index 000000000..fd03211ab --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/ignoreLinks/_config.json @@ -0,0 +1,7 @@ +{ + "options": [ + { + "ignoreLinks": true + } + ] +} diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/ignoreLinks/link-ignored01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/ignoreLinks/link-ignored01-input.svelte new file mode 100644 index 000000000..546ecda29 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/ignoreLinks/link-ignored01-input.svelte @@ -0,0 +1,3 @@ +Click me! +Click me! +Click me! diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/ignorePushState/_config.json b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/ignorePushState/_config.json new file mode 100644 index 000000000..7fbdd8b77 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/ignorePushState/_config.json @@ -0,0 +1,7 @@ +{ + "options": [ + { + "ignorePushState": true + } + ] +} diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/ignorePushState/pushState-ignored01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/ignorePushState/pushState-ignored01-input.svelte new file mode 100644 index 000000000..37ea2b65d --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/ignorePushState/pushState-ignored01-input.svelte @@ -0,0 +1,5 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/ignoreReplaceState/_config.json b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/ignoreReplaceState/_config.json new file mode 100644 index 000000000..a678a15a8 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/ignoreReplaceState/_config.json @@ -0,0 +1,7 @@ +{ + "options": [ + { + "ignoreReplaceState": true + } + ] +} diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/ignoreReplaceState/replaceState-ignored01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/ignoreReplaceState/replaceState-ignored01-input.svelte new file mode 100644 index 000000000..5826d76b0 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/ignoreReplaceState/replaceState-ignored01-input.svelte @@ -0,0 +1,5 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/link-absolute-url01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/link-absolute-url01-input.svelte new file mode 100644 index 000000000..b7896c265 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/link-absolute-url01-input.svelte @@ -0,0 +1,13 @@ + + +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-fragment-url01-input.svelte new file mode 100644 index 000000000..eeaa16267 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/link-fragment-url01-input.svelte @@ -0,0 +1,10 @@ + + +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-namespace-import01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/link-namespace-import01-input.svelte new file mode 100644 index 000000000..7dba71fc7 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/link-namespace-import01-input.svelte @@ -0,0 +1,5 @@ + + +Click me!; diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/link-resolve-aliased01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/link-resolve-aliased01-input.svelte new file mode 100644 index 000000000..e0a7338ac --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/link-resolve-aliased01-input.svelte @@ -0,0 +1,5 @@ + + +Click me!; diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/link-resolved01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/link-resolved01-input.svelte new file mode 100644 index 000000000..2561d7490 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/link-resolved01-input.svelte @@ -0,0 +1,8 @@ + + +Click me! +Click me! diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/pushState-empty-url01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/pushState-empty-url01-input.svelte new file mode 100644 index 000000000..4a8db79d9 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/pushState-empty-url01-input.svelte @@ -0,0 +1,6 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/pushState-namespace-import01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/pushState-namespace-import01-input.svelte new file mode 100644 index 000000000..c65e600ec --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/pushState-namespace-import01-input.svelte @@ -0,0 +1,6 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/pushState-resolve-aliased01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/pushState-resolve-aliased01-input.svelte new file mode 100644 index 000000000..41a2a2404 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/pushState-resolve-aliased01-input.svelte @@ -0,0 +1,6 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/pushState-resolved01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/pushState-resolved01-input.svelte new file mode 100644 index 000000000..a9fadadda --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/pushState-resolved01-input.svelte @@ -0,0 +1,9 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/replaceState-empty-url01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/replaceState-empty-url01-input.svelte new file mode 100644 index 000000000..96dae8e4d --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/replaceState-empty-url01-input.svelte @@ -0,0 +1,6 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/replaceState-namespace-import01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/replaceState-namespace-import01-input.svelte new file mode 100644 index 000000000..62ad66d8f --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/replaceState-namespace-import01-input.svelte @@ -0,0 +1,6 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/replaceState-resolve-aliased01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/replaceState-resolve-aliased01-input.svelte new file mode 100644 index 000000000..2b7874c8e --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/replaceState-resolve-aliased01-input.svelte @@ -0,0 +1,6 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/replaceState-resolved01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/replaceState-resolved01-input.svelte new file mode 100644 index 000000000..a7715e73a --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/replaceState-resolved01-input.svelte @@ -0,0 +1,9 @@ + diff --git a/packages/eslint-plugin-svelte/tests/src/rules/no-navigation-without-resolve.ts b/packages/eslint-plugin-svelte/tests/src/rules/no-navigation-without-resolve.ts new file mode 100644 index 000000000..8f56b66e8 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/src/rules/no-navigation-without-resolve.ts @@ -0,0 +1,12 @@ +import { RuleTester } from '../../utils/eslint-compat'; +import rule from '../../../src/rules/no-navigation-without-resolve'; +import { loadTestCases } from '../../utils/utils'; + +const tester = new RuleTester({ + languageOptions: { + ecmaVersion: "latest", + sourceType: 'module' + } +}); + +tester.run('no-navigation-without-resolve', rule as any, loadTestCases('no-navigation-without-resolve'));