diff --git a/.changeset/cold-starfishes-doubt.md b/.changeset/cold-starfishes-doubt.md new file mode 100644 index 000000000..f85c6b39a --- /dev/null +++ b/.changeset/cold-starfishes-doubt.md @@ -0,0 +1,5 @@ +--- +'eslint-plugin-svelte': minor +--- + +feat: added the no-navigation-without-base rule diff --git a/.changeset/olive-melons-explain.md b/.changeset/olive-melons-explain.md new file mode 100644 index 000000000..6571a5bbf --- /dev/null +++ b/.changeset/olive-melons-explain.md @@ -0,0 +1,5 @@ +--- +'eslint-plugin-svelte': major +--- + +chore: deprecated the no-goto-without-base rule diff --git a/README.md b/README.md index 2601875d0..42fa71658 100644 --- a/README.md +++ b/README.md @@ -414,7 +414,7 @@ These rules relate to SvelteKit and its best Practices. | Rule ID | Description | | |:--------|:------------|:---| -| [svelte/no-goto-without-base](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-goto-without-base/) | disallow using goto() without the base path | | +| [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 | | ## Experimental @@ -442,6 +442,7 @@ These rules relate to this plugin works: | Rule ID | Replaced by | |:--------|:------------| | [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-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/) | diff --git a/docs/rules.md b/docs/rules.md index 29701ff7e..37a2fb9f2 100644 --- a/docs/rules.md +++ b/docs/rules.md @@ -109,9 +109,9 @@ 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-goto-without-base](./rules/no-goto-without-base.md) | disallow using goto() without the base path | | +| Rule ID | Description | | +| :------------------------------------------------------------------------- | :------------------------------------------------------------------------------------- | :-- | +| [svelte/no-navigation-without-base](./rules/no-navigation-without-base.md) | disallow using navigation (links, goto, pushState, replaceState) without the base path | | ## Experimental @@ -136,6 +136,7 @@ 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. | +| 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-goto-without-base](./rules/no-goto-without-base.md) | [svelte/no-navigation-without-base](./rules/no-navigation-without-base.md) | diff --git a/docs/rules/no-goto-without-base.md b/docs/rules/no-goto-without-base.md index 757745120..727b4dc02 100644 --- a/docs/rules/no-goto-without-base.md +++ b/docs/rules/no-goto-without-base.md @@ -10,6 +10,8 @@ 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. + ## :book: Rule Details This rule reports navigation using SvelteKit's `goto()` function without prefixing a relative URL with the base path. If a non-prefixed relative URL is used for navigation, the `goto` function navigates away from the base path, which is usually not what you wanted to do (for external URLs, `window.location = url` should be used instead). diff --git a/docs/rules/no-navigation-without-base.md b/docs/rules/no-navigation-without-base.md new file mode 100644 index 000000000..436a6e509 --- /dev/null +++ b/docs/rules/no-navigation-without-base.md @@ -0,0 +1,94 @@ +--- +pageClass: 'rule-details' +sidebarDepth: 0 +title: 'svelte/no-navigation-without-base' +description: 'disallow using navigation (links, goto, pushState, replaceState) without the base path' +since: 'v2.36.0-next.9' +--- + +# svelte/no-navigation-without-base + +> disallow using navigation (links, goto, pushState, replaceState) without the base path + +## :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. + +This rule checks all 4 navigation options for the presence of the base path, with an exception for `` links to absolute URLs, which are assumed to be used for external navigation and so do not require the base path, 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! +Click me! +``` + +## :wrench: Options + +```json +{ + "svelte/no-navigation-without-base": [ + "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 + +- [`base` documentation](https://svelte.dev/docs/kit/$app-paths#base) +- [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-base.ts) +- [Test source](https://github.com/sveltejs/eslint-plugin-svelte/blob/main/packages/eslint-plugin-svelte/tests/src/rules/no-navigation-without-base.ts) diff --git a/packages/eslint-plugin-svelte/src/rule-types.ts b/packages/eslint-plugin-svelte/src/rule-types.ts index 8b7cbe80c..2c4abeec1 100644 --- a/packages/eslint-plugin-svelte/src/rule-types.ts +++ b/packages/eslint-plugin-svelte/src/rule-types.ts @@ -152,6 +152,7 @@ export interface RuleOptions { /** * disallow using goto() without the base path * @see https://sveltejs.github.io/eslint-plugin-svelte/rules/no-goto-without-base/ + * @deprecated */ 'svelte/no-goto-without-base'?: Linter.RuleEntry<[]> /** @@ -179,6 +180,11 @@ export interface RuleOptions { * @see https://sveltejs.github.io/eslint-plugin-svelte/rules/no-inspect/ */ 'svelte/no-inspect'?: Linter.RuleEntry<[]> + /** + * disallow using navigation (links, goto, pushState, replaceState) without the base path + * @see https://sveltejs.github.io/eslint-plugin-svelte/rules/no-navigation-without-base/ + */ + 'svelte/no-navigation-without-base'?: Linter.RuleEntry /** * disallow use of not function in event handler * @see https://sveltejs.github.io/eslint-plugin-svelte/rules/no-not-function-handler/ @@ -442,6 +448,13 @@ type SvelteNoInlineStyles = []|[{ type SvelteNoInnerDeclarations = []|[("functions" | "both")]|[("functions" | "both"), { blockScopedFunctions?: ("allow" | "disallow") }] +// ----- svelte/no-navigation-without-base ----- +type SvelteNoNavigationWithoutBase = []|[{ + 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 5145a7082..2dde04327 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,6 +7,8 @@ import type { RuleContext } from '../types.js'; export default createRule('no-goto-without-base', { meta: { + deprecated: true, + replacedBy: ['no-navigation-without-base'], 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 new file mode 100644 index 000000000..6f2a20994 --- /dev/null +++ b/packages/eslint-plugin-svelte/src/rules/no-navigation-without-base.ts @@ -0,0 +1,350 @@ +import type { TSESTree } from '@typescript-eslint/types'; +import { createRule } from '../utils/index.js'; +import { ReferenceTracker } from '@eslint-community/eslint-utils'; +import { getSourceCode } from '../utils/compat.js'; +import { findVariable } from '../utils/ast-utils.js'; +import type { RuleContext } from '../types.js'; +import type { SvelteLiteral } from 'svelte-eslint-parser/lib/ast'; + +export default createRule('no-navigation-without-base', { + meta: { + docs: { + description: + 'disallow using navigation (links, goto, pushState, replaceState) without the base path', + category: 'SvelteKit', + recommended: false + }, + schema: [ + { + type: 'object', + properties: { + ignoreGoto: { + type: 'boolean' + }, + ignoreLinks: { + type: 'boolean' + }, + ignorePushState: { + type: 'boolean' + }, + ignoreReplaceState: { + type: 'boolean' + } + }, + additionalProperties: false + } + ], + messages: { + gotoNotPrefixed: "Found a goto() call with a url that isn't prefixed with the base path.", + linkNotPrefixed: "Found a link with a url that isn't prefixed with the base path.", + pushStateNotPrefixed: + "Found a pushState() call with a url that isn't prefixed with the base path.", + replaceStateNotPrefixed: + "Found a replaceState() call with a url that isn't prefixed with the base path." + }, + type: 'suggestion' + }, + create(context) { + let basePathNames: Set = new Set(); + return { + Program() { + const referenceTracker = new ReferenceTracker( + getSourceCode(context).scopeManager.globalScope! + ); + basePathNames = extractBasePathReferences(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, basePathNames); + } + } + if (context.options[0]?.ignorePushState !== true) { + for (const pushStateCall of pushStateCalls) { + checkShallowNavigationCall( + context, + pushStateCall, + basePathNames, + 'pushStateNotPrefixed' + ); + } + } + if (context.options[0]?.ignoreReplaceState !== true) { + for (const replaceStateCall of replaceStateCalls) { + checkShallowNavigationCall( + context, + replaceStateCall, + basePathNames, + 'replaceStateNotPrefixed' + ); + } + } + }, + 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; + } + const hrefValue = node.value[0]; + if (hrefValue.type === 'SvelteLiteral') { + if (!expressionIsAbsolute(hrefValue)) { + context.report({ loc: hrefValue.loc, messageId: 'linkNotPrefixed' }); + } + return; + } + if ( + !expressionStartsWithBase(context, hrefValue.expression, basePathNames) && + !expressionIsAbsolute(hrefValue.expression) + ) { + context.report({ loc: hrefValue.loc, messageId: 'linkNotPrefixed' }); + } + } + }; + } +}); + +// Extract all imports of the base path + +function extractBasePathReferences( + referenceTracker: ReferenceTracker, + context: RuleContext +): Set { + const set = new Set(); + for (const { node } of referenceTracker.iterateEsmReferences({ + '$app/paths': { + [ReferenceTracker.ESM]: true, + base: { + [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 === 'base' + ) { + 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), + pushState: rawReferences + .filter(({ path }) => path[path.length - 1] === 'pushState') + .map(({ node }) => node), + replaceState: rawReferences + .filter(({ path }) => path[path.length - 1] === 'replaceState') + .map(({ node }) => node) + }; +} + +// Actual function checking + +function checkGotoCall( + context: RuleContext, + call: TSESTree.CallExpression, + basePathNames: Set +): void { + if (call.arguments.length < 1) { + return; + } + const url = call.arguments[0]; + if (url.type === 'SpreadElement' || !expressionStartsWithBase(context, url, basePathNames)) { + context.report({ loc: url.loc, messageId: 'gotoNotPrefixed' }); + } +} + +function checkShallowNavigationCall( + context: RuleContext, + call: TSESTree.CallExpression, + basePathNames: Set, + messageId: string +): void { + if (call.arguments.length < 1) { + return; + } + const url = call.arguments[0]; + if ( + url.type === 'SpreadElement' || + (!expressionIsEmpty(url) && !expressionStartsWithBase(context, url, basePathNames)) + ) { + context.report({ loc: url.loc, messageId }); + } +} + +// Helper functions + +function expressionStartsWithBase( + context: RuleContext, + url: TSESTree.Expression, + basePathNames: Set +): boolean { + switch (url.type) { + case 'BinaryExpression': + return binaryExpressionStartsWithBase(context, url, basePathNames); + case 'Identifier': + return variableStartsWithBase(context, url, basePathNames); + case 'MemberExpression': + return memberExpressionStartsWithBase(url, basePathNames); + case 'TemplateLiteral': + return templateLiteralStartsWithBase(context, url, basePathNames); + default: + return false; + } +} + +function binaryExpressionStartsWithBase( + context: RuleContext, + url: TSESTree.BinaryExpression, + basePathNames: Set +): boolean { + return ( + url.left.type !== 'PrivateIdentifier' && + expressionStartsWithBase(context, url.left, basePathNames) + ); +} + +function memberExpressionStartsWithBase( + url: TSESTree.MemberExpression, + basePathNames: Set +): boolean { + return url.property.type === 'Identifier' && basePathNames.has(url.property); +} + +function variableStartsWithBase( + context: RuleContext, + url: TSESTree.Identifier, + basePathNames: Set +): boolean { + if (basePathNames.has(url)) { + return true; + } + const variable = findVariable(context, url); + if ( + variable === null || + variable.identifiers.length !== 1 || + variable.identifiers[0].parent.type !== 'VariableDeclarator' || + variable.identifiers[0].parent.init === null + ) { + return false; + } + return expressionStartsWithBase(context, variable.identifiers[0].parent.init, basePathNames); +} + +function templateLiteralStartsWithBase( + context: RuleContext, + url: TSESTree.TemplateLiteral, + basePathNames: Set +): boolean { + const startingIdentifier = extractLiteralStartingExpression(url); + return ( + startingIdentifier !== undefined && + expressionStartsWithBase(context, startingIdentifier, basePathNames) + ); +} + +function extractLiteralStartingExpression( + templateLiteral: TSESTree.TemplateLiteral +): TSESTree.Expression | undefined { + const literalParts = [...templateLiteral.expressions, ...templateLiteral.quasis].sort((a, b) => + a.range[0] < b.range[0] ? -1 : 1 + ); + for (const part of literalParts) { + if (part.type === 'TemplateElement' && part.value.raw === '') { + // Skip empty quasi in the begining + continue; + } + if (part.type !== 'TemplateElement') { + return part; + } + return undefined; + } + return undefined; +} + +function expressionIsEmpty(url: TSESTree.Expression): 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: 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('://'); +} diff --git a/packages/eslint-plugin-svelte/src/utils/rules.ts b/packages/eslint-plugin-svelte/src/utils/rules.ts index 296a7700d..284ad2373 100644 --- a/packages/eslint-plugin-svelte/src/utils/rules.ts +++ b/packages/eslint-plugin-svelte/src/utils/rules.ts @@ -35,6 +35,7 @@ import noImmutableReactiveStatements from '../rules/no-immutable-reactive-statem 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 noNotFunctionHandler from '../rules/no-not-function-handler.js'; import noObjectInTextMustaches from '../rules/no-object-in-text-mustaches.js'; import noReactiveFunctions from '../rules/no-reactive-functions.js'; @@ -103,6 +104,7 @@ export const rules = [ noInlineStyles, noInnerDeclarations, noInspect, + noNavigationWithoutBase, noNotFunctionHandler, noObjectInTextMustaches, noReactiveFunctions, diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/goto-aliased01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/goto-aliased01-errors.yaml new file mode 100644 index 000000000..cc35de50a --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/goto-aliased01-errors.yaml @@ -0,0 +1,4 @@ +- message: Found a goto() call with a url that isn't prefixed with the base path. + line: 4 + column: 8 + suggestions: null diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/goto-aliased01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/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-base/invalid/goto-aliased01-input.svelte @@ -0,0 +1,5 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/goto-base-not-as-prefix01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/goto-base-not-as-prefix01-errors.yaml new file mode 100644 index 000000000..f0a24ef44 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/goto-base-not-as-prefix01-errors.yaml @@ -0,0 +1,8 @@ +- message: Found a goto() call with a url that isn't prefixed with the base path. + line: 5 + column: 7 + suggestions: null +- message: Found a goto() call with a url that isn't prefixed with the base path. + line: 6 + column: 7 + suggestions: null diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/goto-base-not-as-prefix01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/goto-base-not-as-prefix01-input.svelte new file mode 100644 index 000000000..be68b2e4a --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/goto-base-not-as-prefix01-input.svelte @@ -0,0 +1,7 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/goto-namespace-import01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/goto-namespace-import01-errors.yaml new file mode 100644 index 000000000..8fe7d69b8 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/goto-namespace-import01-errors.yaml @@ -0,0 +1,4 @@ +- message: Found a goto() call with a url that isn't prefixed with the base path. + line: 4 + column: 18 + suggestions: null diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/goto-namespace-import01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/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-base/invalid/goto-namespace-import01-input.svelte @@ -0,0 +1,5 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/goto-no-base01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/goto-no-base01-errors.yaml new file mode 100644 index 000000000..ed8b9578e --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/goto-no-base01-errors.yaml @@ -0,0 +1,8 @@ +- message: Found a goto() call with a url that isn't prefixed with the base path. + line: 6 + column: 7 + suggestions: null +- message: Found a goto() call with a url that isn't prefixed with the base path. + line: 7 + column: 7 + suggestions: null diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/goto-no-base01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/goto-no-base01-input.svelte new file mode 100644 index 000000000..7cb58ea20 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/goto-no-base01-input.svelte @@ -0,0 +1,8 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/link-base-not-as-prefix01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/link-base-not-as-prefix01-errors.yaml new file mode 100644 index 000000000..087b29b87 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/link-base-not-as-prefix01-errors.yaml @@ -0,0 +1,8 @@ +- message: Found a link with a url that isn't prefixed with the base path. + line: 5 + column: 9 + suggestions: null +- message: Found a link with a url that isn't prefixed with the base path. + line: 6 + column: 9 + suggestions: null diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/link-base-not-as-prefix01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/link-base-not-as-prefix01-input.svelte new file mode 100644 index 000000000..6244c012c --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/link-base-not-as-prefix01-input.svelte @@ -0,0 +1,6 @@ + + +Click me! +Click me! diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/link-no-base01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/link-no-base01-errors.yaml new file mode 100644 index 000000000..e006d4d27 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/link-no-base01-errors.yaml @@ -0,0 +1,16 @@ +- message: Found a link with a url that isn't prefixed with the base path. + line: 4 + column: 10 + suggestions: null +- message: Found a link with a url that isn't prefixed with the base path. + line: 5 + column: 9 + suggestions: null +- message: Found a link with a url that isn't prefixed with the base path. + line: 6 + column: 9 + suggestions: null +- message: Found a link with a url that isn't prefixed with the base path. + line: 7 + column: 9 + suggestions: null diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/link-no-base01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/link-no-base01-input.svelte new file mode 100644 index 000000000..0e0f6df25 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/link-no-base01-input.svelte @@ -0,0 +1,7 @@ + +Click me! +Click me! +Click me! +Click me! diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/pushState-aliased01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/pushState-aliased01-errors.yaml new file mode 100644 index 000000000..52bd762b5 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/pushState-aliased01-errors.yaml @@ -0,0 +1,4 @@ +- message: Found a pushState() call with a url that isn't prefixed with the base path. + line: 4 + column: 8 + suggestions: null diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/pushState-aliased01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/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-base/invalid/pushState-aliased01-input.svelte @@ -0,0 +1,5 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/pushState-base-not-as-prefix01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/pushState-base-not-as-prefix01-errors.yaml new file mode 100644 index 000000000..5fc5eff37 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/pushState-base-not-as-prefix01-errors.yaml @@ -0,0 +1,8 @@ +- message: Found a pushState() call with a url that isn't prefixed with the base path. + line: 5 + column: 12 + suggestions: null +- message: Found a pushState() call with a url that isn't prefixed with the base path. + line: 6 + column: 12 + suggestions: null diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/pushState-base-not-as-prefix01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/pushState-base-not-as-prefix01-input.svelte new file mode 100644 index 000000000..cf7aacafa --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/pushState-base-not-as-prefix01-input.svelte @@ -0,0 +1,7 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/pushState-namespace-import01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/pushState-namespace-import01-errors.yaml new file mode 100644 index 000000000..2de0e9fc5 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/pushState-namespace-import01-errors.yaml @@ -0,0 +1,4 @@ +- message: Found a pushState() call with a url that isn't prefixed with the base path. + line: 4 + column: 23 + suggestions: null diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/pushState-namespace-import01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/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-base/invalid/pushState-namespace-import01-input.svelte @@ -0,0 +1,5 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/pushState-no-base01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/pushState-no-base01-errors.yaml new file mode 100644 index 000000000..e70710ad0 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/pushState-no-base01-errors.yaml @@ -0,0 +1,8 @@ +- message: Found a pushState() call with a url that isn't prefixed with the base path. + line: 6 + column: 12 + suggestions: null +- message: Found a pushState() call with a url that isn't prefixed with the base path. + line: 7 + column: 12 + suggestions: null diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/pushState-no-base01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/pushState-no-base01-input.svelte new file mode 100644 index 000000000..19fe76cf3 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/pushState-no-base01-input.svelte @@ -0,0 +1,8 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/replaceState-aliased01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/replaceState-aliased01-errors.yaml new file mode 100644 index 000000000..5e60d7000 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/replaceState-aliased01-errors.yaml @@ -0,0 +1,5 @@ +- message: Found a replaceState() call with a url that isn't prefixed with the + base path. + line: 4 + column: 8 + suggestions: null diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/replaceState-aliased01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/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-base/invalid/replaceState-aliased01-input.svelte @@ -0,0 +1,5 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/replaceState-base-not-as-prefix01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/replaceState-base-not-as-prefix01-errors.yaml new file mode 100644 index 000000000..b8fbf0d99 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/replaceState-base-not-as-prefix01-errors.yaml @@ -0,0 +1,10 @@ +- message: Found a replaceState() call with a url that isn't prefixed with the + base path. + line: 5 + column: 15 + suggestions: null +- message: Found a replaceState() call with a url that isn't prefixed with the + base path. + line: 6 + column: 15 + suggestions: null diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/replaceState-base-not-as-prefix01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/replaceState-base-not-as-prefix01-input.svelte new file mode 100644 index 000000000..0dd57d44a --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/replaceState-base-not-as-prefix01-input.svelte @@ -0,0 +1,7 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/replaceState-namespace-import01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/replaceState-namespace-import01-errors.yaml new file mode 100644 index 000000000..39e0e1c85 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/replaceState-namespace-import01-errors.yaml @@ -0,0 +1,5 @@ +- message: Found a replaceState() call with a url that isn't prefixed with the + base path. + line: 4 + column: 26 + suggestions: null diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/replaceState-namespace-import01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/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-base/invalid/replaceState-namespace-import01-input.svelte @@ -0,0 +1,5 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/replaceState-no-base01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/replaceState-no-base01-errors.yaml new file mode 100644 index 000000000..dd4d0d177 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/replaceState-no-base01-errors.yaml @@ -0,0 +1,10 @@ +- message: Found a replaceState() call with a url that isn't prefixed with the + base path. + line: 6 + column: 15 + suggestions: null +- message: Found a replaceState() call with a url that isn't prefixed with the + base path. + line: 7 + column: 15 + suggestions: null diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/replaceState-no-base01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/replaceState-no-base01-input.svelte new file mode 100644 index 000000000..4738c2ccb --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/replaceState-no-base01-input.svelte @@ -0,0 +1,8 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/goto-base-aliased01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/goto-base-aliased01-input.svelte new file mode 100644 index 000000000..b11e55f92 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/goto-base-aliased01-input.svelte @@ -0,0 +1,8 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/goto-base-namespace-import01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/goto-base-namespace-import01-input.svelte new file mode 100644 index 000000000..150ad1f06 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/goto-base-namespace-import01-input.svelte @@ -0,0 +1,8 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/goto-base-prefixed01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/goto-base-prefixed01-input.svelte new file mode 100644 index 000000000..22602dfc8 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/goto-base-prefixed01-input.svelte @@ -0,0 +1,13 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/ignoreGoto/_config.json b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/ignoreGoto/_config.json new file mode 100644 index 000000000..f21168640 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/ignoreGoto/_config.json @@ -0,0 +1,7 @@ +{ + "options": [ + { + "ignoreGoto": true + } + ] +} diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/ignoreGoto/goto-ignored01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/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-base/valid/ignoreGoto/goto-ignored01-input.svelte @@ -0,0 +1,5 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/ignoreLinks/_config.json b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/ignoreLinks/_config.json new file mode 100644 index 000000000..fd03211ab --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/ignoreLinks/_config.json @@ -0,0 +1,7 @@ +{ + "options": [ + { + "ignoreLinks": true + } + ] +} diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/ignoreLinks/link-ignored01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/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-base/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-base/valid/ignorePushState/_config.json b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/ignorePushState/_config.json new file mode 100644 index 000000000..7fbdd8b77 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/ignorePushState/_config.json @@ -0,0 +1,7 @@ +{ + "options": [ + { + "ignorePushState": true + } + ] +} diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/ignorePushState/pushState-ignored01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/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-base/valid/ignorePushState/pushState-ignored01-input.svelte @@ -0,0 +1,5 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/ignoreReplaceState/_config.json b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/ignoreReplaceState/_config.json new file mode 100644 index 000000000..a678a15a8 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/ignoreReplaceState/_config.json @@ -0,0 +1,7 @@ +{ + "options": [ + { + "ignoreReplaceState": true + } + ] +} diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/ignoreReplaceState/replaceState-ignored01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/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-base/valid/ignoreReplaceState/replaceState-ignored01-input.svelte @@ -0,0 +1,5 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/link-absolute-url01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/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-base/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-base/valid/link-base-aliased01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/link-base-aliased01-input.svelte new file mode 100644 index 000000000..fe192e12f --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/link-base-aliased01-input.svelte @@ -0,0 +1,6 @@ + + +Click me!; +Click me!; diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/link-base-namespace-import01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/link-base-namespace-import01-input.svelte new file mode 100644 index 000000000..1d0630115 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/link-base-namespace-import01-input.svelte @@ -0,0 +1,6 @@ + + +Click me!; +Click me!; diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/link-base-prefixed01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/link-base-prefixed01-input.svelte new file mode 100644 index 000000000..b86295824 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/link-base-prefixed01-input.svelte @@ -0,0 +1,11 @@ + + +Click me! +Click me! +Click me! +Click me! diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/pushState-base-aliased01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/pushState-base-aliased01-input.svelte new file mode 100644 index 000000000..ca77f79a4 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/pushState-base-aliased01-input.svelte @@ -0,0 +1,8 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/pushState-base-namespace-import01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/pushState-base-namespace-import01-input.svelte new file mode 100644 index 000000000..408416c2e --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/pushState-base-namespace-import01-input.svelte @@ -0,0 +1,8 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/pushState-base-prefixed01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/pushState-base-prefixed01-input.svelte new file mode 100644 index 000000000..468201793 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/pushState-base-prefixed01-input.svelte @@ -0,0 +1,13 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/pushState-empty-url01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/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-base/valid/pushState-empty-url01-input.svelte @@ -0,0 +1,6 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/replaceState-base-aliased01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/replaceState-base-aliased01-input.svelte new file mode 100644 index 000000000..ad91c1585 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/replaceState-base-aliased01-input.svelte @@ -0,0 +1,8 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/replaceState-base-namespace-import01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/replaceState-base-namespace-import01-input.svelte new file mode 100644 index 000000000..5b955153c --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/replaceState-base-namespace-import01-input.svelte @@ -0,0 +1,8 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/replaceState-base-prefixed01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/replaceState-base-prefixed01-input.svelte new file mode 100644 index 000000000..7df67a5d5 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/replaceState-base-prefixed01-input.svelte @@ -0,0 +1,13 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/replaceState-empty-url01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/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-base/valid/replaceState-empty-url01-input.svelte @@ -0,0 +1,6 @@ + diff --git a/packages/eslint-plugin-svelte/tests/src/rules/no-navigation-without-base.ts b/packages/eslint-plugin-svelte/tests/src/rules/no-navigation-without-base.ts new file mode 100644 index 000000000..6b00e4d6a --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/src/rules/no-navigation-without-base.ts @@ -0,0 +1,12 @@ +import { RuleTester } from '../../utils/eslint-compat'; +import rule from '../../../src/rules/no-navigation-without-base'; +import { loadTestCases } from '../../utils/utils'; + +const tester = new RuleTester({ + languageOptions: { + ecmaVersion: 2020, + sourceType: 'module' + } +}); + +tester.run('no-navigation-without-base', rule as any, loadTestCases('no-navigation-without-base'));