From a2c45e5fa432bff1882c8eb1cf7e0390f682c169 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Thu, 2 Nov 2023 16:49:32 +0100 Subject: [PATCH 01/17] add rule to detect erroneous external imports --- src/Umbraco.Web.UI.Client/.eslintrc.json | 1 + .../eslint-local-rules.cjs | 33 +++++++++++++++++++ .../src/external/monaco-editor/index.ts | 1 + .../src/external/sanitize-html/index.ts | 1 + .../src/external/tinymce/index.ts | 1 + 5 files changed, 37 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/.eslintrc.json b/src/Umbraco.Web.UI.Client/.eslintrc.json index a7d9de717b..9f44b216df 100644 --- a/src/Umbraco.Web.UI.Client/.eslintrc.json +++ b/src/Umbraco.Web.UI.Client/.eslintrc.json @@ -45,6 +45,7 @@ "local-rules/umb-class-prefix": "error", "local-rules/prefer-static-styles-last": "warn", "local-rules/ensure-relative-import-use-js-extension": "error", + "local-rules/ensure-no-external-imports": "error", "@typescript-eslint/no-non-null-assertion": "off", "@typescript-eslint/no-explicit-any": "warn", "@typescript-eslint/no-unused-vars": "warn" diff --git a/src/Umbraco.Web.UI.Client/eslint-local-rules.cjs b/src/Umbraco.Web.UI.Client/eslint-local-rules.cjs index fe792cca15..5894520a6d 100644 --- a/src/Umbraco.Web.UI.Client/eslint-local-rules.cjs +++ b/src/Umbraco.Web.UI.Client/eslint-local-rules.cjs @@ -338,4 +338,37 @@ module.exports = { }; }, }, + + /** @type {import('eslint').Rule.RuleModule}*/ + 'ensure-no-external-imports': { + meta: { + type: 'problem', + docs: { + description: 'Ensures that the application does not rely on imports from external packages.', + category: 'Best Practices', + recommended: true, + }, + fixable: 'code', + schema: [], + }, + create: (context) => { + return { + ImportDeclaration: (node) => { + const { source } = node; + const { value } = source; + + // If import starts with any of the following, then it's allowed + if (['@umbraco-cms', '.'].some(v => value.startsWith(v))) { + return; + } + + context.report({ + node, + message: 'External imports are not allowed.', + fix: (fixer) => fixer.replaceText(source, `'@umbraco-cms/backoffice/external${value.startsWith('/') ? '' : '/'}${value}'`), + }); + }, + }; + }, + }, }; diff --git a/src/Umbraco.Web.UI.Client/src/external/monaco-editor/index.ts b/src/Umbraco.Web.UI.Client/src/external/monaco-editor/index.ts index 82dd0fdf1e..cccc163e31 100644 --- a/src/Umbraco.Web.UI.Client/src/external/monaco-editor/index.ts +++ b/src/Umbraco.Web.UI.Client/src/external/monaco-editor/index.ts @@ -1,3 +1,4 @@ +/* eslint local-rules/ensure-no-external-imports: 0 */ import styles from 'monaco-editor/min/vs/editor/editor.main.css'; //eslint-disable-next-line import editorWorker from 'monaco-editor/esm/vs/editor/editor.worker.js?worker'; diff --git a/src/Umbraco.Web.UI.Client/src/external/sanitize-html/index.ts b/src/Umbraco.Web.UI.Client/src/external/sanitize-html/index.ts index 28165fbc7b..d4516bf03f 100644 --- a/src/Umbraco.Web.UI.Client/src/external/sanitize-html/index.ts +++ b/src/Umbraco.Web.UI.Client/src/external/sanitize-html/index.ts @@ -1,3 +1,4 @@ +/* eslint local-rules/ensure-no-external-imports: 0 */ import DOMPurify from 'dompurify'; const sanitizeHtml = DOMPurify.sanitize; diff --git a/src/Umbraco.Web.UI.Client/src/external/tinymce/index.ts b/src/Umbraco.Web.UI.Client/src/external/tinymce/index.ts index d9c64f3c1b..2e9b865984 100644 --- a/src/Umbraco.Web.UI.Client/src/external/tinymce/index.ts +++ b/src/Umbraco.Web.UI.Client/src/external/tinymce/index.ts @@ -1,3 +1,4 @@ +/* eslint local-rules/ensure-no-external-imports: 0 */ /** * TinyMce is a CommonJS module, but in order to make @web/test-runner happy * we need to load it as a module and then manually register it in the browser From 5521a60c298ffa117eaacf22ac5eaf50d8c7ac09 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Thu, 2 Nov 2023 16:54:45 +0100 Subject: [PATCH 02/17] fix import paths --- .../src/packages/tags/repository/sources/tag.server.data.ts | 1 - .../scripts/workspace/scripts-workspace-edit.element.ts | 1 - .../stylesheets/repository/stylesheet.repository.ts | 4 ++-- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/tags/repository/sources/tag.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/tags/repository/sources/tag.server.data.ts index 05448c1729..5ed957c585 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tags/repository/sources/tag.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tags/repository/sources/tag.server.data.ts @@ -1,4 +1,3 @@ -import { v4 as uuidv4 } from 'uuid'; import { TagResource } from '@umbraco-cms/backoffice/backend-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace-edit.element.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace-edit.element.ts index 6d5fadb5a0..0b20565080 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace-edit.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace-edit.element.ts @@ -1,4 +1,3 @@ -import _ from 'lodash'; import { UmbScriptsWorkspaceContext } from './scripts-workspace.context.js'; import type { UmbCodeEditorElement } from '@umbraco-cms/backoffice/code-editor'; import { UUITextStyles, UUIInputElement } from '@umbraco-cms/backoffice/external/uui'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/stylesheet.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/stylesheet.repository.ts index c5bc6d02d8..40d993430e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/stylesheet.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/stylesheet.repository.ts @@ -1,5 +1,4 @@ -import { Observable } from 'rxjs'; -import { StylesheetDetails } from '../index.js'; +import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; import { UmbStylesheetTreeStore, UMB_STYLESHEET_TREE_STORE_CONTEXT_TOKEN } from './stylesheet.tree.store.js'; import { UmbStylesheetTreeServerDataSource } from './sources/stylesheet.tree.server.data.js'; import { UmbStylesheetServerDataSource } from './sources/stylesheet.server.data.js'; @@ -35,6 +34,7 @@ import { UpdateTextFileViewModelBaseModel, } from '@umbraco-cms/backoffice/backend-api'; import type { UmbTreeRootFileSystemModel } from '@umbraco-cms/backoffice/tree'; +import { StylesheetDetails } from "../index"; export class UmbStylesheetRepository implements From 56eb389a7db83b1ea4f0ff27a1b18159195ca482 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Fri, 3 Nov 2023 08:56:40 +0100 Subject: [PATCH 03/17] add exemptions to rule --- src/Umbraco.Web.UI.Client/eslint-local-rules.cjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/eslint-local-rules.cjs b/src/Umbraco.Web.UI.Client/eslint-local-rules.cjs index 5894520a6d..25ecf8d45a 100644 --- a/src/Umbraco.Web.UI.Client/eslint-local-rules.cjs +++ b/src/Umbraco.Web.UI.Client/eslint-local-rules.cjs @@ -358,7 +358,7 @@ module.exports = { const { value } = source; // If import starts with any of the following, then it's allowed - if (['@umbraco-cms', '.'].some(v => value.startsWith(v))) { + if (['@umbraco-cms', '@open-wc/testing', '@storybook', '.'].some(v => value.startsWith(v))) { return; } From 8d0e60e5b1f844c3bbe9ea705b0bca34ac6cbf5f Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Fri, 3 Nov 2023 09:11:15 +0100 Subject: [PATCH 04/17] do not lint temp "auth" app --- src/Umbraco.Web.UI.Client/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json index 96db51c302..6c21f39d26 100644 --- a/src/Umbraco.Web.UI.Client/package.json +++ b/src/Umbraco.Web.UI.Client/package.json @@ -101,7 +101,7 @@ "auth:test:e2e": "npx playwright test --config apps/auth/", "backoffice:test:e2e": "npx playwright test", "test:e2e": "npm run auth:test:e2e && npm run backoffice:test:e2e", - "lint": "eslint src apps e2e", + "lint": "eslint src e2e", "lint:errors": "npm run lint -- --quiet", "lint:fix": "npm run lint -- --fix", "format": "prettier 'src/**/*.ts' -- check", From 3a02c8f950a57903e564b4032f5e8a402bc78589 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Fri, 3 Nov 2023 09:12:05 +0100 Subject: [PATCH 05/17] do not lint e2e files --- src/Umbraco.Web.UI.Client/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json index 6c21f39d26..dec7155a87 100644 --- a/src/Umbraco.Web.UI.Client/package.json +++ b/src/Umbraco.Web.UI.Client/package.json @@ -101,7 +101,7 @@ "auth:test:e2e": "npx playwright test --config apps/auth/", "backoffice:test:e2e": "npx playwright test", "test:e2e": "npm run auth:test:e2e && npm run backoffice:test:e2e", - "lint": "eslint src e2e", + "lint": "eslint src", "lint:errors": "npm run lint -- --quiet", "lint:fix": "npm run lint -- --fix", "format": "prettier 'src/**/*.ts' -- check", From 838c78be5da34b505ff2796c1e61bf7f614cf131 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Fri, 3 Nov 2023 09:17:01 +0100 Subject: [PATCH 06/17] update import paths --- .../extension-api/functions/create-extension-element.test.ts | 2 +- .../src/packages/core/extension-registry/conditions/types.ts | 2 +- .../core/localization/stories/localize.element.stories.ts | 2 +- .../section-sidebar-menu-with-entity-actions.stories.ts | 4 ++-- .../src/packages/core/sorter/stories/sorter.stories.ts | 2 +- .../repository/document-permission.repository.ts | 1 - 6 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/functions/create-extension-element.test.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/functions/create-extension-element.test.ts index b4b71293c5..a8d72ec33b 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/functions/create-extension-element.test.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/functions/create-extension-element.test.ts @@ -1,5 +1,5 @@ import { expect } from '@open-wc/testing'; -import { customElement } from 'lit/decorators.js'; +import { customElement } from '@umbraco-cms/backoffice/external/lit'; import { ManifestElement, ManifestElementAndApi } from '../types.js'; import { createExtensionElement } from './create-extension-element.function.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/conditions/types.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/conditions/types.ts index 164b747814..5d1af76d3f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/conditions/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/conditions/types.ts @@ -1,6 +1,6 @@ -import type { UserPermissionConditionConfig } from '@umbraco-cms/backoffice/user-permission'; import type { SectionAliasConditionConfig } from './section-alias.condition.js'; import type { SwitchConditionConfig } from './switch.condition.js'; +import type { UserPermissionConditionConfig } from '@umbraco-cms/backoffice/user-permission'; import type { WorkspaceAliasConditionConfig, WorkspaceEntityTypeConditionConfig, diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/stories/localize.element.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/stories/localize.element.stories.ts index 8942a47c78..89570ef7fd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/localization/stories/localize.element.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/stories/localize.element.stories.ts @@ -1,6 +1,6 @@ import { Meta, StoryObj } from '@storybook/web-components'; -import { html } from 'lit'; import type { UmbLocalizeElement } from '../localize.element.js'; +import { html } from '@umbraco-cms/backoffice/external/lit'; import '../localize.element.js'; const meta: Meta = { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/section/section-sidebar-menu-with-entity-actions/section-sidebar-menu-with-entity-actions.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/core/section/section-sidebar-menu-with-entity-actions/section-sidebar-menu-with-entity-actions.stories.ts index 2be90d9121..6c391ed1b5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/section/section-sidebar-menu-with-entity-actions/section-sidebar-menu-with-entity-actions.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/section/section-sidebar-menu-with-entity-actions/section-sidebar-menu-with-entity-actions.stories.ts @@ -1,7 +1,7 @@ import { Meta, Story } from '@storybook/web-components'; -import { html } from 'lit'; - import type { UmbSectionSidebarMenuWithEntityActionsElement } from './section-sidebar-menu-with-entity-actions.element.js'; +import { html } from '@umbraco-cms/backoffice/external/lit'; + import './section-sidebar-menu-with-entity-actions.element.js'; export default { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/sorter/stories/sorter.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/core/sorter/stories/sorter.stories.ts index 48ffc0ff0d..e121ecaf49 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/sorter/stories/sorter.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/sorter/stories/sorter.stories.ts @@ -1,6 +1,6 @@ import { Meta, StoryObj } from '@storybook/web-components'; -import { html } from 'lit'; import type UmbTestSorterControllerElement from './test-sorter-controller.element.js'; +import { html } from '@umbraco-cms/backoffice/external/lit'; import './test-sorter-controller.element.js'; const meta: Meta = { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/repository/document-permission.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/repository/document-permission.repository.ts index dd5c7bab41..d4ec7a873f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/repository/document-permission.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/repository/document-permission.repository.ts @@ -1,4 +1,3 @@ -import { t } from 'msw/lib/glossary-de6278a9.js'; import { UmbDocumentPermissionServerDataSource } from './document-permission.server.data.js'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; From 64df3e278c017702bcfe80bff3824a890659fa19 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Fri, 3 Nov 2023 09:17:13 +0100 Subject: [PATCH 07/17] merge imports --- .../templates/modals/query-builder/query-builder.element.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/modals/query-builder/query-builder.element.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/modals/query-builder/query-builder.element.ts index 6da949f83d..790766c938 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/modals/query-builder/query-builder.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/modals/query-builder/query-builder.element.ts @@ -2,8 +2,8 @@ import { UmbTemplateRepository } from '../../repository/template.repository.js'; import type { UmbQueryBuilderFilterElement } from './query-builder-filter.element.js'; import { UUIComboboxListElement } from '@umbraco-cms/backoffice/external/uui'; import { css, html, customElement, state, query, queryAll } from '@umbraco-cms/backoffice/external/lit'; -import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; import { + UmbModalBaseElement , UMB_DOCUMENT_PICKER_MODAL, UMB_MODAL_MANAGER_CONTEXT_TOKEN, UmbModalManagerContext, From 00821be558a3d4bd53ee8ca971ecd8bc8cb0a823 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Fri, 3 Nov 2023 09:17:32 +0100 Subject: [PATCH 08/17] sort imports --- .../stylesheets/repository/stylesheet.repository.ts | 4 ++-- .../stylesheet-workspace-view-code-editor.element.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/stylesheet.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/stylesheet.repository.ts index 40d993430e..2fcd8edac9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/stylesheet.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/stylesheet.repository.ts @@ -1,4 +1,4 @@ -import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; +import { StylesheetDetails } from '../index.js'; import { UmbStylesheetTreeStore, UMB_STYLESHEET_TREE_STORE_CONTEXT_TOKEN } from './stylesheet.tree.store.js'; import { UmbStylesheetTreeServerDataSource } from './sources/stylesheet.tree.server.data.js'; import { UmbStylesheetServerDataSource } from './sources/stylesheet.server.data.js'; @@ -6,6 +6,7 @@ import { StylesheetGetFolderResponse, UmbStylesheetFolderServerDataSource, } from './sources/stylesheet.folder.server.data.js'; +import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; import { @@ -34,7 +35,6 @@ import { UpdateTextFileViewModelBaseModel, } from '@umbraco-cms/backoffice/backend-api'; import type { UmbTreeRootFileSystemModel } from '@umbraco-cms/backoffice/tree'; -import { StylesheetDetails } from "../index"; export class UmbStylesheetRepository implements diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/views/code-editor/stylesheet-workspace-view-code-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/views/code-editor/stylesheet-workspace-view-code-editor.element.ts index e2ae050610..7232637388 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/views/code-editor/stylesheet-workspace-view-code-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/views/code-editor/stylesheet-workspace-view-code-editor.element.ts @@ -1,5 +1,5 @@ -import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UMB_STYLESHEET_WORKSPACE_CONTEXT, UmbStylesheetWorkspaceContext } from '../../stylesheet-workspace.context.js'; +import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { UmbCodeEditorElement } from '@umbraco-cms/backoffice/code-editor'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; From 6c7043cbe823c17018953e794fe89943c8b465b1 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Fri, 3 Nov 2023 09:18:13 +0100 Subject: [PATCH 09/17] update imports --- .../src/shared/utils/media-helper.service.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/shared/utils/media-helper.service.ts b/src/Umbraco.Web.UI.Client/src/shared/utils/media-helper.service.ts index 1e7ea8f109..b5f01cf9cc 100644 --- a/src/Umbraco.Web.UI.Client/src/shared/utils/media-helper.service.ts +++ b/src/Umbraco.Web.UI.Client/src/shared/utils/media-helper.service.ts @@ -2,7 +2,7 @@ // contains only functions referenced by the TinyMCE editor // TODO: This should not be done in this way, we need to split this into seperate defined helper methods. This is also very specific to TinyMCE, so should be named that way. -import { Editor, EditorEvent } from 'tinymce'; +import { tinymce } from '@umbraco-cms/backoffice/external/tinymce'; export class UmbMediaHelper { /** @@ -11,7 +11,7 @@ export class UmbMediaHelper { * @param imageDomElement * @param imgUrl */ - async sizeImageInEditor(editor: Editor, imageDomElement: HTMLElement, imgUrl?: string) { + async sizeImageInEditor(editor: tinymce.Editor, imageDomElement: HTMLElement, imgUrl?: string) { const size = editor.dom.getSize(imageDomElement); const maxImageSize = editor.options.get('maxImageSize'); @@ -94,7 +94,7 @@ export class UmbMediaHelper { * * @param editor */ - async uploadBlobImages(editor: Editor) { + async uploadBlobImages(editor: tinymce.Editor) { const content = editor.getContent(); // Upload BLOB images (dragged/pasted ones) @@ -168,7 +168,7 @@ export class UmbMediaHelper { * @returns */ async onResize( - e: EditorEvent<{ + e: tinymce.EditorEvent<{ target: HTMLElement; width: number; height: number; From 2a119541e34f9ac4f006adc71ebac9e86440ac05 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Fri, 3 Nov 2023 09:18:23 +0100 Subject: [PATCH 10/17] add msw as exemption --- src/Umbraco.Web.UI.Client/eslint-local-rules.cjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/eslint-local-rules.cjs b/src/Umbraco.Web.UI.Client/eslint-local-rules.cjs index 25ecf8d45a..015b53aadd 100644 --- a/src/Umbraco.Web.UI.Client/eslint-local-rules.cjs +++ b/src/Umbraco.Web.UI.Client/eslint-local-rules.cjs @@ -358,7 +358,7 @@ module.exports = { const { value } = source; // If import starts with any of the following, then it's allowed - if (['@umbraco-cms', '@open-wc/testing', '@storybook', '.'].some(v => value.startsWith(v))) { + if (['@umbraco-cms', '@open-wc/testing', '@storybook', 'msw', '.'].some(v => value.startsWith(v))) { return; } From 1617ce0c44fc6e4be1b1d008b2f7f64b21991775 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Fri, 3 Nov 2023 09:23:02 +0100 Subject: [PATCH 11/17] sort imports --- .../extension-api/functions/create-extension-element.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/functions/create-extension-element.test.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/functions/create-extension-element.test.ts index a8d72ec33b..a19728584d 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/functions/create-extension-element.test.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/functions/create-extension-element.test.ts @@ -1,7 +1,7 @@ import { expect } from '@open-wc/testing'; -import { customElement } from '@umbraco-cms/backoffice/external/lit'; import { ManifestElement, ManifestElementAndApi } from '../types.js'; import { createExtensionElement } from './create-extension-element.function.js'; +import { customElement } from '@umbraco-cms/backoffice/external/lit'; From 18af6fb55fab4094d26967f48c1a5de35e53a234 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Fri, 3 Nov 2023 10:48:51 +0100 Subject: [PATCH 12/17] remove app-error.js import since it is dynamically imported from app.element.ts --- src/Umbraco.Web.UI.Client/src/apps/app/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/apps/app/index.ts b/src/Umbraco.Web.UI.Client/src/apps/app/index.ts index fbe9620147..2e3ad48cc8 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/app/index.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/app/index.ts @@ -1,4 +1,3 @@ export * from './app-context-config.interface.js'; -export * from './app-error.element.js'; export * from './app.element.js'; export * from './app.context.js'; From 0bf9c0faef6b2415a2941571206902ee10c58cb1 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Fri, 3 Nov 2023 10:52:13 +0100 Subject: [PATCH 13/17] remove import that is also made dynamically --- src/Umbraco.Web.UI.Client/src/packages/core/section/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/section/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/section/index.ts index 8c6ea0808a..19f19d7935 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/section/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/section/index.ts @@ -3,6 +3,5 @@ export * from './section-sidebar/index.js'; export * from './section-sidebar-context-menu/index.js'; export * from './section-sidebar-menu/index.js'; export * from './section-sidebar-menu-with-entity-actions/index.js'; -export * from './section-main-views/index.js'; export * from './section-default.element.js'; export * from './section.context.js'; From d3edbdb00b64212503a90ec63bbad74573615bba Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Fri, 3 Nov 2023 10:52:22 +0100 Subject: [PATCH 14/17] remove unused property --- .../stylesheets/workspace/stylesheet-workspace.element.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.element.ts index 5948f25b30..76485ab439 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.element.ts @@ -1,7 +1,6 @@ import { serverFilePathFromUrlFriendlyPath } from '../../utils.js'; -import { UmbStylesheetWorkspaceEditorElement } from './stylesheet-workspace-editor.element.js'; import { UmbStylesheetWorkspaceContext } from './stylesheet-workspace.context.js'; -import { UmbTextStyles } from "@umbraco-cms/backoffice/style"; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import type { UmbRoute } from '@umbraco-cms/backoffice/router'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @@ -10,7 +9,6 @@ import { UmbWorkspaceIsNewRedirectController } from '@umbraco-cms/backoffice/wor @customElement('umb-stylesheet-workspace') export class UmbStylesheetWorkspaceElement extends UmbLitElement { #workspaceContext = new UmbStylesheetWorkspaceContext(this); - #element = new UmbStylesheetWorkspaceEditorElement(); @state() _routes: UmbRoute[] = [ From eb7c95207400d14eb2e119ee005ad2dc8f42a6a8 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Mon, 6 Nov 2023 09:45:03 +0100 Subject: [PATCH 15/17] move exceptions to .eslintrc config --- src/Umbraco.Web.UI.Client/.eslintrc.json | 7 ++++++- .../eslint-local-rules.cjs | 21 ++++++++++++++++--- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/.eslintrc.json b/src/Umbraco.Web.UI.Client/.eslintrc.json index 9f44b216df..7bd88d19e9 100644 --- a/src/Umbraco.Web.UI.Client/.eslintrc.json +++ b/src/Umbraco.Web.UI.Client/.eslintrc.json @@ -45,7 +45,12 @@ "local-rules/umb-class-prefix": "error", "local-rules/prefer-static-styles-last": "warn", "local-rules/ensure-relative-import-use-js-extension": "error", - "local-rules/ensure-no-external-imports": "error", + "local-rules/ensure-no-external-imports": [ + "error", + { + "exceptions": ["@umbraco-cms", "@open-wc/testing", "@storybook", "msw", "."] + } + ], "@typescript-eslint/no-non-null-assertion": "off", "@typescript-eslint/no-explicit-any": "warn", "@typescript-eslint/no-unused-vars": "warn" diff --git a/src/Umbraco.Web.UI.Client/eslint-local-rules.cjs b/src/Umbraco.Web.UI.Client/eslint-local-rules.cjs index 015b53aadd..8a7a9d1d1c 100644 --- a/src/Umbraco.Web.UI.Client/eslint-local-rules.cjs +++ b/src/Umbraco.Web.UI.Client/eslint-local-rules.cjs @@ -345,11 +345,23 @@ module.exports = { type: 'problem', docs: { description: 'Ensures that the application does not rely on imports from external packages.', - category: 'Best Practices', recommended: true, }, fixable: 'code', - schema: [], + schema: { + type: "array", + minItems: 0, + maxItems: 1, + items: [ + { + type: "object", + properties: { + exceptions: { type: "array" } + }, + additionalProperties: false + } + ] + } }, create: (context) => { return { @@ -357,8 +369,11 @@ module.exports = { const { source } = node; const { value } = source; + const options = context.options[0] || {}; + const exceptions = options.exceptions || []; + // If import starts with any of the following, then it's allowed - if (['@umbraco-cms', '@open-wc/testing', '@storybook', 'msw', '.'].some(v => value.startsWith(v))) { + if (exceptions.some(v => value.startsWith(v))) { return; } From d9cb5e98ebd2ad5ea074f7125847017ea381025d Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Mon, 6 Nov 2023 09:47:26 +0100 Subject: [PATCH 16/17] extend explanation --- src/Umbraco.Web.UI.Client/eslint-local-rules.cjs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/eslint-local-rules.cjs b/src/Umbraco.Web.UI.Client/eslint-local-rules.cjs index 8a7a9d1d1c..7460abab82 100644 --- a/src/Umbraco.Web.UI.Client/eslint-local-rules.cjs +++ b/src/Umbraco.Web.UI.Client/eslint-local-rules.cjs @@ -344,7 +344,7 @@ module.exports = { meta: { type: 'problem', docs: { - description: 'Ensures that the application does not rely on imports from external packages.', + description: 'Ensures that the application strictly uses node_modules imports from `@umbraco-cms/backoffice/external`. This is needed to run the application in the browser.', recommended: true, }, fixable: 'code', @@ -379,7 +379,7 @@ module.exports = { context.report({ node, - message: 'External imports are not allowed.', + message: 'node_modules imports should be proxied through `@umbraco-cms/backoffice/external`. Please create it if it does not exist.', fix: (fixer) => fixer.replaceText(source, `'@umbraco-cms/backoffice/external${value.startsWith('/') ? '' : '/'}${value}'`), }); }, From 170169a2caabd42253274d49978f986a50f43d91 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Mon, 6 Nov 2023 10:18:16 +0100 Subject: [PATCH 17/17] rename eslint rule --- src/Umbraco.Web.UI.Client/.eslintrc.json | 2 +- src/Umbraco.Web.UI.Client/eslint-local-rules.cjs | 2 +- src/Umbraco.Web.UI.Client/src/external/monaco-editor/index.ts | 2 +- src/Umbraco.Web.UI.Client/src/external/sanitize-html/index.ts | 2 +- src/Umbraco.Web.UI.Client/src/external/tinymce/index.ts | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/.eslintrc.json b/src/Umbraco.Web.UI.Client/.eslintrc.json index 7bd88d19e9..6e166bb9c9 100644 --- a/src/Umbraco.Web.UI.Client/.eslintrc.json +++ b/src/Umbraco.Web.UI.Client/.eslintrc.json @@ -45,7 +45,7 @@ "local-rules/umb-class-prefix": "error", "local-rules/prefer-static-styles-last": "warn", "local-rules/ensure-relative-import-use-js-extension": "error", - "local-rules/ensure-no-external-imports": [ + "local-rules/enforce-umbraco-external-imports": [ "error", { "exceptions": ["@umbraco-cms", "@open-wc/testing", "@storybook", "msw", "."] diff --git a/src/Umbraco.Web.UI.Client/eslint-local-rules.cjs b/src/Umbraco.Web.UI.Client/eslint-local-rules.cjs index 7460abab82..e5642b64b7 100644 --- a/src/Umbraco.Web.UI.Client/eslint-local-rules.cjs +++ b/src/Umbraco.Web.UI.Client/eslint-local-rules.cjs @@ -340,7 +340,7 @@ module.exports = { }, /** @type {import('eslint').Rule.RuleModule}*/ - 'ensure-no-external-imports': { + 'enforce-umbraco-external-imports': { meta: { type: 'problem', docs: { diff --git a/src/Umbraco.Web.UI.Client/src/external/monaco-editor/index.ts b/src/Umbraco.Web.UI.Client/src/external/monaco-editor/index.ts index cccc163e31..b3fa3e2f46 100644 --- a/src/Umbraco.Web.UI.Client/src/external/monaco-editor/index.ts +++ b/src/Umbraco.Web.UI.Client/src/external/monaco-editor/index.ts @@ -1,4 +1,4 @@ -/* eslint local-rules/ensure-no-external-imports: 0 */ +/* eslint local-rules/enforce-umbraco-external-imports: 0 */ import styles from 'monaco-editor/min/vs/editor/editor.main.css'; //eslint-disable-next-line import editorWorker from 'monaco-editor/esm/vs/editor/editor.worker.js?worker'; diff --git a/src/Umbraco.Web.UI.Client/src/external/sanitize-html/index.ts b/src/Umbraco.Web.UI.Client/src/external/sanitize-html/index.ts index d4516bf03f..c05512948b 100644 --- a/src/Umbraco.Web.UI.Client/src/external/sanitize-html/index.ts +++ b/src/Umbraco.Web.UI.Client/src/external/sanitize-html/index.ts @@ -1,4 +1,4 @@ -/* eslint local-rules/ensure-no-external-imports: 0 */ +/* eslint local-rules/enforce-umbraco-external-imports: 0 */ import DOMPurify from 'dompurify'; const sanitizeHtml = DOMPurify.sanitize; diff --git a/src/Umbraco.Web.UI.Client/src/external/tinymce/index.ts b/src/Umbraco.Web.UI.Client/src/external/tinymce/index.ts index 2e9b865984..9ffe9a2093 100644 --- a/src/Umbraco.Web.UI.Client/src/external/tinymce/index.ts +++ b/src/Umbraco.Web.UI.Client/src/external/tinymce/index.ts @@ -1,4 +1,4 @@ -/* eslint local-rules/ensure-no-external-imports: 0 */ +/* eslint local-rules/enforce-umbraco-external-imports: 0 */ /** * TinyMce is a CommonJS module, but in order to make @web/test-runner happy * we need to load it as a module and then manually register it in the browser