mirror of
https://github.com/gravitational/teleport.git
synced 2026-10-11 22:49:54 +00:00
952 lines
42 KiB
JSON
952 lines
42 KiB
JSON
{
|
|
"$schema": "./node_modules/oxlint/configuration_schema.json",
|
|
"plugins": ["typescript", "react", "jest", "import"],
|
|
"jsPlugins": [
|
|
"./web/scripts/oxlint/allowunused-todo.mjs",
|
|
"eslint-plugin-unused-imports",
|
|
"eslint-plugin-storybook",
|
|
"eslint-plugin-testing-library",
|
|
"eslint-plugin-jest-dom"
|
|
],
|
|
"categories": {
|
|
"correctness": "off"
|
|
},
|
|
"env": {
|
|
"builtin": true,
|
|
"es6": true,
|
|
"browser": true,
|
|
"node": true
|
|
},
|
|
"ignorePatterns": [
|
|
"**/dist/**",
|
|
"**/*_pb.*",
|
|
"**/tshd/**/*_pb.js",
|
|
"**/ironrdp/pkg/**",
|
|
"web/packages/teleterm/build",
|
|
"web/.storybook/public/mockServiceWorker.js"
|
|
],
|
|
"globals": {
|
|
"expect": "readonly",
|
|
"jest": "readonly"
|
|
},
|
|
"rules": {
|
|
"teleport/allowunused-todo": "error",
|
|
"constructor-super": "error",
|
|
"for-direction": "error",
|
|
"no-async-promise-executor": "error",
|
|
"no-class-assign": "error",
|
|
"no-compare-neg-zero": "error",
|
|
"no-cond-assign": "error",
|
|
"no-const-assign": "error",
|
|
"no-constant-binary-expression": "error",
|
|
"no-constant-condition": "error",
|
|
"no-control-regex": "error",
|
|
"no-debugger": "error",
|
|
"no-delete-var": "error",
|
|
"no-dupe-class-members": "error",
|
|
"no-dupe-else-if": "error",
|
|
"no-dupe-keys": "error",
|
|
"no-duplicate-case": "error",
|
|
"no-empty": "error",
|
|
"no-empty-character-class": "error",
|
|
"no-empty-pattern": "error",
|
|
"no-empty-static-block": "error",
|
|
"no-ex-assign": "error",
|
|
"no-extra-boolean-cast": "error",
|
|
"no-fallthrough": "error",
|
|
"no-func-assign": "error",
|
|
"no-global-assign": "error",
|
|
"no-import-assign": "error",
|
|
"no-invalid-regexp": "error",
|
|
"no-irregular-whitespace": "error",
|
|
"no-loss-of-precision": "error",
|
|
"no-misleading-character-class": "error",
|
|
"no-new-native-nonconstructor": "error",
|
|
"no-nonoctal-decimal-escape": "error",
|
|
"no-obj-calls": "error",
|
|
"no-prototype-builtins": "error",
|
|
"no-redeclare": "error",
|
|
"no-regex-spaces": "error",
|
|
"no-self-assign": "error",
|
|
"no-setter-return": "error",
|
|
"no-shadow-restricted-names": "error",
|
|
"no-sparse-arrays": "error",
|
|
"no-this-before-super": "error",
|
|
"no-unexpected-multiline": "error",
|
|
"no-unsafe-finally": "error",
|
|
"no-unsafe-negation": "error",
|
|
"no-unsafe-optional-chaining": "error",
|
|
"no-unused-labels": "error",
|
|
"no-unused-private-class-members": "error",
|
|
"no-useless-backreference": "error",
|
|
"no-useless-catch": "error",
|
|
"no-useless-escape": "error",
|
|
"no-with": "error",
|
|
"require-yield": "error",
|
|
"use-isnan": "error",
|
|
"valid-typeof": "error",
|
|
"no-case-declarations": "off",
|
|
"prefer-const": "off",
|
|
"no-var": "off",
|
|
"prefer-rest-params": "off",
|
|
"no-console": "warn",
|
|
|
|
"@typescript-eslint/ban-ts-comment": "error",
|
|
"no-array-constructor": "error",
|
|
"@typescript-eslint/no-duplicate-enum-values": "error",
|
|
// with-single-extends is needed to allow for interface extends like we have in jest.d.ts.
|
|
"@typescript-eslint/no-empty-object-type": [
|
|
"error",
|
|
{ "allowInterfaces": "with-single-extends" }
|
|
],
|
|
"@typescript-eslint/no-extra-non-null-assertion": "error",
|
|
"@typescript-eslint/no-misused-new": "error",
|
|
"@typescript-eslint/no-namespace": "error",
|
|
"@typescript-eslint/no-non-null-asserted-optional-chain": "error",
|
|
"@typescript-eslint/no-require-imports": "error",
|
|
"@typescript-eslint/no-unnecessary-type-constraint": "error",
|
|
"@typescript-eslint/no-unsafe-declaration-merging": "error",
|
|
"@typescript-eslint/no-unsafe-function-type": "error",
|
|
"no-unused-expressions": [
|
|
"error",
|
|
{
|
|
"allowShortCircuit": true,
|
|
"allowTernary": true,
|
|
"enforceForJSX": true
|
|
}
|
|
],
|
|
"@typescript-eslint/no-wrapper-object-types": "error",
|
|
"@typescript-eslint/prefer-as-const": "error",
|
|
"@typescript-eslint/prefer-namespace-keyword": "error",
|
|
"@typescript-eslint/triple-slash-reference": "error",
|
|
// TODO: Enable these recommended typescript-eslint rules after fixing existing issues.
|
|
"@typescript-eslint/no-explicit-any": "off",
|
|
"@typescript-eslint/no-this-alias": "off",
|
|
"unused-imports/no-unused-imports": "error",
|
|
"no-unused-vars": [
|
|
"error",
|
|
{
|
|
"args": "after-used",
|
|
"ignoreRestSiblings": true,
|
|
"varsIgnorePattern": "^_",
|
|
"argsIgnorePattern": "^_"
|
|
}
|
|
],
|
|
|
|
"react/jsx-key": "warn",
|
|
"react/jsx-no-comment-textnodes": "error",
|
|
"react/jsx-no-duplicate-props": "error",
|
|
"react/jsx-no-target-blank": "warn",
|
|
"react/jsx-no-undef": "error",
|
|
"react/jsx-pascal-case": "error",
|
|
"react/no-children-prop": "warn",
|
|
"react/no-danger": "error",
|
|
"react/no-danger-with-children": "error",
|
|
"react/no-direct-mutation-state": "error",
|
|
"react/no-find-dom-node": "error",
|
|
"react/no-is-mounted": "error",
|
|
"react/no-render-return-value": "error",
|
|
"react/no-string-refs": "error",
|
|
"react/no-unescaped-entities": "warn",
|
|
"react/no-unknown-property": "warn",
|
|
"react/no-did-mount-set-state": "warn",
|
|
// allowExpressions allows single expressions in a fragment eg: <>{children}</>
|
|
// https://oxc.rs/docs/guide/usage/linter/rules/react/jsx-no-useless-fragment.html#allowexpressions
|
|
"react/jsx-no-useless-fragment": ["error", { "allowExpressions": true }],
|
|
"react/display-name": "off",
|
|
|
|
"react-hooks/rules-of-hooks": "warn",
|
|
"react-hooks/exhaustive-deps": "warn",
|
|
|
|
"preserve-caught-error": "error"
|
|
},
|
|
"overrides": [
|
|
{
|
|
"files": ["web/packages/teleterm/**"],
|
|
"rules": {
|
|
"no-console": "off",
|
|
}
|
|
},
|
|
{
|
|
"files": ["**/*.ts", "**/*.tsx", "**/*.mts", "**/*.cts"],
|
|
"rules": {
|
|
"constructor-super": "off",
|
|
"no-class-assign": "off",
|
|
"no-const-assign": "off",
|
|
"no-dupe-class-members": "off",
|
|
"no-dupe-keys": "off",
|
|
"no-func-assign": "off",
|
|
"no-import-assign": "off",
|
|
"no-new-native-nonconstructor": "off",
|
|
"no-obj-calls": "off",
|
|
"no-redeclare": "off",
|
|
"no-setter-return": "off",
|
|
"no-this-before-super": "off",
|
|
"no-unsafe-negation": "off",
|
|
"no-with": "off",
|
|
"prefer-spread": "error"
|
|
}
|
|
},
|
|
{
|
|
"files": ["**/*.test.{ts,tsx,js,jsx}"],
|
|
"plugins": ["jest"],
|
|
"env": { "jest": true },
|
|
"rules": {
|
|
"jest/expect-expect": "warn",
|
|
"jest/no-alias-methods": "error",
|
|
"jest/no-commented-out-tests": "warn",
|
|
"jest/no-conditional-expect": "error",
|
|
"jest/no-deprecated-functions": "error",
|
|
"jest/no-disabled-tests": "off",
|
|
"jest/no-done-callback": "error",
|
|
"jest/no-export": "error",
|
|
"jest/no-focused-tests": "error",
|
|
"jest/no-identical-title": "error",
|
|
"jest/no-interpolation-in-snapshots": "error",
|
|
"jest/no-jasmine-globals": "error",
|
|
"jest/no-mocks-import": "error",
|
|
"jest/no-standalone-expect": "error",
|
|
"jest/no-test-prefixes": "error",
|
|
"jest/valid-describe-callback": "error",
|
|
"jest/valid-expect": "error",
|
|
"jest/valid-title": "error",
|
|
"jest/no-large-snapshots": ["warn", { "maxSize": 200 }],
|
|
|
|
"testing-library/await-async-events": [
|
|
"error",
|
|
{ "eventModule": "userEvent" }
|
|
],
|
|
"testing-library/await-async-queries": "error",
|
|
"testing-library/await-async-utils": "error",
|
|
"testing-library/no-await-sync-events": [
|
|
"error",
|
|
{ "eventModules": ["fire-event"] }
|
|
],
|
|
"testing-library/no-await-sync-queries": "error",
|
|
"testing-library/no-container": "error",
|
|
"testing-library/no-debugging-utils": "warn",
|
|
"testing-library/no-dom-import": ["error", "react"],
|
|
"testing-library/no-global-regexp-flag-in-query": "error",
|
|
"testing-library/no-manual-cleanup": "error",
|
|
"testing-library/no-node-access": "error",
|
|
"testing-library/no-promise-in-fire-event": "error",
|
|
"testing-library/no-render-in-lifecycle": "error",
|
|
"testing-library/no-unnecessary-act": "error",
|
|
"testing-library/no-wait-for-multiple-assertions": "error",
|
|
"testing-library/no-wait-for-side-effects": "error",
|
|
"testing-library/no-wait-for-snapshot": "error",
|
|
"testing-library/prefer-find-by": "error",
|
|
"testing-library/prefer-presence-queries": "error",
|
|
"testing-library/prefer-query-by-disappearance": "error",
|
|
"testing-library/prefer-screen-queries": "error",
|
|
"testing-library/render-result-naming-convention": "error",
|
|
|
|
"jest-dom/prefer-checked": "error",
|
|
"jest-dom/prefer-empty": "error",
|
|
"jest-dom/prefer-enabled-disabled": "error",
|
|
"jest-dom/prefer-focus": "error",
|
|
"jest-dom/prefer-in-document": "error",
|
|
"jest-dom/prefer-required": "error",
|
|
"jest-dom/prefer-to-have-attribute": "error",
|
|
"jest-dom/prefer-to-have-class": "error",
|
|
"jest-dom/prefer-to-have-style": "error",
|
|
"jest-dom/prefer-to-have-text-content": "error",
|
|
"jest-dom/prefer-to-have-value": "error"
|
|
}
|
|
},
|
|
{
|
|
"files": ["**/*.vitest.{ts,tsx}"],
|
|
"plugins": ["vitest"],
|
|
"rules": {
|
|
"vitest/expect-expect": "warn",
|
|
"vitest/no-alias-methods": "error",
|
|
"vitest/no-commented-out-tests": "warn",
|
|
"vitest/no-conditional-expect": "error",
|
|
"vitest/no-conditional-tests": "error",
|
|
"vitest/no-focused-tests": "error",
|
|
"vitest/no-identical-title": "error",
|
|
"vitest/no-interpolation-in-snapshots": "error",
|
|
"vitest/no-mocks-import": "error",
|
|
"vitest/no-standalone-expect": "error",
|
|
"vitest/no-test-prefixes": "error",
|
|
"vitest/prefer-importing-vitest-globals": "error",
|
|
"vitest/valid-describe-callback": "error",
|
|
"vitest/valid-expect": "error",
|
|
"vitest/valid-expect-in-promise": "error",
|
|
"vitest/valid-title": "error",
|
|
"vitest/no-large-snapshots": ["warn", { "maxSize": 200 }],
|
|
|
|
"vitest/prefer-comparison-matcher": "error",
|
|
"vitest/prefer-each": "error",
|
|
"vitest/prefer-expect-type-of": "error",
|
|
"vitest/prefer-hooks-in-order": "error",
|
|
"vitest/prefer-hooks-on-top": "error",
|
|
"vitest/prefer-mock-promise-shorthand": "error",
|
|
"vitest/prefer-to-be": "error",
|
|
"vitest/prefer-to-be-object": "error",
|
|
"vitest/prefer-to-contain": "error",
|
|
"vitest/prefer-to-have-length": "error",
|
|
"vitest/prefer-todo": "error",
|
|
|
|
"testing-library/await-async-events": [
|
|
"error",
|
|
{ "eventModule": "userEvent" }
|
|
],
|
|
"testing-library/await-async-queries": "error",
|
|
"testing-library/await-async-utils": "error",
|
|
"testing-library/no-await-sync-events": [
|
|
"error",
|
|
{ "eventModules": ["fire-event"] }
|
|
],
|
|
"testing-library/no-await-sync-queries": "error",
|
|
"testing-library/no-container": "error",
|
|
"testing-library/no-debugging-utils": "warn",
|
|
"testing-library/no-dom-import": ["error", "react"],
|
|
"testing-library/no-global-regexp-flag-in-query": "error",
|
|
"testing-library/no-manual-cleanup": "error",
|
|
"testing-library/no-node-access": "error",
|
|
"testing-library/no-promise-in-fire-event": "error",
|
|
"testing-library/no-render-in-lifecycle": "error",
|
|
"testing-library/no-unnecessary-act": "error",
|
|
"testing-library/no-wait-for-multiple-assertions": "error",
|
|
"testing-library/no-wait-for-side-effects": "error",
|
|
"testing-library/no-wait-for-snapshot": "error",
|
|
"testing-library/prefer-find-by": "error",
|
|
"testing-library/prefer-presence-queries": "error",
|
|
"testing-library/prefer-query-by-disappearance": "error",
|
|
"testing-library/prefer-screen-queries": "error",
|
|
"testing-library/render-result-naming-convention": "error",
|
|
|
|
"jest-dom/prefer-checked": "error",
|
|
"jest-dom/prefer-empty": "error",
|
|
"jest-dom/prefer-enabled-disabled": "error",
|
|
"jest-dom/prefer-focus": "error",
|
|
"jest-dom/prefer-in-document": "error",
|
|
"jest-dom/prefer-required": "error",
|
|
"jest-dom/prefer-to-have-attribute": "error",
|
|
"jest-dom/prefer-to-have-class": "error",
|
|
"jest-dom/prefer-to-have-style": "error",
|
|
"jest-dom/prefer-to-have-text-content": "error",
|
|
"jest-dom/prefer-to-have-value": "error"
|
|
}
|
|
},
|
|
{
|
|
"files": [
|
|
"**/*.stories.@(ts|tsx|js|jsx|mjs|cjs)",
|
|
"**/*.story.@(ts|tsx|js|jsx|mjs|cjs)"
|
|
],
|
|
"rules": {
|
|
"react-hooks/rules-of-hooks": "off",
|
|
"storybook/await-interactions": "error",
|
|
"storybook/context-in-play-function": "error",
|
|
"storybook/default-exports": "error",
|
|
"storybook/hierarchy-separator": "warn",
|
|
"storybook/no-redundant-story-name": "warn",
|
|
"storybook/no-renderer-packages": "error",
|
|
"storybook/prefer-pascal-case": "warn",
|
|
"storybook/story-exports": "error",
|
|
"storybook/use-storybook-expect": "error",
|
|
"storybook/use-storybook-testing-library": "error"
|
|
}
|
|
},
|
|
{
|
|
"files": [".storybook/main.@(js|cjs|mjs|ts)"],
|
|
"rules": {
|
|
"storybook/no-uninstalled-addons": "error"
|
|
}
|
|
},
|
|
// Allow require imports in .js files, as migrating our project to ESM modules requires a lot
|
|
// of changes.
|
|
{
|
|
"files": ["**/*.js"],
|
|
"rules": {
|
|
"@typescript-eslint/no-require-imports": "warn"
|
|
}
|
|
},
|
|
// Restricted imports
|
|
//
|
|
// If an import is caught by these rules, it means that the imported package needs to be moved
|
|
// elsewhere in the dependency tree.
|
|
// https://github.com/gravitational/teleport/issues/54872
|
|
{
|
|
"files": ["web/packages/shared/**/*.{ts,tsx,js,jsx}"],
|
|
"rules": {
|
|
"no-restricted-imports": [
|
|
"error",
|
|
{
|
|
"paths": [
|
|
{
|
|
"name": "usehooks-ts",
|
|
"importNames": ["useResizeObserver"],
|
|
"message": "Use 'useResizeObserver' from 'design/utils/useResizeObserver' instead."
|
|
},
|
|
{
|
|
"name": "usehooks-ts",
|
|
"importNames": ["useCopyToClipboard"],
|
|
"message": "Use 'copyToClipboard' from 'design/utils/copyToClipboard' instead."
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"files": ["web/packages/shared/**/*.{ts,tsx,js,jsx}"],
|
|
"rules": {
|
|
"no-restricted-imports": [
|
|
"error",
|
|
{
|
|
"patterns": [
|
|
{ "group": ["teleport/**", "e-teleport/**", "teleterm/**"] }
|
|
],
|
|
"paths": [
|
|
{
|
|
"name": "shared/hooks/useAsync",
|
|
"importNames": ["useAsync"],
|
|
"message": "useAsync is deprecated; use TanStack Query (useQuery/useMutation) instead. See RFD 197."
|
|
},
|
|
{
|
|
"name": "shared/hooks/useAttempt",
|
|
"importNames": ["default"],
|
|
"message": "useAttempt is deprecated; use TanStack Query (useQuery/useMutation) instead. See RFD 197."
|
|
},
|
|
{
|
|
"name": "shared/hooks/useAttemptNext",
|
|
"importNames": ["default"],
|
|
"message": "useAttemptNext is deprecated; use TanStack Query (useQuery/useMutation) instead. See RFD 197."
|
|
},
|
|
{
|
|
"name": "shared/hooks",
|
|
"importNames": ["useAttempt", "useAttemptNext"],
|
|
"message": "useAttempt/useAttemptNext are deprecated; use TanStack Query (useQuery/useMutation) instead. See RFD 197."
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"files": ["web/packages/teleport/**/*.{ts,tsx,js,jsx}"],
|
|
"rules": {
|
|
"no-restricted-imports": [
|
|
"error",
|
|
{
|
|
"patterns": [{ "group": ["e-teleport/**", "teleterm/**"] }],
|
|
"paths": [
|
|
{
|
|
"name": "usehooks-ts",
|
|
"importNames": ["useResizeObserver"],
|
|
"message": "Use 'useResizeObserver' from 'design/utils/useResizeObserver' instead."
|
|
},
|
|
{
|
|
"name": "usehooks-ts",
|
|
"importNames": ["useCopyToClipboard"],
|
|
"message": "Use 'copyToClipboard' from 'design/utils/copyToClipboard' instead."
|
|
},
|
|
{
|
|
"name": "shared/hooks/useAsync",
|
|
"importNames": ["useAsync"],
|
|
"message": "useAsync is deprecated; use TanStack Query (useQuery/useMutation) instead. See RFD 197."
|
|
},
|
|
{
|
|
"name": "shared/hooks/useAttempt",
|
|
"importNames": ["default"],
|
|
"message": "useAttempt is deprecated; use TanStack Query (useQuery/useMutation) instead. See RFD 197."
|
|
},
|
|
{
|
|
"name": "shared/hooks/useAttemptNext",
|
|
"importNames": ["default"],
|
|
"message": "useAttemptNext is deprecated; use TanStack Query (useQuery/useMutation) instead. See RFD 197."
|
|
},
|
|
{
|
|
"name": "shared/hooks",
|
|
"importNames": ["useAttempt", "useAttemptNext"],
|
|
"message": "useAttempt/useAttemptNext are deprecated; use TanStack Query (useQuery/useMutation) instead. See RFD 197."
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"files": ["e/web/teleport/**/*.{ts,tsx,js,jsx}"],
|
|
"rules": {
|
|
"no-restricted-imports": [
|
|
"error",
|
|
{
|
|
"patterns": [{ "group": ["teleterm/**"] }],
|
|
"paths": [
|
|
{
|
|
"name": "usehooks-ts",
|
|
"importNames": ["useResizeObserver"],
|
|
"message": "Use 'useResizeObserver' from 'design/utils/useResizeObserver' instead."
|
|
},
|
|
{
|
|
"name": "usehooks-ts",
|
|
"importNames": ["useCopyToClipboard"],
|
|
"message": "Use 'copyToClipboard' from 'design/utils/copyToClipboard' instead."
|
|
},
|
|
{
|
|
"name": "shared/hooks/useAsync",
|
|
"importNames": ["useAsync"],
|
|
"message": "useAsync is deprecated; use TanStack Query (useQuery/useMutation) instead. See RFD 197."
|
|
},
|
|
{
|
|
"name": "shared/hooks/useAttempt",
|
|
"importNames": ["default"],
|
|
"message": "useAttempt is deprecated; use TanStack Query (useQuery/useMutation) instead. See RFD 197."
|
|
},
|
|
{
|
|
"name": "shared/hooks/useAttemptNext",
|
|
"importNames": ["default"],
|
|
"message": "useAttemptNext is deprecated; use TanStack Query (useQuery/useMutation) instead. See RFD 197."
|
|
},
|
|
{
|
|
"name": "shared/hooks",
|
|
"importNames": ["useAttempt", "useAttemptNext"],
|
|
"message": "useAttempt/useAttemptNext are deprecated; use TanStack Query (useQuery/useMutation) instead. See RFD 197."
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"files": ["web/packages/teleterm/**/*.{ts,tsx,js,jsx}"],
|
|
"rules": {
|
|
"no-restricted-imports": [
|
|
"error",
|
|
{
|
|
"patterns": [{ "group": ["teleport/**", "e-teleport/**"] }],
|
|
"paths": [
|
|
{
|
|
"name": "usehooks-ts",
|
|
"importNames": ["useResizeObserver"],
|
|
"message": "Use 'useResizeObserver' from 'design/utils/useResizeObserver' instead."
|
|
},
|
|
{
|
|
"name": "usehooks-ts",
|
|
"importNames": ["useCopyToClipboard"],
|
|
"message": "Use 'copyToClipboard' from 'design/utils/copyToClipboard' instead."
|
|
},
|
|
{
|
|
"name": "shared/hooks/useAsync",
|
|
"importNames": ["useAsync"],
|
|
"message": "useAsync is deprecated; use TanStack Query (useQuery/useMutation) instead. See RFD 197."
|
|
},
|
|
{
|
|
"name": "shared/hooks/useAttempt",
|
|
"importNames": ["default"],
|
|
"message": "useAttempt is deprecated; use TanStack Query (useQuery/useMutation) instead. See RFD 197."
|
|
},
|
|
{
|
|
"name": "shared/hooks/useAttemptNext",
|
|
"importNames": ["default"],
|
|
"message": "useAttemptNext is deprecated; use TanStack Query (useQuery/useMutation) instead. See RFD 197."
|
|
},
|
|
{
|
|
"name": "shared/hooks",
|
|
"importNames": ["useAttempt", "useAttemptNext"],
|
|
"message": "useAttempt/useAttemptNext are deprecated; use TanStack Query (useQuery/useMutation) instead. See RFD 197."
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"files": [
|
|
"web/packages/design/**/*.{ts,tsx,js,jsx}",
|
|
"web/packages/build/**/*.{ts,tsx,js,jsx}"
|
|
],
|
|
"rules": {
|
|
"no-restricted-imports": [
|
|
"error",
|
|
{
|
|
"paths": [
|
|
{
|
|
"name": "usehooks-ts",
|
|
"importNames": ["useResizeObserver"],
|
|
"message": "Use 'useResizeObserver' from 'design/utils/useResizeObserver' instead."
|
|
},
|
|
{
|
|
"name": "usehooks-ts",
|
|
"importNames": ["useCopyToClipboard"],
|
|
"message": "Use 'copyToClipboard' from 'design/utils/copyToClipboard' instead."
|
|
},
|
|
{
|
|
"name": "shared/hooks/useAsync",
|
|
"importNames": ["useAsync"],
|
|
"message": "useAsync is deprecated; use TanStack Query (useQuery/useMutation) instead. See RFD 197."
|
|
},
|
|
{
|
|
"name": "shared/hooks/useAttempt",
|
|
"importNames": ["default"],
|
|
"message": "useAttempt is deprecated; use TanStack Query (useQuery/useMutation) instead. See RFD 197."
|
|
},
|
|
{
|
|
"name": "shared/hooks/useAttemptNext",
|
|
"importNames": ["default"],
|
|
"message": "useAttemptNext is deprecated; use TanStack Query (useQuery/useMutation) instead. See RFD 197."
|
|
},
|
|
{
|
|
"name": "shared/hooks",
|
|
"importNames": ["useAttempt", "useAttemptNext"],
|
|
"message": "useAttempt/useAttemptNext are deprecated; use TanStack Query (useQuery/useMutation) instead. See RFD 197."
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
},
|
|
/*
|
|
* E2E tests
|
|
*/
|
|
{
|
|
"files": ["e2e/**/*.ts", "e/e2e/**/*.ts"],
|
|
"rules": {
|
|
"react-hooks/rules-of-hooks": "off"
|
|
}
|
|
},
|
|
{
|
|
"files": ["e2e/tests/web/**/*.ts"],
|
|
"rules": {
|
|
"no-restricted-imports": [
|
|
"error",
|
|
{
|
|
"paths": [
|
|
{
|
|
"name": "@playwright/test",
|
|
"importNames": ["test", "expect"],
|
|
"message": "Import 'test' and 'expect' from '@gravitational/e2e/helpers/test' instead."
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"files": ["e2e/tests/connect/**/*.ts"],
|
|
"rules": {
|
|
"no-restricted-imports": [
|
|
"error",
|
|
{
|
|
"paths": [
|
|
{
|
|
"name": "@playwright/test",
|
|
"importNames": ["test", "expect"],
|
|
"message": "Import 'test' and 'expect' from '@gravitational/e2e/helpers/connect' instead."
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"files": ["e/e2e/tests/web/**/*.ts"],
|
|
"rules": {
|
|
"no-restricted-imports": [
|
|
"error",
|
|
{
|
|
"paths": [
|
|
{
|
|
"name": "@playwright/test",
|
|
"importNames": ["test", "expect"],
|
|
"message": "Import 'test' and 'expect' from '@gravitational/e-e2e/helpers/test' instead."
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"files": ["e/e2e/tests/connect/**/*.ts"],
|
|
"rules": {
|
|
"no-restricted-imports": [
|
|
"error",
|
|
{
|
|
"paths": [
|
|
{
|
|
"name": "@playwright/test",
|
|
"importNames": ["test", "expect"],
|
|
"message": "Import 'test' and 'expect' from '@gravitational/e-e2e/helpers/connect' instead."
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
},
|
|
// Legacy async state hook call sites (RFD 197). These files predate the ban added to
|
|
// the per-directory blocks above. Each one keeps its directory's cross-package import
|
|
// restrictions but is exempt from the new hook ban. As files migrate to TanStack Query,
|
|
// remove them from these lists. Because oxlint replaces (not merges) no-restricted-imports
|
|
// across overrides, these blocks come last so they win for the listed files.
|
|
//
|
|
// TODO(ravicious): Migrate these to a suppression file once it's available.
|
|
// https://github.com/oxc-project/oxc/issues/10549
|
|
{
|
|
"files": [
|
|
"web/packages/shared/components/DesktopSession/DesktopSession.tsx",
|
|
"web/packages/shared/components/FieldSelect/FieldSelect.tsx",
|
|
"web/packages/shared/components/FieldSelect/FieldSelectCreatable.tsx",
|
|
"web/packages/shared/components/MenuLogin/MenuLogin.tsx",
|
|
"web/packages/shared/components/UnifiedResources/UnifiedResources.tsx"
|
|
],
|
|
"rules": {
|
|
"no-restricted-imports": [
|
|
"error",
|
|
{
|
|
"patterns": [{ "group": ["teleport/**", "e-teleport/**", "teleterm/**"] }]
|
|
}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"files": [
|
|
"web/packages/teleport/src/Account/ChangePasswordWizard/ChangePasswordWizard.tsx",
|
|
"web/packages/teleport/src/Account/ManageDevices/useManageDevices.ts",
|
|
"web/packages/teleport/src/Account/ManageDevices/wizards/AddAuthDeviceWizard.tsx",
|
|
"web/packages/teleport/src/Account/ManageDevices/wizards/DeleteAuthDeviceWizard.tsx",
|
|
"web/packages/teleport/src/Account/Preferences.tsx",
|
|
"web/packages/teleport/src/AppLauncher/AppLauncher.tsx",
|
|
"web/packages/teleport/src/Apps/AddApp/useAddApp.ts",
|
|
"web/packages/teleport/src/AuthConnectors/AuthConnectorEditor/GitHubConnectorEditor.tsx",
|
|
"web/packages/teleport/src/AuthConnectors/AuthConnectors.tsx",
|
|
"web/packages/teleport/src/AuthConnectors/DeleteConnectorDialog/DeleteConnectorDialog.tsx",
|
|
"web/packages/teleport/src/Bots/Add/GitHubActionsSsh/ConfigureBot.tsx",
|
|
"web/packages/teleport/src/Bots/Add/GitHubActionsSsh/useGitHubSshFlow.tsx",
|
|
"web/packages/teleport/src/Bots/List/Bots.tsx",
|
|
"web/packages/teleport/src/BrowserMFA/BrowserMFA.tsx",
|
|
"web/packages/teleport/src/Clusters/Clusters.tsx",
|
|
"web/packages/teleport/src/Clusters/ManageCluster/ManageCluster.tsx",
|
|
"web/packages/teleport/src/components/Authenticated/Authenticated.tsx",
|
|
"web/packages/teleport/src/components/FormLogin/FormIdentifierFirst.tsx",
|
|
"web/packages/teleport/src/components/FormLogin/FormLogin.tsx",
|
|
"web/packages/teleport/src/components/hooks/useServersidePagination.ts",
|
|
"web/packages/teleport/src/components/MfaDeviceList/RemoveDialog/RemoveDialog.tsx",
|
|
"web/packages/teleport/src/components/ReAuthenticate/useReAuthenticate.ts",
|
|
"web/packages/teleport/src/components/ResourceEditor/ResourceEditor.jsx",
|
|
"web/packages/teleport/src/Console/Console.tsx",
|
|
"web/packages/teleport/src/Console/DocumentDb/ConnectDialog.tsx",
|
|
"web/packages/teleport/src/DesktopSession/DesktopSession.tsx",
|
|
"web/packages/teleport/src/Discover/AwsMangementConsole/CreateAppAccess/CreateAppAccess.tsx",
|
|
"web/packages/teleport/src/Discover/ConnectMyComputer/TestConnection/TestConnection.tsx",
|
|
"web/packages/teleport/src/Discover/Database/CreateDatabase/useCreateDatabase.ts",
|
|
"web/packages/teleport/src/Discover/Database/DeployService/AutoDeploy/AutoDeploy.tsx",
|
|
"web/packages/teleport/src/Discover/Database/DeployService/AutoDeploy/SelectSecurityGroups.tsx",
|
|
"web/packages/teleport/src/Discover/Database/DeployService/AutoDeploy/SelectSubnetIds.tsx",
|
|
"web/packages/teleport/src/Discover/Database/EnrollRdsDatabase/AutoEnrollment.tsx",
|
|
"web/packages/teleport/src/Discover/Database/EnrollRdsDatabase/EnrollRdsDatabase.tsx",
|
|
"web/packages/teleport/src/Discover/Database/IamPolicy/useIamPolicy.ts",
|
|
"web/packages/teleport/src/Discover/Database/MutualTls/useMutualTls.ts",
|
|
"web/packages/teleport/src/Discover/Kubernetes/EnrollEKSCluster/EnrollEksCluster.tsx",
|
|
"web/packages/teleport/src/Discover/SelectResource/SelectResource.tsx",
|
|
"web/packages/teleport/src/Discover/Server/DiscoveryConfigSsm/DiscoveryConfigSsm.tsx",
|
|
"web/packages/teleport/src/Discover/Shared/AwsAccount/AwsAccount.tsx",
|
|
"web/packages/teleport/src/Discover/Shared/ConfigureDiscoveryService/ConfigureDiscoveryService.tsx",
|
|
"web/packages/teleport/src/Discover/Shared/ConnectionDiagnostic/useConnectionDiagnostic.ts",
|
|
"web/packages/teleport/src/Discover/Shared/SetupAccess/useUserTraits.ts",
|
|
"web/packages/teleport/src/Integrations/DeleteAwsOidcIntegrationDialog.tsx",
|
|
"web/packages/teleport/src/Integrations/EditAwsOidcIntegrationDialog.tsx",
|
|
"web/packages/teleport/src/Integrations/Enroll/AwsOidc/useAwsOidcIntegration.tsx",
|
|
"web/packages/teleport/src/Integrations/IntegrationList.tsx",
|
|
"web/packages/teleport/src/Integrations/Integrations.tsx",
|
|
"web/packages/teleport/src/Integrations/RemoveIntegrationDialog.tsx",
|
|
"web/packages/teleport/src/Integrations/status/AwsOidc/Details/Agents.tsx",
|
|
"web/packages/teleport/src/Integrations/status/AwsOidc/Tasks/Task.tsx",
|
|
"web/packages/teleport/src/Integrations/status/AwsOidc/useAwsOidcStatus.tsx",
|
|
"web/packages/teleport/src/JoinTokens/JoinTokens.tsx",
|
|
"web/packages/teleport/src/JoinTokens/UpsertJoinTokenDialog.tsx",
|
|
"web/packages/teleport/src/lib/useMfa.ts",
|
|
"web/packages/teleport/src/LocksV2/Locks/DeleteLockDialogue.tsx",
|
|
"web/packages/teleport/src/LocksV2/Locks/Locks.tsx",
|
|
"web/packages/teleport/src/LocksV2/NewLock/LockCheckout/LockCheckout.tsx",
|
|
"web/packages/teleport/src/LocksV2/NewLock/NewLock.tsx",
|
|
"web/packages/teleport/src/Login/useLogin.ts",
|
|
"web/packages/teleport/src/Main/Main.tsx",
|
|
"web/packages/teleport/src/Notifications/Notification.tsx",
|
|
"web/packages/teleport/src/Recordings/useRecordings.ts",
|
|
"web/packages/teleport/src/Roles/DeleteRole/DeleteRole.tsx",
|
|
"web/packages/teleport/src/Roles/RoleEditor/RoleEditor.story.tsx",
|
|
"web/packages/teleport/src/Roles/RoleEditor/RoleEditor.tsx",
|
|
"web/packages/teleport/src/Roles/RoleEditor/RoleEditorAdapter.tsx",
|
|
"web/packages/teleport/src/Roles/RoleEditor/StandardEditor/MetadataSection.tsx",
|
|
"web/packages/teleport/src/Sessions/useSessions.ts",
|
|
"web/packages/teleport/src/TrustedClusters/DeleteTrust/DeleteTrust.tsx",
|
|
"web/packages/teleport/src/TrustedClusters/useTrustedClusters.ts",
|
|
"web/packages/teleport/src/User/UserContext.tsx",
|
|
"web/packages/teleport/src/Users/UserReset/UserReset.tsx",
|
|
"web/packages/teleport/src/Welcome/useToken.ts"
|
|
],
|
|
"rules": {
|
|
"no-restricted-imports": [
|
|
"error",
|
|
{
|
|
"patterns": [{ "group": ["e-teleport/**", "teleterm/**"] }],
|
|
"paths": [
|
|
{
|
|
"name": "usehooks-ts",
|
|
"importNames": ["useResizeObserver"],
|
|
"message": "Use 'useResizeObserver' from 'design/utils/useResizeObserver' instead."
|
|
},
|
|
{
|
|
"name": "usehooks-ts",
|
|
"importNames": ["useCopyToClipboard"],
|
|
"message": "Use 'copyToClipboard' from 'design/utils/copyToClipboard' instead."
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"files": [
|
|
"web/packages/teleterm/src/ui/AccessRequestCheckout/useAccessRequestCheckout.ts",
|
|
"web/packages/teleterm/src/ui/AccessRequests/AccessRequestsContext.tsx",
|
|
"web/packages/teleterm/src/ui/AccessRequests/SelectorMenu.tsx",
|
|
"web/packages/teleterm/src/ui/ClusterConnect/ClusterAdd/ClusterAdd.tsx",
|
|
"web/packages/teleterm/src/ui/ClusterConnect/ClusterLogin/useClusterLogin.ts",
|
|
"web/packages/teleterm/src/ui/ClusterLogout/ClusterLogout.tsx",
|
|
"web/packages/teleterm/src/ui/ConnectMyComputer/connectMyComputerContext.tsx",
|
|
"web/packages/teleterm/src/ui/ConnectMyComputer/DocumentConnectMyComputer/Setup.tsx",
|
|
"web/packages/teleterm/src/ui/DocumentAccessRequests/NewRequest/NewRequest.tsx",
|
|
"web/packages/teleterm/src/ui/DocumentAccessRequests/ReviewAccessRequest/useReviewAccessRequest.ts",
|
|
"web/packages/teleterm/src/ui/DocumentAccessRequests/useAssumeAccess.ts",
|
|
"web/packages/teleterm/src/ui/DocumentAuthorizeWebSession/DocumentAuthorizeWebSession.tsx",
|
|
"web/packages/teleterm/src/ui/DocumentCluster/DocumentCluster.tsx",
|
|
"web/packages/teleterm/src/ui/DocumentCluster/useUserPreferences.ts",
|
|
"web/packages/teleterm/src/ui/DocumentGateway/useGateway.ts",
|
|
"web/packages/teleterm/src/ui/DocumentGatewayApp/AppGateway.tsx",
|
|
"web/packages/teleterm/src/ui/DocumentGatewayKube/DocumentGatewayKube.tsx",
|
|
"web/packages/teleterm/src/ui/DocumentTerminal/useDocumentTerminal.ts",
|
|
"web/packages/teleterm/src/ui/HeadlessAuthn/HeadlessAuthentication.tsx",
|
|
"web/packages/teleterm/src/ui/Search/pickers/ParameterPicker.tsx",
|
|
"web/packages/teleterm/src/ui/Search/pickers/useActionAttempts.ts",
|
|
"web/packages/teleterm/src/ui/StatusBar/ShareFeedback/useShareFeedback.ts",
|
|
"web/packages/teleterm/src/ui/Vnet/ConfigureSSHClients.tsx",
|
|
"web/packages/teleterm/src/ui/Vnet/DocumentVnetDiagReport.tsx",
|
|
"web/packages/teleterm/src/ui/Vnet/vnetContext.tsx"
|
|
],
|
|
"rules": {
|
|
"no-restricted-imports": [
|
|
"error",
|
|
{
|
|
"patterns": [{ "group": ["teleport/**", "e-teleport/**"] }],
|
|
"paths": [
|
|
{
|
|
"name": "usehooks-ts",
|
|
"importNames": ["useResizeObserver"],
|
|
"message": "Use 'useResizeObserver' from 'design/utils/useResizeObserver' instead."
|
|
},
|
|
{
|
|
"name": "usehooks-ts",
|
|
"importNames": ["useCopyToClipboard"],
|
|
"message": "Use 'copyToClipboard' from 'design/utils/copyToClipboard' instead."
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"files": [
|
|
"e/web/teleport/src/AccessAutomations/AccessAutomations.tsx",
|
|
"e/web/teleport/src/AccessAutomations/RuleEditor/DeleteRuleDialogue.tsx",
|
|
"e/web/teleport/src/AccessAutomations/RuleEditor/RuleEditor.tsx",
|
|
"e/web/teleport/src/AccessListManagement/AccessListManagementContext.tsx",
|
|
"e/web/teleport/src/AccessListManagement/CreateAccessList/CreateAccessListContextProvider.tsx",
|
|
"e/web/teleport/src/AccessListManagement/CreateAccessList/GrantSection.tsx",
|
|
"e/web/teleport/src/AccessListManagement/GuideEditor/Preset/DefineIdentities/DefineIdentities.tsx",
|
|
"e/web/teleport/src/AccessListManagement/Shared/Shared.tsx",
|
|
"e/web/teleport/src/AccessListManagement/ViewEditAccessList/AuditAndReviews/EditAudit.tsx",
|
|
"e/web/teleport/src/AccessListManagement/ViewEditAccessList/DeleteAccessList/DeleteAccessListConfirmDialog.tsx",
|
|
"e/web/teleport/src/AccessListManagement/ViewEditAccessList/DeleteUserConfirmDialog.tsx",
|
|
"e/web/teleport/src/AccessListManagement/ViewEditAccessList/Members/EnrollNewMembers.tsx",
|
|
"e/web/teleport/src/AccessListManagement/ViewEditAccessList/Owners/EnrollNewOwners.tsx",
|
|
"e/web/teleport/src/AccessListManagement/ViewEditAccessList/ReviewAccessList/ReviewAccessList.tsx",
|
|
"e/web/teleport/src/AccessListManagement/ViewEditAccessList/Specs/EditEligibilityOrGrants.tsx",
|
|
"e/web/teleport/src/AccessListManagement/ViewEditAccessList/Specs/EditTitleOrDescription.tsx",
|
|
"e/web/teleport/src/AccessListManagement/ViewEditAccessList/ViewEditAccessList.tsx",
|
|
"e/web/teleport/src/AccessMonitoring/QueryEditor/QueryEditor.tsx",
|
|
"e/web/teleport/src/AccessMonitoring/QueryEditor/Result.tsx",
|
|
"e/web/teleport/src/AccessMonitoring/Report/Report.tsx",
|
|
"e/web/teleport/src/AccessMonitoring/ReportList.tsx",
|
|
"e/web/teleport/src/Account/Recovery/RecoveryCodesDialog/useRecoveryCodesDialog.ts",
|
|
"e/web/teleport/src/Account/Recovery/useRecovery.ts",
|
|
"e/web/teleport/src/AuthConnectors/AuthConnectorEditor/AuthConnectorEditor.tsx",
|
|
"e/web/teleport/src/AuthConnectors/AuthConnectors.tsx",
|
|
"e/web/teleport/src/Banner/Switchback/useSwitchback.ts",
|
|
"e/web/teleport/src/DeviceTrust/useDevices.tsx",
|
|
"e/web/teleport/src/Downloads/useDownloads.ts",
|
|
"e/web/teleport/src/Integrations/EditGitHubIntegrationDialog.tsx",
|
|
"e/web/teleport/src/Integrations/IntegrationEnroll/DeleteDialogs/ExternalAuditStorageDelete.tsx",
|
|
"e/web/teleport/src/Integrations/IntegrationEnroll/DeleteDialogs/GitHubRepoAccessDelete.tsx",
|
|
"e/web/teleport/src/Integrations/IntegrationEnroll/ExternalAuditStorage/ConfigurePermissions/ConfigurePermissions.tsx",
|
|
"e/web/teleport/src/Integrations/IntegrationEnroll/ExternalAuditStorage/ExternalAuditStorage.tsx",
|
|
"e/web/teleport/src/Integrations/IntegrationEnroll/ExternalAuditStorage/SelectIntegration/SelectIntegration.tsx",
|
|
"e/web/teleport/src/Integrations/IntegrationEnroll/ExternalAuditStorage/TestConnection/TestConnection.tsx",
|
|
"e/web/teleport/src/Integrations/IntegrationEnroll/ExternalAuditStorage/useExternalAuditStorage.tsx",
|
|
"e/web/teleport/src/Integrations/IntegrationEnroll/IntegrationPick/IntegrationPick.tsx",
|
|
"e/web/teleport/src/Integrations/IntegrationEnroll/PluginEnroll/MultiStep/AwsIdentityCenter/IdentitySource/IdentitySource.tsx",
|
|
"e/web/teleport/src/Integrations/IntegrationEnroll/PluginEnroll/MultiStep/AwsIdentityCenter/ImportResources/ImportResources.tsx",
|
|
"e/web/teleport/src/Integrations/IntegrationEnroll/PluginEnroll/MultiStep/AwsIdentityCenter/OidcIntegration/OidcIntegration.tsx",
|
|
"e/web/teleport/src/Integrations/IntegrationEnroll/PluginEnroll/MultiStep/AwsIdentityCenter/Scim/Scim.tsx",
|
|
"e/web/teleport/src/Integrations/IntegrationEnroll/PluginEnroll/MultiStep/Email/EmailService.tsx",
|
|
"e/web/teleport/src/Integrations/IntegrationEnroll/PluginEnroll/MultiStep/Entra/FormMixin.tsx",
|
|
"e/web/teleport/src/Integrations/IntegrationEnroll/PluginEnroll/MultiStep/Entra/RunScript.tsx",
|
|
"e/web/teleport/src/Integrations/IntegrationEnroll/PluginEnroll/MultiStep/GitHub/ConfigureAccess/ConfigureAccess.tsx",
|
|
"e/web/teleport/src/Integrations/IntegrationEnroll/PluginEnroll/MultiStep/GitHub/ConfigureSshCert/ConfigureSshCert.tsx",
|
|
"e/web/teleport/src/Integrations/IntegrationEnroll/PluginEnroll/MultiStep/GitHub/CreateIntegration/CreatingDialog.tsx",
|
|
"e/web/teleport/src/Integrations/IntegrationEnroll/PluginEnroll/SubmittablePluginForm.tsx",
|
|
"e/web/teleport/src/Integrations/PluginDelete.tsx",
|
|
"e/web/teleport/src/Integrations/useIntegrations.tsx",
|
|
"e/web/teleport/src/InviteCollaborators/EmailPasswordResetDialog.tsx",
|
|
"e/web/teleport/src/InviteCollaborators/InviteCollaboratorsDialog.tsx",
|
|
"e/web/teleport/src/Notifications/notificationContentFactoryE.tsx",
|
|
"e/web/teleport/src/Recovery/RecoveryFlow/Devices/useDevices.ts",
|
|
"e/web/teleport/src/Recovery/RecoveryFlow/NewMfaDevice/useNewMfaDevice.ts",
|
|
"e/web/teleport/src/Recovery/RecoveryFlow/NewPassword/useNewPassword.ts",
|
|
"e/web/teleport/src/Recovery/RecoveryFlow/NewRecoveryCodes/useNewRecoveryCodes.ts",
|
|
"e/web/teleport/src/Recovery/RecoveryFlow/useRecoveryFlow.ts",
|
|
"e/web/teleport/src/Recovery/RecoveryFlow/VerifyUser/useVerifyUser.ts",
|
|
"e/web/teleport/src/Recovery/RecoveryStart/useRecoveryStart.ts",
|
|
"e/web/teleport/src/Roles/AccessGraphDemoContext.tsx",
|
|
"e/web/teleport/src/Roles/useRoleWithAccessGraph.tsx",
|
|
"e/web/teleport/src/SamlApplication/components/ButtonDownloadMetadataFile.tsx",
|
|
"e/web/teleport/src/SamlApplication/hooks/useSamlAppActionsE.tsx",
|
|
"e/web/teleport/src/SamlApplication/hooks/useSamlApplication.tsx",
|
|
"e/web/teleport/src/SAMLIdPLogin/SAMLIdPLogin.tsx",
|
|
"e/web/teleport/src/Support/ClientIpRestrictions/ClientIpRestrictions.tsx",
|
|
"e/web/teleport/src/Support/Contacts/Contacts.tsx",
|
|
"e/web/teleport/src/WaitingRoom/RequestReason/useRequestReason.ts",
|
|
"e/web/teleport/src/WaitingRoom/useWaitingRoom.ts",
|
|
"e/web/teleport/src/Workflow/NewRequest/useNewRequest.ts",
|
|
"e/web/teleport/src/Workflow/NewRequest/useRequestCheckout.tsx",
|
|
"e/web/teleport/src/Workflow/ReviewRequests/RequestList/useRequestList.ts",
|
|
"e/web/teleport/src/Workflow/ReviewRequests/RequestView/RequestView.tsx",
|
|
"e/web/teleport/src/Workflow/ReviewRequests/RequestView/useRequestView.ts"
|
|
],
|
|
"rules": {
|
|
"no-restricted-imports": [
|
|
"error",
|
|
{
|
|
"patterns": [{ "group": ["teleterm/**"] }],
|
|
"paths": [
|
|
{
|
|
"name": "usehooks-ts",
|
|
"importNames": ["useResizeObserver"],
|
|
"message": "Use 'useResizeObserver' from 'design/utils/useResizeObserver' instead."
|
|
},
|
|
{
|
|
"name": "usehooks-ts",
|
|
"importNames": ["useCopyToClipboard"],
|
|
"message": "Use 'copyToClipboard' from 'design/utils/copyToClipboard' instead."
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
}
|
|
]
|
|
}
|