enso/app/ide-desktop/eslint.config.js

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

606 lines
27 KiB
JavaScript
Raw Normal View History

/** @file ESLint configuration file. */
/** NOTE: The "Experimental: Use Flat Config" option must be enabled.
* Flat config is still not quite mature, so is disabled by default. */
import * as path from 'node:path'
import * as url from 'node:url'
// The preferred syntax is `import * as name`, however these modules do not support it.
// This is specialcased in other files, but these modules shouldn't be used in other files anyway.
/* eslint-disable no-restricted-syntax */
import eslintJs from '@eslint/js'
import globals from 'globals'
import jsdoc from 'eslint-plugin-jsdoc'
import react from 'eslint-plugin-react'
import reactHooks from 'eslint-plugin-react-hooks'
import tsEslint from '@typescript-eslint/eslint-plugin'
import tsEslintParser from '@typescript-eslint/parser'
/* eslint-enable no-restricted-syntax */
// =================
// === Constants ===
// =================
const DIR_NAME = path.dirname(url.fileURLToPath(import.meta.url))
const NAME = 'enso'
/** An explicit whitelist of CommonJS modules, which do not support namespace imports.
* Many of these have incorrect types, so no type error may not mean they support ESM,
* and conversely type errors may not mean they don't support ESM -
* but we add those to the whitelist anyway otherwise we get type errors.
* In particular, `string-length` supports ESM but its type definitions don't.
* `yargs` is a modules we explicitly want the default imports of.
* `node:process` is here because `process.on` does not exist on the namespace import. */
const DEFAULT_IMPORT_ONLY_MODULES =
'@vitejs\\u002Fplugin-react|node:process|chalk|string-length|yargs|yargs\\u002Fyargs|sharp|to-ico|connect|morgan|serve-static|tiny-invariant|clsx|create-servers|electron-is-dev|fast-glob|esbuild-plugin-.+|opener|tailwindcss.*|enso-assets.*|@modyfi\\u002Fvite-plugin-yaml|is-network-error|validator.+|.*[.]json$'
const OUR_MODULES = 'enso-.*'
const RELATIVE_MODULES =
'bin\\u002Fproject-manager|bin\\u002Fserver|config\\u002Fparser|authentication|config|debug|detect|file-associations|index|ipc|log|naming|paths|preload|project-management|security|url-associations|#\\u002F.*'
const ALLOWED_DEFAULT_IMPORT_MODULES = `${DEFAULT_IMPORT_ONLY_MODULES}|postcss|ajv\\u002Fdist\\u002F2020|${RELATIVE_MODULES}`
const STRING_LITERAL = ':matches(Literal[raw=/^["\']/], TemplateLiteral)'
const JSX = ':matches(JSXElement, JSXFragment)'
const NOT_CAMEL_CASE = '/^(?!_?[a-z][a-z0-9*]*([A-Z0-9][a-z0-9]*)*$)(?!React$)/'
const WHITELISTED_CONSTANTS = 'logger|.+Context|interpolationFunction.+'
const NOT_CONSTANT_CASE = `/^(?!${WHITELISTED_CONSTANTS}$|_?[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$)/`
// =======================================
// === Restricted syntactic constructs ===
// =======================================
// Extracted to a variable because it needs to be used twice:
// - once as-is for `.d.ts`
// - once explicitly disallowing `declare`s in regular `.ts`.
/** @type {{ selector: string; message: string; }[]} */
const RESTRICTED_SYNTAXES = [
{
selector:
':matches(ImportDeclaration:has(ImportSpecifier), ExportDeclaration, ExportSpecifier)',
message: 'No {} imports and exports',
},
{
selector: `ImportDeclaration[source.value=/^(?!(${ALLOWED_DEFAULT_IMPORT_MODULES})$)[^.]/] > ImportDefaultSpecifier`,
message:
'No default imports from modules. Add to `DEFAULT_IMPORT_ONLY_MODULES` in `eslint.config.js` if the module only has a default export.',
},
{
selector: `ImportDeclaration[source.value=/^(?:${DEFAULT_IMPORT_ONLY_MODULES})$/] > ImportNamespaceSpecifier`,
message: 'No namespace imports from modules that only have a default import',
},
{
selector: `ImportDeclaration[source.value=/\\.(?:json|yaml|yml)$/] > ImportDefaultSpecifier[local.name=${NOT_CONSTANT_CASE}]`,
message: 'Use `CONSTANT_CASE` for imports from data files',
},
{
selector: `ImportDeclaration[source.value=/\\.json$/]:not(:has(ImportAttribute[key.name=type][value.value=json]))`,
message: "JSON imports must be { type: 'json' }",
},
{
selector: `ImportDeclaration[source.value=/\\.(?:yaml|yml)$/]:not(:has(ImportAttribute[key.name=type][value.value=yaml]))`,
message: "YAML imports must be { type: 'yaml' }",
},
{
selector: `ImportDeclaration[source.value=/\\.(?:json|yaml|yml)$/] > ImportNamespaceSpecifier`,
message: 'Use default imports for imports from data files',
},
{
selector: `ImportNamespaceSpecifier > Identifier[name=${NOT_CAMEL_CASE}]`,
message: 'Use `camelCase` for imports',
},
{
selector: `:matches(ImportDefaultSpecifier[local.name=/^${NAME}/i], ImportNamespaceSpecifier > Identifier[name=/^${NAME}/i])`,
message: `Don't prefix modules with \`${NAME}\``,
},
{
selector: 'TSTypeLiteral',
message: 'No object types - use interfaces instead',
},
{
selector: 'ForOfStatement > .left[kind=let]',
message: 'Use `for (const x of xs)`, not `for (let x of xs)`',
},
{
Split `dashboard.tsx` into smaller components (#6546) * Consistent order for statements in `dashboard.tsx`; change functions back to lambdas * Create convenience aliases for each asset type * Remove obsolete FIXME * Refactor out column renderers into components * Enable `prefer-const` lint * Remove hardcoded product name * Add fixme * Enable `react-hooks` lints (not working for some reason) * Consistent messages for naming-convention lint overrides * Enable `react` lints * Extract out tables for each asset type * Refactor out column display mode switcher to a file * Switch VM check state to use an enum * Fix lint errors * Minor section change * Fix position of create forms * Fix bugs; improve debugging QoL * Add documentation for new components * Refactor out drive bar * Refactor out event handlers to variables * Minor clarifications * Refactor out directory view; some fixes; improve React DX There are still many issues when switching backends * Add `assert` * Use `backend.platform` instead of checking for properties * Fix errors when switching backend * Minor style changes; fix lint errors * Fix assert behavior * Change `Rows` to `Table` * Fixes * Fix lint errors * Fix "show dashboard" button * Implement click to rename * Fix lint errors * Fix lint errors (along with a bug in `devServiceWorker`) * Enable dev-mode on `ide watch` * Fix bug in `useAsyncEffect` introduced during merge * More fixes; new debug hooks; fix infinite loop in `auth.tsx` * Inline Cognito methods * Remove redundant `Promise.resolve`s * Fix column display * Fixes * Simplify modal type * Fix bug when opening IDE * Shift+click to select a range of table items * Implement delete multiple * Fixes * Tick and cross for rename input; fixes * Implement rename and delete directory and multi-delete directory; fixes * Optimize modal re-rendering * Make some internal `Props` private * Remove old asset selection code * Eliminate re-renders when clicking document body * Fix name flickering when renaming * Use static placeholders * Avoid refreshing entire directory on rename * Use asset name instead of ID in error messages * QoL improvements * Enable react lints and `strict-boolean-expressions` * Extract dashboard feature flags to its own module * Feature flag to show more toasts; minimize calls to `listDirectory` * Deselect selection on delete; hide unused features; add exception to PascalCase lint * Fix projects disappearing after being created * Fix name of `projectEvent` module imports * Re-disable delete when project is being closed * Fix assets refreshing when adding new projects * Refactor row state into `Table`; fix delete not being disabled again * Address review * Implement shortcut registry * Fix stop icon spinning when switching backends (ported from #6919) * Give columns names * Immediately show project as opening * Replace `asNewtype` with constructor functions * Address review * Minor bugfixes * Prepare for optimistically updated tables * wip 2 * Fix type errors * Remove indirect usages of `doRefresh` Updating the lists of items will need to be re-added later * Remove `toastPromise` * Fix `New_Directory_-Infinity` bug * wip * WIP: Begin restoring functionality to rows * Fix most issues with DirectoriesTable * Port optimistic UI from `DirectoriesTable` to all other asset tables * Fix bugs in item list events for asset tables * Merge `projectActionButton` into `projectsTable` * Remove `RenameModal`; minor context menu bugfixes * Fix bugs * Remove small default user icon * Fix more bugs * Fix bugs * Fix type error * Address review and QA * Fix optimistic UI for "manage permissions" modal * Fix "share with" modal * Fix template spinner disappearing * Allow multiple projects to be opened on local backend; fix version lifecycle returned by local backend * Fix minor bug when closing local project --------- Co-authored-by: Paweł Buchowski <pawel.buchowski@enso.org>
2023-07-19 12:48:39 +03:00
selector:
'TSTypeAliasDeclaration > TSTypeReference:not(:has(.typeParameters)) > Identifier',
message: 'No renamed types',
},
{
selector: 'TSTypeAliasDeclaration > :matches(TSLiteralType)',
message: 'No aliases to literal types',
},
{
selector:
':not(:matches(FunctionDeclaration, FunctionExpression, ArrowFunctionExpression, SwitchStatement, SwitchCase, IfStatement:has(.consequent > :matches(ReturnStatement, ThrowStatement)):has(.alternate :matches(ReturnStatement, ThrowStatement)), Program > TryStatement, Program > TryStatement > .handler, TryStatement:has(.block > :matches(ReturnStatement, ThrowStatement)):has(:matches([handler=null], .handler :matches(ReturnStatement, ThrowStatement))), TryStatement:has(.block > :matches(ReturnStatement, ThrowStatement)):has(:matches([handler=null], .handler :matches(ReturnStatement, ThrowStatement))) > .handler)) > * > :matches(ReturnStatement, ThrowStatement)',
message: 'No early returns',
},
{
selector:
'TSTypeAliasDeclaration > :matches(TSBooleanKeyword, TSBigintKeyword, TSNullKeyword, TSNumberKeyword, TSObjectKeyword, TSStringKeyword, TSSymbolKeyword, TSUndefinedKeyword, TSUnknownKeyword, TSVoidKeyword)',
message:
'No aliases to primitives - consider using brands instead: `string & { _brand: "BrandName"; }`',
},
{
// Matches other functions, non-consts, and consts not at the top level.
selector: `:matches(FunctionDeclaration[id.name=${NOT_CAMEL_CASE}]:not(:has(${JSX})), VariableDeclarator[id.name=${NOT_CAMEL_CASE}]:has(ArrowFunctionExpression.init:not(:has(${JSX}))), :matches(VariableDeclaration[kind^=const], Program :not(ExportNamedDeclaration, TSModuleBlock) > VariableDeclaration[kind=const], ExportNamedDeclaration > * VariableDeclaration[kind=const]) > VariableDeclarator[id.name=${NOT_CAMEL_CASE}]:not(:has(ArrowFunctionExpression)))`,
message: 'Use `camelCase` for everything but React components',
},
{
// Matches non-functions.
Keyboard navigation between components (#9499) - Close https://github.com/enso-org/cloud-v2/issues/982 - Add keyboard navigation via arrows between different components - This is achieved by a `Navigator2D` class which keeps track of the closest adjacent elements. Other changes: - Switch much of the codebase to use `react-aria-components` - This *should* (but does not necessarily) give us improved accessibility for free. - Refactor various common styles into styled components - `FocusArea` to perform automatic registration with `Navigator2D` - `Button` and `UnstyledButton` to let buttons participate in keyboard navigation - `HorizontalMenuBar` - used for buttons below the titles in the Drive page, Keyboard Shortcuts settings page, and Members List settings page - `SettingsPage` in the settings pages - `SettingsSection` in the settings page to wrap around `FocusArea` and the heading for each section - Add debugging utilities - Add debugging when `body` has the `data-debug` attribute: `document.body.dataset.debug = ''` - This adds rings around elements (all with different colors): - That are `FocusArea`s. `FocusArea` is a wrapper component that makes an element participate in `Navigator2D`. - That are `:focus`ed, and that are `:focus-visible` - That are `.focus-child`. This is because keyboard navigation via arrows ***ignores*** all focusable elements that are not `.focus-child`. - Debug `Navigator2D` neighbors when `body` has the `debug-navigator2d` attribute: `document.body.dataset.debugNavigator2d = ''` - This highlights neighbors of the currently focused element. This is a separate debug option because computing neighbors is potentially quite expensive. # Important Notes - :warning: Modals and the authentication flow are not yet fully tested. - Up+Down to navigate through suggestions has been disabled to improve UX when accidentally navigating upwards to the assets search bar. - There are a number of *known* issues with keyboard navigation. For the most part it's because a proper solution will be quite difficult. - Focus is lost when a column (from the extra columns selector) is toggled - because the button stops existing - It's not possible to navigate to the icons on the assets table - so it's current not possible to *hide* columns via the keyboard - Neighbors of the extra columns selector are not ideal (both when it is being navigated from, and when it is being navigated to) - The suggestions in the `AssetSearchBar` aren't *quite* fully integrated with arrow keyboard navigation. - This is *semi*-intentional. I think it makes a lot more sense to integrate them in, *however* it stays like this for now largely because I think pressing `ArrowUp` then `ArrowDown` from the assets table should return to the assets table - Likewise for the assets table. The reason here, however, is because we want multi-select. While `react-aria-components` has lists which support multi-select, it doesn't allow programmatic focus control, making it not particularly ideal, as we want to focus the topmost element when navigating in from above. - Clicking on the "New Folder" icon (and the like) do not focus on the newly created child. This one should be pretty easy to do, but I'm not sure whether it's the right thing to do.
2024-04-05 10:21:02 +03:00
selector: `:matches(Program, ExportNamedDeclaration, TSModuleBlock) > VariableDeclaration[kind=const] > VariableDeclarator[id.name=${NOT_CONSTANT_CASE}]:not(:matches([init.callee.object.name=React][init.callee.property.name=forwardRef], :has(ArrowFunctionExpression), :has(CallExpression[callee.object.name=newtype][callee.property.name=newtypeConstructor])))`,
message: 'Use `CONSTANT_CASE` for top-level constants that are not functions',
},
{
selector: `:matches(Program, ExportNamedDeclaration, TSModuleBlock) > VariableDeclaration > VariableDeclarator > ArrowFunctionExpression`,
message: 'Use `function foo() {}` instead of `const foo = () => {}`',
},
{
selector: `ClassBody > PropertyDefinition > ArrowFunctionExpression`,
message: 'Use `foo() {}` instead of `foo = () => {}`',
},
{
// This lint intentionally excludes classes and readonly arrays.
selector: 'TSInterfaceBody:has(TSPropertySignature[readonly=false])',
message: 'Add `readonly` modifier to all interface properties',
},
{
selector: `TSAsExpression:not(:has(TSTypeReference > Identifier[name=const]))`,
message: 'Avoid `as T`. Consider using a type annotation instead.',
},
{
selector: `:matches(\
TSUndefinedKeyword,\
Identifier[name=undefined],\
UnaryExpression[operator=void]:not(:has(CallExpression.argument)), BinaryExpression[operator=/^===?$/]:has(UnaryExpression.left[operator=typeof]):has(Literal.right[value=undefined])\
)`,
message: 'Use `null` instead of `undefined`, `void 0`, or `typeof x === "undefined"`',
},
{
selector: 'ExportNamedDeclaration > VariableDeclaration[kind=let]',
message: 'Use `export const` instead of `export let`',
},
{
selector: `Program > VariableDeclaration[kind=let] > * > ObjectExpression:has(Property > ${STRING_LITERAL}.value):not(:has(Property > .value:not(${STRING_LITERAL})))`,
message:
'Use `const` instead of `let` for top-level object literals only containing string literals',
},
{
selector:
'ImportDeclaration[source.value=/^(?:assert|async_hooks|buffer|child_process|cluster|console|constants|crypto|dgram|diagnostics_channel|dns|domain|events|fs|fs\\u002Fpromises|http|http2|https|inspector|module|net|os|path|perf_hooks|process|punycode|querystring|readline|repl|stream|string_decoder|timers|tls|trace_events|tty|url|util|v8|vm|wasi|worker_threads|zlib)$/]',
message: 'Use `node:` prefix to import builtin node modules',
},
{
selector: 'TSEnumDeclaration:not(:has(TSEnumMember))',
message: 'Enums must not be empty',
},
{
selector:
'ImportDeclaration[source.value=/^(?!node:)/] ~ ImportDeclaration[source.value=/^node:/]',
message:
'Import node modules before npm modules, our modules, and relative imports, separated by a blank line',
},
{
selector: `ImportDeclaration[source.value=/^(?:${OUR_MODULES}|${RELATIVE_MODULES})$/] ~ ImportDeclaration[source.value=/^(?!(|${OUR_MODULES}|${RELATIVE_MODULES})$|\\.)/]`,
message:
'Import npm modules before our modules and relative imports, separated by a blank line',
},
{
selector: `ImportDeclaration[source.value=/^(?:${RELATIVE_MODULES})$/] ~ ImportDeclaration[source.value=/^(?:${OUR_MODULES})$/]`,
message: 'Import our modules before relative imports, separated by a blank line',
},
{
selector: `ImportDeclaration[source.value=/^\\./] ~ ImportDeclaration[source.value=/^[^.]/]`,
message: 'Import relative imports last',
},
{
selector: `ImportDeclaration[source.value=/^\\..+\\.(?:json|yml|yaml)$/] ~ ImportDeclaration[source.value=/^\\..+\\.(?!json|yml|yaml)[^.]+$/]`,
message: 'Import data files after other relative imports',
},
{
selector:
'TSAsExpression:has(TSUnknownKeyword, TSNeverKeyword, TSAnyKeyword) > TSAsExpression',
message: 'Use type assertions to specific types instead of `unknown`, `any` or `never`',
},
{
selector: ':matches(MethodDeclaration, FunctionDeclaration) FunctionDeclaration',
message: 'Use arrow functions for nested functions',
},
{
selector:
':not(ExportNamedDeclaration) > TSInterfaceDeclaration[id.name=/^(?!Internal).+Props$/]',
message: 'All React component `Props` types must be exported',
},
{
selector: 'FunctionDeclaration:has(:matches(ObjectPattern.params, ArrayPattern.params))',
message: 'Destructure function parameters in the body, instead of in the parameter list',
},
{
selector: 'IfStatement > ExpressionStatement',
message: 'Wrap `if` branches in `{}`',
},
Split `dashboard.tsx` into smaller components (#6546) * Consistent order for statements in `dashboard.tsx`; change functions back to lambdas * Create convenience aliases for each asset type * Remove obsolete FIXME * Refactor out column renderers into components * Enable `prefer-const` lint * Remove hardcoded product name * Add fixme * Enable `react-hooks` lints (not working for some reason) * Consistent messages for naming-convention lint overrides * Enable `react` lints * Extract out tables for each asset type * Refactor out column display mode switcher to a file * Switch VM check state to use an enum * Fix lint errors * Minor section change * Fix position of create forms * Fix bugs; improve debugging QoL * Add documentation for new components * Refactor out drive bar * Refactor out event handlers to variables * Minor clarifications * Refactor out directory view; some fixes; improve React DX There are still many issues when switching backends * Add `assert` * Use `backend.platform` instead of checking for properties * Fix errors when switching backend * Minor style changes; fix lint errors * Fix assert behavior * Change `Rows` to `Table` * Fixes * Fix lint errors * Fix "show dashboard" button * Implement click to rename * Fix lint errors * Fix lint errors (along with a bug in `devServiceWorker`) * Enable dev-mode on `ide watch` * Fix bug in `useAsyncEffect` introduced during merge * More fixes; new debug hooks; fix infinite loop in `auth.tsx` * Inline Cognito methods * Remove redundant `Promise.resolve`s * Fix column display * Fixes * Simplify modal type * Fix bug when opening IDE * Shift+click to select a range of table items * Implement delete multiple * Fixes * Tick and cross for rename input; fixes * Implement rename and delete directory and multi-delete directory; fixes * Optimize modal re-rendering * Make some internal `Props` private * Remove old asset selection code * Eliminate re-renders when clicking document body * Fix name flickering when renaming * Use static placeholders * Avoid refreshing entire directory on rename * Use asset name instead of ID in error messages * QoL improvements * Enable react lints and `strict-boolean-expressions` * Extract dashboard feature flags to its own module * Feature flag to show more toasts; minimize calls to `listDirectory` * Deselect selection on delete; hide unused features; add exception to PascalCase lint * Fix projects disappearing after being created * Fix name of `projectEvent` module imports * Re-disable delete when project is being closed * Fix assets refreshing when adding new projects * Refactor row state into `Table`; fix delete not being disabled again * Address review * Implement shortcut registry * Fix stop icon spinning when switching backends (ported from #6919) * Give columns names * Immediately show project as opening * Replace `asNewtype` with constructor functions * Address review * Minor bugfixes * Prepare for optimistically updated tables * wip 2 * Fix type errors * Remove indirect usages of `doRefresh` Updating the lists of items will need to be re-added later * Remove `toastPromise` * Fix `New_Directory_-Infinity` bug * wip * WIP: Begin restoring functionality to rows * Fix most issues with DirectoriesTable * Port optimistic UI from `DirectoriesTable` to all other asset tables * Fix bugs in item list events for asset tables * Merge `projectActionButton` into `projectsTable` * Remove `RenameModal`; minor context menu bugfixes * Fix bugs * Remove small default user icon * Fix more bugs * Fix bugs * Fix type error * Address review and QA * Fix optimistic UI for "manage permissions" modal * Fix "share with" modal * Fix template spinner disappearing * Allow multiple projects to be opened on local backend; fix version lifecycle returned by local backend * Fix minor bug when closing local project --------- Co-authored-by: Paweł Buchowski <pawel.buchowski@enso.org>
2023-07-19 12:48:39 +03:00
{
selector: ':matches(ForStatement[test=null], ForStatement[test.value=true])',
message: 'Use `while (true)` instead of `for (;;)`',
},
{
selector: `:matches(\
JSXAttribute[name.name=/^(?:alt|error|label|placeholder|text|title|actionButtonLabel|actionText|aria-label)$/][value.raw=/^'|^"|^\`/], \
JSXText[value=/\\S/], \
JSXAttribute[name.name=/^(?:alt|error|label|placeholder|text|title|actionButtonLabel|actionText|aria-label)$/] ConditionalExpression:matches(\
[consequent.raw=/^'|^"|^\`/], \
[alternate.raw=/^'|^"|^\`/]\
)\
)`,
message: 'Use a `getText()` from `useText` instead of a literal string',
},
Keyboard navigation between components (#9499) - Close https://github.com/enso-org/cloud-v2/issues/982 - Add keyboard navigation via arrows between different components - This is achieved by a `Navigator2D` class which keeps track of the closest adjacent elements. Other changes: - Switch much of the codebase to use `react-aria-components` - This *should* (but does not necessarily) give us improved accessibility for free. - Refactor various common styles into styled components - `FocusArea` to perform automatic registration with `Navigator2D` - `Button` and `UnstyledButton` to let buttons participate in keyboard navigation - `HorizontalMenuBar` - used for buttons below the titles in the Drive page, Keyboard Shortcuts settings page, and Members List settings page - `SettingsPage` in the settings pages - `SettingsSection` in the settings page to wrap around `FocusArea` and the heading for each section - Add debugging utilities - Add debugging when `body` has the `data-debug` attribute: `document.body.dataset.debug = ''` - This adds rings around elements (all with different colors): - That are `FocusArea`s. `FocusArea` is a wrapper component that makes an element participate in `Navigator2D`. - That are `:focus`ed, and that are `:focus-visible` - That are `.focus-child`. This is because keyboard navigation via arrows ***ignores*** all focusable elements that are not `.focus-child`. - Debug `Navigator2D` neighbors when `body` has the `debug-navigator2d` attribute: `document.body.dataset.debugNavigator2d = ''` - This highlights neighbors of the currently focused element. This is a separate debug option because computing neighbors is potentially quite expensive. # Important Notes - :warning: Modals and the authentication flow are not yet fully tested. - Up+Down to navigate through suggestions has been disabled to improve UX when accidentally navigating upwards to the assets search bar. - There are a number of *known* issues with keyboard navigation. For the most part it's because a proper solution will be quite difficult. - Focus is lost when a column (from the extra columns selector) is toggled - because the button stops existing - It's not possible to navigate to the icons on the assets table - so it's current not possible to *hide* columns via the keyboard - Neighbors of the extra columns selector are not ideal (both when it is being navigated from, and when it is being navigated to) - The suggestions in the `AssetSearchBar` aren't *quite* fully integrated with arrow keyboard navigation. - This is *semi*-intentional. I think it makes a lot more sense to integrate them in, *however* it stays like this for now largely because I think pressing `ArrowUp` then `ArrowDown` from the assets table should return to the assets table - Likewise for the assets table. The reason here, however, is because we want multi-select. While `react-aria-components` has lists which support multi-select, it doesn't allow programmatic focus control, making it not particularly ideal, as we want to focus the topmost element when navigating in from above. - Clicking on the "New Folder" icon (and the like) do not focus on the newly created child. This one should be pretty easy to do, but I'm not sure whether it's the right thing to do.
2024-04-05 10:21:02 +03:00
{
selector: 'JSXOpeningElement[name.name=button] > JSXIdentifier',
message: 'Use `Button` or `UnstyledButton` instead of `button`',
},
{
selector: 'JSXOpeningElement[name.name=label] > JSXIdentifier',
message: 'Use `aria.Label` instead of `label`',
},
{
selector: 'JSXOpeningElement[name.name=input] > JSXIdentifier',
message: 'Use `aria.Input` instead of `input`',
},
{
selector: 'JSXOpeningElement[name.name=span] > JSXIdentifier',
message: 'Use `aria.Text` instead of `span`',
},
{
selector: 'JSXOpeningElement[name.name=/^h[123456]$/] > JSXIdentifier',
message: 'Use `aria.Heading` instead of `h1`-`h6`',
},
// We may want to consider also preferring `aria.Form` in favor of `form` in the future.
]
// ============================
// === ESLint configuration ===
// ============================
/* eslint-disable @typescript-eslint/naming-convention */
export default [
eslintJs.configs.recommended,
{
// Playwright build cache.
ignores: ['**/.cache/**', '**/playwright-report'],
},
{
settings: {
react: {
version: '18.2',
},
},
plugins: {
jsdoc: jsdoc,
'@typescript-eslint': tsEslint,
react: react,
'react-hooks': reactHooks,
},
languageOptions: {
parser: tsEslintParser,
parserOptions: {
tsconfigRootDir: DIR_NAME,
project: true,
},
globals: {
...globals.browser,
...globals.node,
...globals.es2015,
},
},
rules: {
...tsEslint.configs['eslint-recommended']?.rules,
...tsEslint.configs.recommended?.rules,
...tsEslint.configs['recommended-requiring-type-checking']?.rules,
...tsEslint.configs.strict?.rules,
...react.configs['jsx-runtime'].rules,
eqeqeq: ['error', 'always', { null: 'never' }],
Keyboard navigation between components (#9499) - Close https://github.com/enso-org/cloud-v2/issues/982 - Add keyboard navigation via arrows between different components - This is achieved by a `Navigator2D` class which keeps track of the closest adjacent elements. Other changes: - Switch much of the codebase to use `react-aria-components` - This *should* (but does not necessarily) give us improved accessibility for free. - Refactor various common styles into styled components - `FocusArea` to perform automatic registration with `Navigator2D` - `Button` and `UnstyledButton` to let buttons participate in keyboard navigation - `HorizontalMenuBar` - used for buttons below the titles in the Drive page, Keyboard Shortcuts settings page, and Members List settings page - `SettingsPage` in the settings pages - `SettingsSection` in the settings page to wrap around `FocusArea` and the heading for each section - Add debugging utilities - Add debugging when `body` has the `data-debug` attribute: `document.body.dataset.debug = ''` - This adds rings around elements (all with different colors): - That are `FocusArea`s. `FocusArea` is a wrapper component that makes an element participate in `Navigator2D`. - That are `:focus`ed, and that are `:focus-visible` - That are `.focus-child`. This is because keyboard navigation via arrows ***ignores*** all focusable elements that are not `.focus-child`. - Debug `Navigator2D` neighbors when `body` has the `debug-navigator2d` attribute: `document.body.dataset.debugNavigator2d = ''` - This highlights neighbors of the currently focused element. This is a separate debug option because computing neighbors is potentially quite expensive. # Important Notes - :warning: Modals and the authentication flow are not yet fully tested. - Up+Down to navigate through suggestions has been disabled to improve UX when accidentally navigating upwards to the assets search bar. - There are a number of *known* issues with keyboard navigation. For the most part it's because a proper solution will be quite difficult. - Focus is lost when a column (from the extra columns selector) is toggled - because the button stops existing - It's not possible to navigate to the icons on the assets table - so it's current not possible to *hide* columns via the keyboard - Neighbors of the extra columns selector are not ideal (both when it is being navigated from, and when it is being navigated to) - The suggestions in the `AssetSearchBar` aren't *quite* fully integrated with arrow keyboard navigation. - This is *semi*-intentional. I think it makes a lot more sense to integrate them in, *however* it stays like this for now largely because I think pressing `ArrowUp` then `ArrowDown` from the assets table should return to the assets table - Likewise for the assets table. The reason here, however, is because we want multi-select. While `react-aria-components` has lists which support multi-select, it doesn't allow programmatic focus control, making it not particularly ideal, as we want to focus the topmost element when navigating in from above. - Clicking on the "New Folder" icon (and the like) do not focus on the newly created child. This one should be pretty easy to do, but I'm not sure whether it's the right thing to do.
2024-04-05 10:21:02 +03:00
// Any extra semicolons that exist, are required by Prettier.
'no-extra-semi': 'off',
'jsdoc/require-jsdoc': [
'error',
{
require: {
FunctionDeclaration: true,
MethodDefinition: true,
ClassDeclaration: true,
ArrowFunctionExpression: false,
FunctionExpression: true,
},
// Top-level constants should require JSDoc as well,
// however it does not seem like there is a way to do this.
contexts: [
'TSInterfaceDeclaration',
'TSEnumDeclaration',
'TSTypeAliasDeclaration',
'TSMethodSignature',
],
},
],
Split `dashboard.tsx` into smaller components (#6546) * Consistent order for statements in `dashboard.tsx`; change functions back to lambdas * Create convenience aliases for each asset type * Remove obsolete FIXME * Refactor out column renderers into components * Enable `prefer-const` lint * Remove hardcoded product name * Add fixme * Enable `react-hooks` lints (not working for some reason) * Consistent messages for naming-convention lint overrides * Enable `react` lints * Extract out tables for each asset type * Refactor out column display mode switcher to a file * Switch VM check state to use an enum * Fix lint errors * Minor section change * Fix position of create forms * Fix bugs; improve debugging QoL * Add documentation for new components * Refactor out drive bar * Refactor out event handlers to variables * Minor clarifications * Refactor out directory view; some fixes; improve React DX There are still many issues when switching backends * Add `assert` * Use `backend.platform` instead of checking for properties * Fix errors when switching backend * Minor style changes; fix lint errors * Fix assert behavior * Change `Rows` to `Table` * Fixes * Fix lint errors * Fix "show dashboard" button * Implement click to rename * Fix lint errors * Fix lint errors (along with a bug in `devServiceWorker`) * Enable dev-mode on `ide watch` * Fix bug in `useAsyncEffect` introduced during merge * More fixes; new debug hooks; fix infinite loop in `auth.tsx` * Inline Cognito methods * Remove redundant `Promise.resolve`s * Fix column display * Fixes * Simplify modal type * Fix bug when opening IDE * Shift+click to select a range of table items * Implement delete multiple * Fixes * Tick and cross for rename input; fixes * Implement rename and delete directory and multi-delete directory; fixes * Optimize modal re-rendering * Make some internal `Props` private * Remove old asset selection code * Eliminate re-renders when clicking document body * Fix name flickering when renaming * Use static placeholders * Avoid refreshing entire directory on rename * Use asset name instead of ID in error messages * QoL improvements * Enable react lints and `strict-boolean-expressions` * Extract dashboard feature flags to its own module * Feature flag to show more toasts; minimize calls to `listDirectory` * Deselect selection on delete; hide unused features; add exception to PascalCase lint * Fix projects disappearing after being created * Fix name of `projectEvent` module imports * Re-disable delete when project is being closed * Fix assets refreshing when adding new projects * Refactor row state into `Table`; fix delete not being disabled again * Address review * Implement shortcut registry * Fix stop icon spinning when switching backends (ported from #6919) * Give columns names * Immediately show project as opening * Replace `asNewtype` with constructor functions * Address review * Minor bugfixes * Prepare for optimistically updated tables * wip 2 * Fix type errors * Remove indirect usages of `doRefresh` Updating the lists of items will need to be re-added later * Remove `toastPromise` * Fix `New_Directory_-Infinity` bug * wip * WIP: Begin restoring functionality to rows * Fix most issues with DirectoriesTable * Port optimistic UI from `DirectoriesTable` to all other asset tables * Fix bugs in item list events for asset tables * Merge `projectActionButton` into `projectsTable` * Remove `RenameModal`; minor context menu bugfixes * Fix bugs * Remove small default user icon * Fix more bugs * Fix bugs * Fix type error * Address review and QA * Fix optimistic UI for "manage permissions" modal * Fix "share with" modal * Fix template spinner disappearing * Allow multiple projects to be opened on local backend; fix version lifecycle returned by local backend * Fix minor bug when closing local project --------- Co-authored-by: Paweł Buchowski <pawel.buchowski@enso.org>
2023-07-19 12:48:39 +03:00
'no-constant-condition': ['error', { checkLoops: false }],
'no-restricted-syntax': ['error', ...RESTRICTED_SYNTAXES],
'prefer-arrow-callback': 'error',
'prefer-const': 'error',
// Not relevant because TypeScript checks types.
'react/prop-types': 'off',
'react/self-closing-comp': 'error',
'react-hooks/rules-of-hooks': 'error',
'react-hooks/exhaustive-deps': 'error',
'react/jsx-pascal-case': ['error', { allowNamespace: true }],
// Prefer `interface` over `type`.
'@typescript-eslint/consistent-type-definitions': 'error',
'@typescript-eslint/consistent-type-imports': 'error',
'@typescript-eslint/member-ordering': 'error',
// Method syntax is not type-safe.
// See: https://typescript-eslint.io/rules/method-signature-style
'@typescript-eslint/method-signature-style': 'error',
'@typescript-eslint/naming-convention': [
'error',
{
selector: ['function'],
// PascalCase for React components, camelCase for all other situations
format: ['camelCase', 'PascalCase'],
},
{
selector: ['variable'],
modifiers: ['const', 'global'],
format: ['UPPER_CASE', 'camelCase', 'PascalCase'],
},
{
selector: ['variable'],
modifiers: ['const', 'exported'],
format: ['UPPER_CASE', 'camelCase', 'PascalCase'],
},
{
selector: ['variable'],
format: ['camelCase', 'PascalCase'],
},
{
selector: ['parameter', 'property', 'method'],
format: ['camelCase'],
},
{
selector: ['parameter'],
modifiers: ['unused'],
format: ['camelCase'],
leadingUnderscore: 'require',
},
],
'@typescript-eslint/no-confusing-void-expression': 'error',
Dashboard directory interactivity (#6279) * turn object into var * add todo * fix style * fixes * remove forgot password + reset password * remove signout * remove setusername * remove login * remove registration * fix comments * re-enable flag * rename div * add comment * fix lints * remove tailwind conf * Revert "remove registration" This reverts commit 02439c9b709f5f7bdab72171d2706bec45cdfe6e. * Revert "remove login" This reverts commit 8e6f9c11122142c41faddef8a857cd3546d81fab. * Revert "remove setusername" This reverts commit 84721bcccd12b83c05f79505a5e7b444505e7917. * Revert "remove signout" This reverts commit 08a96d3796108f32d3f26317b01248bdfe59c5fa. * Revert "remove forgot password + reset password" This reverts commit e52f51a76253894041c32f9bff4e33690b354176. * remove opener * move opener * tmp * prettier * expand docs * tmp * replace react-scripts with craco * add tailwindcss * switch to brands * tmp * tmp * tmp * fixmes * fixmes * fixmes * fixmes * fixmes * fixes for e-hern's comments * use abortcontroller * add docs * fixes * revert craco, fix windows build * remove from gitignore * remove unnecessary check * tmp * augment window * tmptmp * split errors back up * tmp * tmp * prettier * fix * Fix lints * Prepare for addition for `as T` lint * Add lint for early returns * Address review issues * Fix lints * remove withrouter * fix file length * fixes * fixes * remove dashboard * fix * use switch * prettier * fixes * prettier * fixes * run prettier * run prettier * run prettier * fix main page url * allow node.js debugging * fix lints * change not equal * prettier * Remove references to withRouter; fix lints * Run prettier * Add cloud endpoints * Add JSON-RPC endpoints * Add dashboard skeleton * Add components and edit dashboard * Run prettier * (WIP) Add cloud endpoints * Add rpc endpoints * Address review issues * Formatting and minor fixes for `newtype.ts` * Address review issues * Rename `Brand` to `NewtypeVariant` * Rename `Brand` to `NewtypeVariant` * Fix formatting in `newtype.ts` * Switch dashboard to esbuild * Minor fixes; move Tailwind generation into esbuild-config * Fix watching `content/` and `client/` * Bump esbuild binary versions; minor dependency list fixes * Add dashboard skeleton * Run prettier * Fixes; rename "npm run dev" to "npm run watch-dashboard" * Avoid writing esbuild outputs to disk for `dashboard/` * Convert watch-dashboard to be fully in-memory; rebuild css files on change * Remove obsolete FIXME * Remove unused constants * Run prettier * add missing styles * Fixes * Fix the fixes * Run prettier * Fixes; use nesting plugin to wrap tailwind preflight * Remove testing flag from client/watch * Minor fixes * Run prettier * Export newtypes * Make css rebuild when tailwind config changes * Fix endpoints * Finish copying changes over * Remove duplicate type definitions * Fix bundling for dashboard * Fix dashboard/bundle.ts erroring when build directory does not exist * Move CSS to Tailwind config * Run prettier * Update endpoints * Fix esbuild binary package names * Remove redundant "npx" prefix from build scripts * Remove unused dependency * Begin adding interactivity * workaround for mac freeze * Fix modal bugs * Begin implementing forms, split forms and modals into new files * Get form UI working * add missing sections * Minor fixes, save current directory to localStorage * Fixes for drop-to-upload Note: currently it is opening in a new tab instead of actually uploading * Address review issue * Fix prettier config; run prettier * Fix live-reload of `npm run watch-dashboard` * (WIP) * Fix service worker for client-side routing * Add close button to asset creation forms; fix saving directory to localStorage * Remove workaround for backend bug when listing directories * Fix drop-to-upload * Fix sizing * Fix spacing, add fixed paths * WIP: fix toast notification styles, begin adding context menu * WIP: Add context menu, minor fixes * Fix authentication on desktop IDE * Allow unused locals and parameters in tsconfig.json * Run prettier * Fix TypeScript errors * Fix modals; minor refactor * Implement context menus for labels; fixes * Add modal provider and switch all modals to provider; fixes * Fix modals and user icon size * Fixes * Remove obsolete files from incorrect merge * Address review issues * Fix type error * Stop removing `#root` * Fixes for cloud * Implement search on frontend side * Fix race condition related to `directoryId` * Hide directories, files and secrets tables on desktop IDE * Fix lint errors * Properly update visible projects when a project is created * Pass directory id to create project * Hide column display switcher; remove placeholder column data --------- Co-authored-by: Nikita Pekin <nikita@frecency.com> Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> Co-authored-by: Paweł Buchowski <pawel.buchowski@enso.org>
2023-04-26 12:52:13 +03:00
'@typescript-eslint/no-empty-interface': 'off',
'@typescript-eslint/no-extraneous-class': 'error',
'@typescript-eslint/no-invalid-void-type': ['error', { allowAsThisParameter: true }],
// React 17 and later supports async functions as event handlers, so we need to disable this
// rule to avoid false positives.
//
// See: https://github.com/typescript-eslint/typescript-eslint/pull/4623
'@typescript-eslint/no-misused-promises': [
'error',
{ checksVoidReturn: { attributes: false } },
],
'@typescript-eslint/no-redundant-type-constituents': 'error',
Split `dashboard.tsx` into smaller components (#6546) * Consistent order for statements in `dashboard.tsx`; change functions back to lambdas * Create convenience aliases for each asset type * Remove obsolete FIXME * Refactor out column renderers into components * Enable `prefer-const` lint * Remove hardcoded product name * Add fixme * Enable `react-hooks` lints (not working for some reason) * Consistent messages for naming-convention lint overrides * Enable `react` lints * Extract out tables for each asset type * Refactor out column display mode switcher to a file * Switch VM check state to use an enum * Fix lint errors * Minor section change * Fix position of create forms * Fix bugs; improve debugging QoL * Add documentation for new components * Refactor out drive bar * Refactor out event handlers to variables * Minor clarifications * Refactor out directory view; some fixes; improve React DX There are still many issues when switching backends * Add `assert` * Use `backend.platform` instead of checking for properties * Fix errors when switching backend * Minor style changes; fix lint errors * Fix assert behavior * Change `Rows` to `Table` * Fixes * Fix lint errors * Fix "show dashboard" button * Implement click to rename * Fix lint errors * Fix lint errors (along with a bug in `devServiceWorker`) * Enable dev-mode on `ide watch` * Fix bug in `useAsyncEffect` introduced during merge * More fixes; new debug hooks; fix infinite loop in `auth.tsx` * Inline Cognito methods * Remove redundant `Promise.resolve`s * Fix column display * Fixes * Simplify modal type * Fix bug when opening IDE * Shift+click to select a range of table items * Implement delete multiple * Fixes * Tick and cross for rename input; fixes * Implement rename and delete directory and multi-delete directory; fixes * Optimize modal re-rendering * Make some internal `Props` private * Remove old asset selection code * Eliminate re-renders when clicking document body * Fix name flickering when renaming * Use static placeholders * Avoid refreshing entire directory on rename * Use asset name instead of ID in error messages * QoL improvements * Enable react lints and `strict-boolean-expressions` * Extract dashboard feature flags to its own module * Feature flag to show more toasts; minimize calls to `listDirectory` * Deselect selection on delete; hide unused features; add exception to PascalCase lint * Fix projects disappearing after being created * Fix name of `projectEvent` module imports * Re-disable delete when project is being closed * Fix assets refreshing when adding new projects * Refactor row state into `Table`; fix delete not being disabled again * Address review * Implement shortcut registry * Fix stop icon spinning when switching backends (ported from #6919) * Give columns names * Immediately show project as opening * Replace `asNewtype` with constructor functions * Address review * Minor bugfixes * Prepare for optimistically updated tables * wip 2 * Fix type errors * Remove indirect usages of `doRefresh` Updating the lists of items will need to be re-added later * Remove `toastPromise` * Fix `New_Directory_-Infinity` bug * wip * WIP: Begin restoring functionality to rows * Fix most issues with DirectoriesTable * Port optimistic UI from `DirectoriesTable` to all other asset tables * Fix bugs in item list events for asset tables * Merge `projectActionButton` into `projectsTable` * Remove `RenameModal`; minor context menu bugfixes * Fix bugs * Remove small default user icon * Fix more bugs * Fix bugs * Fix type error * Address review and QA * Fix optimistic UI for "manage permissions" modal * Fix "share with" modal * Fix template spinner disappearing * Allow multiple projects to be opened on local backend; fix version lifecycle returned by local backend * Fix minor bug when closing local project --------- Co-authored-by: Paweł Buchowski <pawel.buchowski@enso.org>
2023-07-19 12:48:39 +03:00
'@typescript-eslint/no-unnecessary-condition': [
'error',
{ allowConstantLoopConditions: true },
],
'@typescript-eslint/no-useless-empty-export': 'error',
'@typescript-eslint/parameter-properties': ['error', { prefer: 'parameter-property' }],
'@typescript-eslint/prefer-enum-initializers': 'error',
'@typescript-eslint/prefer-readonly': 'error',
'@typescript-eslint/require-array-sort-compare': [
'error',
{ ignoreStringArrays: true },
],
'@typescript-eslint/restrict-template-expressions': 'error',
'@typescript-eslint/sort-type-constituents': 'error',
'@typescript-eslint/strict-boolean-expressions': 'error',
'@typescript-eslint/switch-exhaustiveness-check': 'error',
'default-param-last': 'off',
'@typescript-eslint/default-param-last': 'error',
'no-invalid-this': 'off',
'@typescript-eslint/no-invalid-this': ['error', { capIsConstructor: false }],
'jsdoc/no-magic-numbers': 'off',
'@typescript-eslint/no-magic-numbers': [
'error',
{
ignore: [-1, 0, 1, 2, 3, 4, 5],
ignoreArrayIndexes: true,
ignoreEnums: true,
detectObjects: true,
enforceConst: true,
},
],
'no-redeclare': 'off',
// Important to warn on accidental duplicated `interface`s e.g. when writing API wrappers.
'@typescript-eslint/no-redeclare': ['error', { ignoreDeclarationMerge: false }],
'no-shadow': 'off',
'@typescript-eslint/no-shadow': 'error',
'no-unused-expressions': 'off',
'@typescript-eslint/no-unused-expressions': 'error',
'jsdoc/require-param-type': 'off',
'jsdoc/check-access': 'error',
'jsdoc/check-alignment': 'error',
'jsdoc/check-indentation': 'error',
'jsdoc/check-line-alignment': 'error',
'jsdoc/check-param-names': 'error',
'jsdoc/check-property-names': 'error',
'jsdoc/check-syntax': 'error',
'jsdoc/check-tag-names': 'error',
'jsdoc/check-types': 'error',
'jsdoc/check-values': 'error',
'jsdoc/empty-tags': 'error',
'jsdoc/implements-on-classes': 'error',
'jsdoc/no-bad-blocks': 'error',
'jsdoc/no-defaults': 'error',
'jsdoc/no-multi-asterisks': 'error',
'jsdoc/no-types': 'error',
'jsdoc/no-undefined-types': 'error',
'jsdoc/require-asterisk-prefix': 'error',
'jsdoc/require-description': 'error',
// This rule does not handle `# Heading`s and "etc.", "e.g.", "vs." etc.
// 'jsdoc/require-description-complete-sentence': 'error',
'jsdoc/require-file-overview': 'error',
'jsdoc/require-hyphen-before-param-description': 'error',
'jsdoc/require-param-description': 'error',
'jsdoc/require-param-name': 'error',
'jsdoc/require-property': 'error',
'jsdoc/require-property-description': 'error',
'jsdoc/require-property-name': 'error',
'jsdoc/require-property-type': 'error',
'jsdoc/require-returns-check': 'error',
'jsdoc/require-returns-description': 'error',
'jsdoc/require-throws': 'error',
'jsdoc/require-yields': 'error',
'jsdoc/require-yields-check': 'error',
'jsdoc/tag-lines': 'error',
'jsdoc/valid-types': 'error',
},
},
{
files: ['**/*.js', '**/*.jsx', '**/*.cjs', '**/*.mjs'],
rules: {
'@typescript-eslint/no-var-requires': 'off',
// Parameter types must be specified using JSDoc in JS files.
'jsdoc/no-types': 'off',
},
},
{
files: ['**/*.ts', '**/*.mts', '**/*.cts', '**/*.tsx', '**/*.mtsx', '**/*.ctsx'],
ignores: ['**/*.d.ts'],
rules: {
'no-restricted-syntax': [
'error',
...RESTRICTED_SYNTAXES,
{
selector: ':not(TSModuleDeclaration)[declare=true]',
message: 'No ambient declarations',
},
{
selector: 'ExportDefaultDeclaration:has(Identifier.declaration)',
message:
'Use `export default` on the declaration, instead of as a separate statement',
},
],
// This rule does not work with TypeScript, and TypeScript already does this.
'no-undef': 'off',
},
},
{
files: [
'lib/dashboard/src/**/*.ts',
'lib/dashboard/src/**/*.mts',
'lib/dashboard/src/**/*.cts',
'lib/dashboard/src/**/*.tsx',
'lib/dashboard/src/**/*.mtsx',
'lib/dashboard/src/**/*.ctsx',
'lib/dashboard/mock/**/*.ts',
'lib/dashboard/mock/**/*.mts',
'lib/dashboard/mock/**/*.cts',
'lib/dashboard/mock/**/*.tsx',
'lib/dashboard/mock/**/*.mtsx',
'lib/dashboard/mock/**/*.ctsx',
],
rules: {
'no-restricted-properties': [
'error',
{
object: 'router',
property: 'useNavigate',
message: 'Use `hooks.useNavigate` instead.',
},
{
object: 'console',
message: 'Avoid leaving debugging statements when committing code',
},
{
property: 'useDebugState',
message: 'Avoid leaving debugging statements when committing code',
},
{
property: 'useDebugEffect',
message: 'Avoid leaving debugging statements when committing code',
},
{
property: 'useDebugMemo',
message: 'Avoid leaving debugging statements when committing code',
},
{
property: 'useDebugCallback',
message: 'Avoid leaving debugging statements when committing code',
},
],
},
},
{
files: [
More E2E tests; `export default` classes from modules (#8730) This is a prerequisite for adding a CI action for E2E tests. - Fix E2E tests - Remove visual regression testing (VRT) and associated fixtures (screenshots) for now - Switch dashboard almost fully to Vite, from ESBuild, to match GUI2's build tooling. - Add some new E2E tests: - Creating assets - Deleting assets - Creating assets from the samples on the home page - Sort assets - Includes fixes for sorting: - Group sorted assets by type again (regression) (see https://github.com/enso-org/cloud-v2/issues/554) - Make sorting by title, case insensitive. This is because it is more intuitive for non-programmers if all items with uppercase names *aren't* separated from those with lowercase names - especially since the Windows FS is case-insensitive. - Normalization of Unicode letters is *not* currently being done. It can potentially be added later. - Double-clicking *anywhere* on a directory row now expands it. Previously it was only being expanded when double clicking - Add recursive label adding/removal to mirror backend - Note: The current implementation is not exactly the same as the backend's implementation. - Fix https://github.com/enso-org/cloud-v2/issues/872 - Unset "saved project details" (for opening the last open project) if fetching it produces an error. # Important Notes - All tests pass. (run `npm run test:e2e` in `app/ide-desktop/lib/dashboard`) - All `npm` commands should be run in `app/ide-desktop/lib/dashboard`. `dashboard:*` npm scripts have been removed from `app/ide-desktop` to prevent a mess. - `npm run dev` confirmed to still work. Note that it has not been changed as it was already using Vite. - `npm run build` now uses `vite build`. This has been tested using a local HTTP server that supports `404.html`. - Other cases have been tested: - `npm run test:e2e` works (all tests pass) - `./run ide build` works - `./run ide watch` works - `./run ide2 build` works - `./run gui watch` works
2024-01-31 14:35:41 +03:00
'lib/dashboard/e2e/**/*.ts',
'lib/dashboard/e2e/**/*.mts',
'lib/dashboard/e2e/**/*.cts',
'lib/dashboard/e2e/**/*.tsx',
'lib/dashboard/e2e/**/*.mtsx',
'lib/dashboard/e2e/**/*.ctsx',
],
rules: {
'no-restricted-properties': [
'error',
{
object: 'console',
message: 'Avoid leaving debugging statements when committing code',
},
{
object: 'hooks',
property: 'useDebugState',
message: 'Avoid leaving debugging statements when committing code',
},
{
object: 'hooks',
property: 'useDebugEffect',
message: 'Avoid leaving debugging statements when committing code',
},
{
object: 'hooks',
property: 'useDebugMemo',
message: 'Avoid leaving debugging statements when committing code',
},
{
object: 'hooks',
property: 'useDebugCallback',
message: 'Avoid leaving debugging statements when committing code',
},
{
object: 'page',
property: 'type',
message: 'Prefer `locator.type` instead',
},
{
object: 'page',
property: 'click',
message: 'Prefer `locator.click` instead',
},
{
object: 'page',
property: 'fill',
message: 'Prefer `locator.fill` instead',
},
{
object: 'page',
property: 'locator',
message: 'Prefer `page.getBy*` instead',
},
],
},
},
{
files: ['**/*.d.ts'],
rules: {
'no-undef': 'off',
},
},
{
files: ['**/tailwind.config.ts'],
rules: {
'no-restricted-syntax': 'off',
'@typescript-eslint/naming-convention': 'off',
},
},
]