From 83d8035dc27b68d690e76e003452168d0ee54699 Mon Sep 17 00:00:00 2001 From: Kristaps Fabians Geikins Date: Wed, 12 Jun 2024 14:38:02 +0300 Subject: [PATCH] chore: upgrade to eslint 9 (#2348) * root + server * frontend * frontend-2 * dui3 * dui3 * tailwind theme * ui-components * preview service * viewer * viewer-sandbox * fileimport-service * webhook service * objectloader * shared * ui-components-nuxt * WIP full config * WIP full linter * eslint projectwide util * minor fix * removing redundant ci * clean up test errors * fixed prettier formatting * CI improvements * TSC lint fix * 'buildBatch' needs to be async since some batch types (like Text) require it. Removed a disabled liniting rule from ObjLoader * removed unnecessary void --------- Co-authored-by: AlexandruPopovici --- .circleci/config.yml | 16 +- .eslintrc.js | 47 - .husky/pre-commit | 2 +- .prettierignore | 1 + eslint.config.mjs | 112 + lint-staged.config.js | 20 +- package.json | 28 +- packages/dui3/.eslintrc.js | 119 - .../dui3/components/header/UserAccount.vue | 2 +- packages/dui3/components/header/UserMenu.vue | 2 +- packages/dui3/eslint.config.mjs | 125 + .../dui3/lib/accounts/composables/setup.ts | 4 +- .../definitions/IBasicConnectorBinding.ts | 6 +- .../bindings/definitions/IConfigBinding.ts | 8 +- .../lib/bindings/definitions/ITestBinding.ts | 5 +- packages/dui3/lib/bridge/base.ts | 3 +- packages/dui3/lib/bridge/generic.ts | 2 +- packages/dui3/lib/core/configs/apollo.ts | 18 +- packages/dui3/lib/core/helpers/apolloSetup.ts | 4 +- packages/dui3/nuxt.config.ts | 7 +- packages/dui3/package.json | 15 +- packages/dui3/pages/test.vue | 5 +- packages/dui3/plugins/00.bindings.ts | 8 +- packages/dui3/store/documentInfo.ts | 2 +- packages/dui3/store/uiConfig.ts | 2 +- packages/fileimport-service/.eslintrc.js | 11 - packages/fileimport-service/eslint.config.mjs | 17 + .../fileimport-service/ifc/import_file.js | 2 +- packages/fileimport-service/ifc/parser.js | 1 - packages/fileimport-service/package.json | 6 +- packages/fileimport-service/src/daemon.js | 1 - packages/frontend-2/.eslintrc.js | 129 - .../frontend-2/components/auth/LoginPanel.vue | 3 +- .../auth/RegisterWithEmailBlock.vue | 2 +- .../auth/third-party/LoginBlock.vue | 2 +- .../automate/function/CreateDialog.vue | 6 +- .../automate/functions/page/Header.vue | 7 +- .../common/tiptap/MentionListItem.vue | 1 + .../CreateEditApplicationDialog.vue | 10 +- .../error/page/ProjectInviteBanner.vue | 2 +- .../components/error/page/Renderer.vue | 2 +- .../components/form/MarkdownEditor.vue | 2 +- .../form/json/ArrayListRenderer.vue | 1 - .../form/json/DateTimeControlRenderer.vue | 1 - .../form/json/EnumOneOfControlRenderer.vue | 1 - .../frontend-2/components/header/NavShare.vue | 1 + .../components/onboarding/checklist/v1.vue | 3 +- .../components/onboarding/dialog/Manager.vue | 2 +- .../frontend-2/components/preview/Image.vue | 5 +- .../project/CommentPermissionsSelect.vue | 6 +- .../project/model-page/versions/Card.vue | 3 +- .../project/page/discussions/Header.vue | 2 +- .../components/project/page/models/Card.vue | 1 + .../components/project/page/models/Header.vue | 2 +- .../project/page/models/ListView.vue | 10 +- .../project/page/models/StructureItem.vue | 1 + .../components/project/page/team/Dialog.vue | 2 +- .../project/page/team/PermissionSelect.vue | 3 +- .../page/team/dialog/ManagePermissions.vue | 6 +- .../components/projects/invite/Banner.vue | 2 +- .../components/server-management/Table.vue | 1 + .../components/tour/Segmentation.vue | 1 + .../frontend-2/components/tour/Slideshow.vue | 2 +- .../frontend-2/components/viewer/Base.vue | 4 +- .../frontend-2/components/viewer/Controls.vue | 3 +- .../frontend-2/components/viewer/Sidebar.vue | 3 +- .../viewer/anchored-point/NewThread.vue | 3 +- .../viewer/anchored-point/Thread.vue | 2 +- .../components/viewer/comments/ListItem.vue | 2 +- .../compare-changes/ObjectGroup-old.vue | 58 - .../viewer/compare-changes/ObjectGroup.vue | 1 + .../viewer/compare-changes/Panel.vue | 4 +- .../components/viewer/dataviewer/Object.vue | 1 - .../components/viewer/dataviewer/Row.vue | 1 + .../components/viewer/explorer/Explorer.vue | 1 + .../components/viewer/explorer/Filters.vue | 2 +- .../viewer/explorer/StringFilterItem.vue | 1 + .../components/viewer/explorer/TreeItem.vue | 5 +- .../components/viewer/resources/ModelCard.vue | 1 + .../viewer/resources/VersionCard.vue | 1 + packages/frontend-2/composables/browser.ts | 3 +- packages/frontend-2/composables/env.ts | 2 +- packages/frontend-2/composables/logging.ts | 6 +- packages/frontend-2/eslint.config.mjs | 125 + packages/frontend-2/layouts/fullscreen.vue | 3 - packages/frontend-2/layouts/hydrationtest.vue | 3 - .../frontend-2/lib/auth/composables/auth.ts | 4 +- .../lib/auth/composables/onboarding.ts | 2 +- .../lib/auth/composables/postAuthRedirect.ts | 2 +- .../frontend-2/lib/common/composables/dom.ts | 2 +- .../lib/common/composables/reactiveCookie.ts | 2 +- .../lib/common/composables/scopedState.ts | 1 - .../lib/common/composables/serverInfo.ts | 2 +- .../lib/common/composables/window.ts | 10 +- .../lib/common/helpers/encodeDecode.ts | 4 +- .../frontend-2/lib/common/helpers/graphql.ts | 13 +- .../frontend-2/lib/common/helpers/route.ts | 2 +- .../frontend-2/lib/common/helpers/tailwind.ts | 1 + .../frontend-2/lib/common/helpers/tiptap.ts | 4 +- .../lib/common/helpers/validation.ts | 2 +- .../frontend-2/lib/common/utils/requests.ts | 4 +- .../frontend-2/lib/core/composables/mp.ts | 4 +- .../frontend-2/lib/core/composables/server.ts | 6 +- .../frontend-2/lib/core/configs/apollo.ts | 8 +- .../lib/core/helpers/observability.ts | 2 +- .../email-mention/findSuggestionMatch.ts | 2 +- .../core/tiptap/email-mention/suggestion.ts | 14 +- .../lib/core/tiptap/emailMentionExtension.ts | 1 - .../lib/core/tiptap/mentionExtension.ts | 2 +- .../lib/developer-settings/helpers/types.ts | 2 +- .../lib/form/composables/jsonRenderers.ts | 4 +- .../projects/composables/modelManagement.ts | 4 +- .../lib/projects/composables/previewImage.ts | 12 +- .../projects/composables/projectManagement.ts | 2 +- .../projects/composables/versionManagement.ts | 2 +- .../lib/viewer/composables/activity.ts | 3 +- .../lib/viewer/composables/anchorPoints.ts | 2 +- .../lib/viewer/composables/commentBubbles.ts | 4 +- .../viewer/composables/commentManagement.ts | 2 +- .../lib/viewer/composables/setup.ts | 28 +- .../lib/viewer/composables/setup/dev.ts | 5 +- .../lib/viewer/composables/setup/postSetup.ts | 16 +- .../frontend-2/lib/viewer/composables/ui.ts | 3 +- .../lib/viewer/composables/viewer.ts | 12 +- .../lib/viewer/extensions/PassReader.ts | 7 +- .../frontend-2/lib/viewer/helpers/three.ts | 2 +- packages/frontend-2/middleware/auth.ts | 2 +- .../middleware/dashboard-redirect.ts | 2 +- packages/frontend-2/middleware/guest.ts | 2 +- packages/frontend-2/middleware/mp.global.ts | 2 +- packages/frontend-2/nuxt.config.ts | 2 +- packages/frontend-2/package.json | 24 +- .../verify/[appId]/[challenge]/index.vue | 6 +- .../frontend-2/pages/developer-settings.vue | 2 +- packages/frontend-2/pages/downloads.vue | 4 +- packages/frontend-2/pages/index.vue | 8 +- .../projects/[id]/models/[modelId]/index.vue | 2 +- packages/frontend-2/plugins/001-logger.ts | 13 +- packages/frontend-2/plugins/002-rum.ts | 4 +- .../frontend-2/plugins/004-redis.server.ts | 2 +- packages/frontend-2/plugins/005-cache.ts | 5 +- packages/frontend-2/plugins/dev.ts | 4 +- packages/frontend-2/plugins/mp.ts | 9 +- .../server/middleware/001-logging.ts | 3 +- .../middleware/002-setIdHeaderResponse.ts | 2 +- .../eslint-only/vue-shim.d.ts | 5 +- .../frontend-2/type-augmentations/mdx.d.ts | 2 +- .../frontend-2/type-augmentations/nuxt.d.ts | 1 - .../type-augmentations/storybook.d.ts | 4 +- packages/frontend/.eslintrc.js | 68 - packages/frontend/eslint.config.mjs | 119 + packages/frontend/package.json | 15 +- packages/frontend/src/bootstrapper.ts | 1 + packages/frontend/src/config/apolloConfig.ts | 5 +- packages/frontend/src/helpers/errorHelper.ts | 12 +- packages/frontend/src/helpers/typeHelpers.ts | 1 - .../stream/uploads/FileUploadItem.vue | 2 +- .../src/main/components/user/AppNewDialog.vue | 1 - .../components/viewer/CommentsOverlay.vue | 1 + .../lib/auth/utils/postAuthRedirectManager.ts | 2 +- .../apollo/helpers/apolloOperationHelper.ts | 2 +- .../lib/common/file-upload/blobStorageApi.ts | 7 +- .../lib/common/general/helpers/errorHelper.ts | 2 +- .../commit-object-viewer/stateManager.ts | 8 +- .../lib/viewer/core/helpers/cameraHelper.ts | 2 +- .../src/main/pages/stream/TheSettings.vue | 2 +- .../src/main/pages/stream/TheStream.vue | 2 +- packages/frontend/src/plugins/helpers.ts | 3 + .../src/type-augmentations/vue-shim.d.ts | 4 + packages/frontend/tsconfig.eslint.json | 5 + packages/frontend/tsconfig.json | 2 +- packages/frontend/vite.config.js | 1 + packages/objectloader/.eslintrc.cjs | 19 - packages/objectloader/eslint.config.mjs | 28 + packages/objectloader/jsconfig.json | 2 +- packages/objectloader/package.json | 6 +- packages/preview-service/.eslintrc.js | 21 - packages/preview-service/eslint.config.mjs | 32 + packages/preview-service/package.json | 6 +- packages/preview-service/routes/preview.js | 2 +- packages/server/.eslintrc.js | 62 - packages/server/app.ts | 1 - packages/server/eslint.config.mjs | 88 + packages/server/logging/apolloPlugin.js | 1 - packages/server/logging/loggingHelper.js | 3 + .../automate/graph/resolvers/automate.ts | 4 +- .../automate/services/functionManagement.ts | 1 - .../betaAutomations/helpers/inputTypes.ts | 2 +- .../betaAutomations/services/management.ts | 2 +- packages/server/modules/blobstorage/index.js | 1 - .../modules/cli/commands/db/migrate/create.js | 2 +- .../comments/graph/resolvers/comments.js | 2 +- .../modules/core/graph/resolvers/projects.ts | 4 +- .../modules/core/graph/resolvers/users.js | 4 +- .../modules/core/graph/resolvers/versions.ts | 2 +- packages/server/modules/core/loaders.ts | 1 - .../server/modules/core/rest/authUtils.js | 12 +- packages/server/modules/core/rest/upload.js | 4 +- .../modules/core/tests/branches.spec.js | 2 +- .../modules/core/tests/commitsGraphql.spec.ts | 4 +- .../modules/core/tests/graphSubs.spec.js | 3 +- .../server/modules/core/tests/objects.spec.js | 2 +- .../server/modules/core/tests/users.spec.js | 2 +- .../emails/tests/verifications.spec.ts | 8 +- .../services/handlers/activityDigest.ts | 2 +- .../modules/notifications/services/queue.ts | 4 +- .../tests/notificationsPreferences.spec.ts | 2 +- packages/server/modules/previews/index.js | 4 +- packages/server/modules/shared/index.js | 2 +- packages/server/package.json | 4 +- .../test/speckle-helpers/automationHelper.ts | 1 - packages/shared/.eslintrc.cjs | 45 - packages/shared/eslint.config.mjs | 40 + packages/shared/package.json | 13 +- packages/shared/src/core/helpers/error.ts | 2 +- packages/shared/src/core/utils/md5.ts | 4 + packages/tailwind-theme/.eslintrc.cjs | 54 - packages/tailwind-theme/eslint.config.mjs | 63 + packages/tailwind-theme/package.json | 11 +- packages/ui-components-nuxt/.eslintrc.cjs | 15 - packages/ui-components-nuxt/eslint.config.mjs | 18 + packages/ui-components-nuxt/package.json | 9 +- packages/ui-components/.eslintrc.cjs | 118 - packages/ui-components/.storybook/main.ts | 1 + packages/ui-components/eslint.config.mjs | 153 + packages/ui-components/package.json | 17 +- .../common/animation/Instructional.vue | 4 +- .../components/common/text/Link.stories.ts | 6 +- .../src/components/form/Button.stories.ts | 6 +- .../src/components/form/CardButton.stories.ts | 10 +- .../src/components/form/Checkbox.stories.ts | 26 +- .../src/components/form/ClipboardInput.vue | 1 + .../src/components/form/Radio.stories.ts | 26 +- .../src/components/form/Tags.vue | 9 +- .../src/components/form/TextArea.stories.ts | 6 +- .../src/components/form/TextArea.vue | 1 + .../src/components/form/TextInput.vue | 1 + .../src/components/form/file-upload/Zone.vue | 1 - .../src/components/form/select/Badges.vue | 3 - .../src/components/form/select/Base.vue | 10 +- .../src/components/layout/Table.vue | 1 + .../src/components/layout/tabs/Horizontal.vue | 2 +- .../ui-components/src/composables/testing.ts | 2 +- .../src/helpers/common/components.ts | 1 - packages/ui-components/src/helpers/testing.ts | 6 +- .../src/stories/composables/toast.ts | 4 +- .../semantic-colors/SemanticColors.vue | 4 +- packages/viewer-sandbox/.eslintrc.js | 37 - packages/viewer-sandbox/eslint.config.mjs | 61 + packages/viewer-sandbox/package.json | 13 +- .../src/Extensions/BoxSelection.ts | 1 + .../src/Extensions/CameraPlanes.ts | 2 +- packages/viewer-sandbox/src/Sandbox.ts | 46 +- packages/viewer-sandbox/src/main-multi.ts | 8 +- packages/viewer-sandbox/src/main.ts | 6 +- packages/viewer/.babelrc | 15 + packages/viewer/.eslintrc.cjs | 39 - packages/viewer/babel.config.cjs | 15 - packages/viewer/eslint.config.mjs | 76 + packages/viewer/package.json | 13 +- packages/viewer/rollup.config.js | 2 +- packages/viewer/src/modules/Intersections.ts | 2 +- .../viewer/src/modules/SpeckleRenderer.ts | 9 +- packages/viewer/src/modules/Viewer.ts | 2 +- packages/viewer/src/modules/batching/Batch.ts | 2 +- .../viewer/src/modules/batching/Batcher.ts | 4 +- .../viewer/src/modules/batching/DrawRanges.ts | 4 +- .../modules/batching/InstancedBatchObject.ts | 1 - .../modules/batching/InstancedMeshBatch.ts | 11 +- .../viewer/src/modules/batching/LineBatch.ts | 10 +- .../viewer/src/modules/batching/MeshBatch.ts | 4 +- .../viewer/src/modules/batching/PointBatch.ts | 4 +- .../src/modules/batching/PrimitiveBatch.ts | 6 +- .../viewer/src/modules/batching/TextBatch.ts | 3 +- .../modules/extensions/CameraController.ts | 38 +- .../src/modules/extensions/DiffExtension.ts | 13 +- .../measurements/MeasurementPointGizmo.ts | 2 +- .../src/modules/filtering/PropertyManager.ts | 2 +- .../src/modules/loaders/OBJ/ObjConverter.ts | 2 +- .../src/modules/loaders/OBJ/ObjLoader.ts | 48 +- .../loaders/Speckle/SpeckleConverter.ts | 8 +- .../modules/loaders/Speckle/SpeckleLoader.ts | 3 +- .../viewer/src/modules/materials/Materials.ts | 6 +- .../src/modules/materials/SpeckleMaterial.ts | 12 +- .../materials/SpecklePointColouredMaterial.ts | 1 - .../modules/objects/AccelerationStructure.ts | 4 +- .../modules/objects/SpeckleCameraControls.ts | 6 +- .../modules/objects/SpeckleInstancedMesh.ts | 4 +- .../viewer/src/modules/objects/SpeckleMesh.ts | 2 +- .../viewer/src/modules/pipeline/DepthPass.ts | 8 +- .../src/modules/pipeline/DynamicAOPass.ts | 31 +- .../src/modules/pipeline/StaticAOPass.ts | 8 +- packages/viewer/tsconfig.eslint.json | 5 + packages/webhook-service/.eslintrc.js | 13 - packages/webhook-service/eslint.config.mjs | 17 + packages/webhook-service/package.json | 6 +- utils/eslint-projectwide.mjs | 115 + workspace.code-workspace | 3 +- yarn.lock | 2821 +++++++++++++++-- 299 files changed, 4353 insertions(+), 1905 deletions(-) delete mode 100644 .eslintrc.js create mode 100644 eslint.config.mjs delete mode 100644 packages/dui3/.eslintrc.js create mode 100644 packages/dui3/eslint.config.mjs delete mode 100644 packages/fileimport-service/.eslintrc.js create mode 100644 packages/fileimport-service/eslint.config.mjs delete mode 100644 packages/frontend-2/.eslintrc.js delete mode 100644 packages/frontend-2/components/viewer/compare-changes/ObjectGroup-old.vue create mode 100644 packages/frontend-2/eslint.config.mjs delete mode 100644 packages/frontend-2/layouts/fullscreen.vue delete mode 100644 packages/frontend-2/layouts/hydrationtest.vue delete mode 100644 packages/frontend/.eslintrc.js create mode 100644 packages/frontend/eslint.config.mjs create mode 100644 packages/frontend/src/type-augmentations/vue-shim.d.ts create mode 100644 packages/frontend/tsconfig.eslint.json delete mode 100644 packages/objectloader/.eslintrc.cjs create mode 100644 packages/objectloader/eslint.config.mjs delete mode 100644 packages/preview-service/.eslintrc.js create mode 100644 packages/preview-service/eslint.config.mjs delete mode 100644 packages/server/.eslintrc.js create mode 100644 packages/server/eslint.config.mjs delete mode 100644 packages/shared/.eslintrc.cjs create mode 100644 packages/shared/eslint.config.mjs delete mode 100644 packages/tailwind-theme/.eslintrc.cjs create mode 100644 packages/tailwind-theme/eslint.config.mjs delete mode 100644 packages/ui-components-nuxt/.eslintrc.cjs create mode 100644 packages/ui-components-nuxt/eslint.config.mjs delete mode 100644 packages/ui-components/.eslintrc.cjs create mode 100644 packages/ui-components/eslint.config.mjs delete mode 100644 packages/viewer-sandbox/.eslintrc.js create mode 100644 packages/viewer-sandbox/eslint.config.mjs create mode 100644 packages/viewer/.babelrc delete mode 100644 packages/viewer/.eslintrc.cjs delete mode 100644 packages/viewer/babel.config.cjs create mode 100644 packages/viewer/eslint.config.mjs create mode 100644 packages/viewer/tsconfig.eslint.json delete mode 100644 packages/webhook-service/.eslintrc.js create mode 100644 packages/webhook-service/eslint.config.mjs create mode 100644 utils/eslint-projectwide.mjs diff --git a/.circleci/config.yml b/.circleci/config.yml index b392f5c30..a61e98d50 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -452,8 +452,8 @@ jobs: working_directory: 'packages/server' - run: - name: 'Lint with TypeScript Compiler' - command: yarn lint:tsc + name: 'Lint' + command: yarn lint:ci working_directory: 'packages/server' - run: @@ -516,7 +516,7 @@ jobs: - run: name: Lint everything - command: yarn lint + command: yarn lint:ci working_directory: 'packages/frontend-2' test-viewer: @@ -550,7 +550,7 @@ jobs: - run: name: Lint everything - command: yarn lint + command: yarn lint:ci working_directory: 'packages/viewer' - run: @@ -588,17 +588,17 @@ jobs: - run: name: Lint tailwind theme - command: yarn lint + command: yarn lint:ci working_directory: 'packages/tailwind-theme' - run: name: Lint ui components - command: yarn lint + command: yarn lint:ci working_directory: 'packages/ui-components' - run: name: Lint component nuxt package - command: yarn lint + command: yarn lint:ci working_directory: 'packages/ui-components-nuxt' - run: @@ -1018,7 +1018,7 @@ jobs: command: yarn build:public - run: name: Lint viewer-sandbox - command: yarn lint + command: yarn lint:ci working_directory: 'packages/viewer-sandbox' - run: name: Build viewer-sandbox diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 716ac3a54..000000000 --- a/.eslintrc.js +++ /dev/null @@ -1,47 +0,0 @@ -/** @type {import("eslint").Linter.Config} */ -const config = { - root: true, - parserOptions: { - ecmaVersion: 2022 - }, - env: { - es2022: true, - node: true, - commonjs: true - }, - extends: ['eslint:recommended', 'prettier'], - rules: { - camelcase: [ - 1, - { - properties: 'always' - } - ], - 'no-var': 'error', - 'no-alert': 'error', - eqeqeq: 'error', - 'prefer-const': 'warn', - 'object-shorthand': 'warn' - }, - overrides: [ - { - files: '*.mjs', - parserOptions: { - sourceType: 'module' - } - } - ], - ignorePatterns: [ - 'node_modules', - 'dist', - 'dist-*', - 'public', - 'events.json', - '.*.{ts,js,vue,tsx,jsx}', - 'generated/**/*', - '.nuxt', - '.output' - ] -} - -module.exports = config diff --git a/.husky/pre-commit b/.husky/pre-commit index 9c3e8a14d..655ecfb61 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -5,7 +5,7 @@ set -e if [ -n "$CI" ] then echo "running eslint" - yarn lint + yarn eslint:projectwide echo "...eslint done" echo "running prettier" yarn prettier:check diff --git a/.prettierignore b/.prettierignore index 511e294a8..fe7c119be 100644 --- a/.prettierignore +++ b/.prettierignore @@ -15,6 +15,7 @@ packages/viewer/example/speckleviewer.web.js **/nuxt-modules/**/templates/*.js packages/frontend-2/lib/common/generated/**/* packages/dui3/lib/common/generated/**/* +packages/server/introspected-schema.graphql package-lock.json yarn.lock diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 000000000..be14e44d2 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,112 @@ +import globals from 'globals' +import js from '@eslint/js' +import prettierConfig from 'eslint-config-prettier' +import { fileURLToPath } from 'url' +import { dirname } from 'path' + +/** + * TODO: + * - Check speed (inspect ignored files, that we're not processing junk) + * - Fix lint-staged + */ + +/** + * Feed in import.meta.url in your .mjs module to get the equivalent of __dirname + * @param {string} importMetaUrl + */ +export const getESMDirname = (importMetaUrl) => { + return dirname(fileURLToPath(importMetaUrl)) +} + +/** + * Configs that should only apply to repo root (shouldn't be inherited in subdirectories) + * @type {Array} + */ +const rootConfigs = [ + { + ignores: [ + 'packages/**/*', + '.circleci', + '.devcontainer', + '.github', + '.husky', + '.vscode', + '.yarn', + 'docker', + 'node_modules', + 'test-queries', + 'setup' + ] + }, + { + files: ['*.{js,mjs,cjs}', '.*.{js,mjs,cjs}', 'utils/*.{js,mjs,cjs}'], + languageOptions: { + sourceType: 'commonjs', + globals: { + ...globals.node + } + } + }, + { + files: ['*.mjs', '.*.mjs', 'utils/*.mjs'], + languageOptions: { + sourceType: 'module' + } + } +] + +/** + * Base configs that should be inherited in all packages as well + * @type {Array} + */ +export const baseConfigs = [ + { + ignores: [ + '**/node_modules/**', + '**/dist/**', + '**/dist-*/**', + '**/public/**', + '**/events.json', + '**/generated/**/*', + '**/.nuxt/**', + '**/.output/**' + ] + }, + { + files: ['**/*.mjs'], + languageOptions: { + sourceType: 'module' + } + }, + { + files: ['**/*.cjs'], + languageOptions: { + sourceType: 'commonjs' + } + }, + { + files: ['**/*.{js,mjs,cjs}', '**/.*.{js,mjs,cjs}'], + ...js.configs.recommended + }, + prettierConfig, + { + rules: { + camelcase: [ + 1, + { + properties: 'always' + } + ], + 'no-var': 'error', + 'no-alert': 'error', + eqeqeq: 'error', + 'prefer-const': 'warn', + 'object-shorthand': 'warn' + } + } +] + +const configs = [...baseConfigs, ...rootConfigs] + +export { globals, prettierConfig } +export default configs diff --git a/lint-staged.config.js b/lint-staged.config.js index dc0068565..d605b883f 100644 --- a/lint-staged.config.js +++ b/lint-staged.config.js @@ -1,22 +1,4 @@ -const micromatch = require('micromatch') - -const extList = ['ts', 'js', 'vue', 'tsx', 'jsx', 'json'].join(',') module.exports = { - '*.{js,ts,vue}': (files) => { - const finalFiles = micromatch.not(files, [ - // Filter out files that start with a period, since they're ignored by default - `**/.*.{${extList}}`, - // Filter out generated folder files - `**/generated/**/*`, - // Filter out types in object loader - '**/packages/objectloader/types/**/*', - // Filter out nuxt plugin templates - '**/templates/plugin.js', - // ui-components ignore - '**/packages/ui-components/utils/tailwind-configure.d.ts' - ]) - - return 'eslint --cache --max-warnings=0 ' + finalFiles.join(' ') - }, + '*.{js,ts,vue,cjs,mjs,cts,mts}': 'yarn eslint:projectwide', '*.**': 'prettier --check --ignore-unknown' } diff --git a/package.json b/package.json index 8af86b2c3..1b6beb1c4 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,6 @@ "build:public": "yarn workspaces foreach -ptv --no-private run build", "build:tailwind-deps": "yarn workspaces foreach -iv -j unlimited --include '{@speckle/shared,@speckle/tailwind-theme,@speckle/ui-components}' run build", "ensure:tailwind-deps": "node ./utils/ensure-tailwind-deps.mjs", - "lint": "node --max-old-space-size=4096 ./node_modules/eslint/bin/eslint.js . --ext .js,.ts,.vue --max-warnings=0", "helm:readme:generate": "./utils/helm/update-schema-json.sh", "prettier:check": "prettier --check .", "prettier:fix": "prettier --write .", @@ -37,38 +36,47 @@ "dev:shared": "yarn workspace @speckle/shared dev", "prepare": "husky install", "postinstall": "husky install", - "cm": "cz" + "cm": "cz", + "eslint:inspect": "eslint-config-inspector", + "eslint:projectwide": "node ./utils/eslint-projectwide.mjs" }, "devDependencies": { + "@eslint/config-inspector": "^0.4.10", + "@eslint/js": "^9.4.0", "@rollup/plugin-typescript": "^11.1.0", "@swc/core": "^1.2.222", - "@types/eslint": "^8.4.1", + "@types/eslint": "^8.56.10", + "@types/eslint__js": "^8.42.3", "@types/lockfile": "^1.0.2", "commitizen": "^4.2.5", "cross-env": "^7.0.3", "cz-conventional-changelog": "^3.3.0", - "eslint": "^8.11.0", - "eslint-config-prettier": "^8.5.0", + "eslint": "^9.4.0", + "eslint-config-prettier": "^9.1.0", + "eslint-flat-config-utils": "^0.2.5", + "globals": "^15.4.0", "husky": "^7.0.4", "lint-staged": "^12.3.7", "lockfile": "^1.0.4", "pino-pretty": "^9.1.1", "prettier": "^2.5.1", "ts-node": "^10.9.1", - "tsconfig-paths": "^4.0.0" + "tsconfig-paths": "^4.0.0", + "zx": "^8.1.2" }, "resolutions": { "@babel/traverse": ">=7.23.2", "@microsoft/api-extractor/semver": "^7.5.4", "@rushstack/node-core-library/semver": "^7.5.4", - "@typescript-eslint/eslint-plugin": "^6.4.1", - "@typescript-eslint/parser": "^6.4.1", + "@typescript-eslint/eslint-plugin": "^7.12.0", + "@typescript-eslint/parser": "^7.12.0", + "typescript-eslint": "^7.12.0", "@types/react": "file:./packages/frontend-2/type-augmentations/stubs/types__react", "axios": ">=1.6.0", "core-js": "3.22.4", "core-js-compat/semver": "^7.5.4", - "eslint": "^8.11.0", - "eslint-config-prettier": "^8.5.0", + "eslint": "^9.4.0", + "eslint-config-prettier": "^9.1.0", "express": ">=4.19.2", "fast-xml-parser": ">=4.2.5", "graphql": "^15.3.0", diff --git a/packages/dui3/.eslintrc.js b/packages/dui3/.eslintrc.js deleted file mode 100644 index dbc33e71c..000000000 --- a/packages/dui3/.eslintrc.js +++ /dev/null @@ -1,119 +0,0 @@ -const mainExtends = [ - 'plugin:nuxt/recommended', - 'plugin:vue/vue3-recommended', - 'prettier' -] - -/** @type {import('eslint').Linter.Config} */ -const config = { - env: { - node: true - }, - parserOptions: { - ecmaVersion: 2020, - sourceType: 'module', - parser: '@typescript-eslint/parser', - tsconfigRootDir: __dirname, - project: ['./tsconfig.eslint.json'], - extraFileExtensions: ['.vue'] - }, - extends: [...mainExtends], - plugins: ['@typescript-eslint'], - ignorePatterns: [ - '**/templates/*', - 'coverage', - 'lib/common/generated/**/*', - 'storybook-static', - '!.storybook', - '.nuxt', - '.output' - ], - rules: { - camelcase: [ - 'error', - { - properties: 'always', - allow: ['^[\\w]+_[\\w]+Fragment$'] - } - ], - 'no-alert': 'error', - eqeqeq: ['error', 'always', { null: 'always' }], - 'no-console': 'off', - 'no-var': 'error' - }, - overrides: [ - { - files: '*.test.{ts,js}', - env: { - jest: true - } - }, - { - files: './{components|pages|store|lib}/*.{js,ts,vue}', - env: { - node: false, - browser: true - } - }, - { - files: '*.{ts,tsx,vue}', - extends: ['plugin:@typescript-eslint/recommended', ...mainExtends], - rules: { - '@typescript-eslint/no-explicit-any': ['error'], - '@typescript-eslint/no-unsafe-argument': ['error'], - '@typescript-eslint/no-unsafe-assignment': 'error', - '@typescript-eslint/no-unsafe-call': 'error', - '@typescript-eslint/no-unsafe-member-access': 'error', - '@typescript-eslint/no-unsafe-return': 'error', - '@typescript-eslint/no-for-in-array': ['error'], - '@typescript-eslint/restrict-template-expressions': ['error'], - '@typescript-eslint/restrict-plus-operands': ['error'], - '@typescript-eslint/await-thenable': ['warn'], - '@typescript-eslint/ban-types': ['warn'], - 'require-await': 'off', - '@typescript-eslint/require-await': 'error', - 'no-undef': 'off' - } - }, - { - files: '*.vue', - plugins: ['vuejs-accessibility'], - extends: [ - 'plugin:@typescript-eslint/recommended', - ...mainExtends, - 'plugin:vuejs-accessibility/recommended' - ], - rules: { - 'vue/component-tags-order': [ - 'error', - { order: ['docs', 'template', 'script', 'style'] } - ], - 'vue/require-default-prop': 'off', - 'vue/multi-word-component-names': 'off', - 'vue/component-name-in-template-casing': [ - 'error', - 'PascalCase', - { registeredComponentsOnly: false } - ], - 'vuejs-accessibility/label-has-for': [ - 'error', - { - required: { - some: ['nesting', 'id'] - } - } - ] - } - }, - { - files: '*.d.ts', - rules: { - 'no-var': 'off', - '@typescript-eslint/no-explicit-any': 'off', - '@typescript-eslint/ban-types': 'off' - } - } - ] -} - -module.exports = config diff --git a/packages/dui3/components/header/UserAccount.vue b/packages/dui3/components/header/UserAccount.vue index 9e0608bfb..d66d50b05 100644 --- a/packages/dui3/components/header/UserAccount.vue +++ b/packages/dui3/components/header/UserAccount.vue @@ -26,7 +26,7 @@ diff --git a/packages/frontend-2/components/form/MarkdownEditor.vue b/packages/frontend-2/components/form/MarkdownEditor.vue index 36d78fa95..72c4e0f1b 100644 --- a/packages/frontend-2/components/form/MarkdownEditor.vue +++ b/packages/frontend-2/components/form/MarkdownEditor.vue @@ -63,7 +63,7 @@ const props = withDefaults( defineModel() const { value } = useField(props.name, props.rules) -const body = computed(() => (process.client ? document.body : undefined)) +const body = computed(() => (import.meta.client ? document.body : undefined)) const isEditing = ref(true) const isPreviewDisabled = computed(() => !(value.value || '').trim().length) diff --git a/packages/frontend-2/components/form/json/ArrayListRenderer.vue b/packages/frontend-2/components/form/json/ArrayListRenderer.vue index 0bdb37954..330756e28 100644 --- a/packages/frontend-2/components/form/json/ArrayListRenderer.vue +++ b/packages/frontend-2/components/form/json/ArrayListRenderer.vue @@ -128,7 +128,6 @@ const onAdd = () => { const path = control.value.path const val = createDefaultValue(control.value.schema, props.schema) - // eslint-disable-next-line @typescript-eslint/unbound-method const addItem = baseControl.addItem if (!addItem) return diff --git a/packages/frontend-2/components/form/json/DateTimeControlRenderer.vue b/packages/frontend-2/components/form/json/DateTimeControlRenderer.vue index 9c25d1b36..a09cbc167 100644 --- a/packages/frontend-2/components/form/json/DateTimeControlRenderer.vue +++ b/packages/frontend-2/components/form/json/DateTimeControlRenderer.vue @@ -43,7 +43,6 @@ const { onChangeValueConverter: (val) => toISOString(val as string) }) -// eslint-disable-next-line @typescript-eslint/restrict-template-expressions const modelValue = computed(() => control.value.data ? (control.value.data as string).replace(zuluTimeSuffix, '') diff --git a/packages/frontend-2/components/form/json/EnumOneOfControlRenderer.vue b/packages/frontend-2/components/form/json/EnumOneOfControlRenderer.vue index 1f8c4512f..3d8d8af9b 100644 --- a/packages/frontend-2/components/form/json/EnumOneOfControlRenderer.vue +++ b/packages/frontend-2/components/form/json/EnumOneOfControlRenderer.vue @@ -13,6 +13,5 @@ const props = defineProps({ ...rendererProps() }) -// eslint-disable-next-line @typescript-eslint/unbound-method const controlOverrides = useJsonFormsOneOfEnumControl(props) diff --git a/packages/frontend-2/components/header/NavShare.vue b/packages/frontend-2/components/header/NavShare.vue index 79aa7fef9..7c7b84241 100644 --- a/packages/frontend-2/components/header/NavShare.vue +++ b/packages/frontend-2/components/header/NavShare.vue @@ -1,3 +1,4 @@ +