typo3-typescript-sources 14.3.8 → 14.3.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. package/.github/workflows/sync-and-publish.yml +240 -191
  2. package/.last-synced-tag +1 -1
  3. package/README.md +13 -5
  4. package/adminpanel/admin-panel.ts +22 -22
  5. package/adminpanel/modules/cache.ts +3 -3
  6. package/backend/action-dispatcher.ts +8 -3
  7. package/backend/bookmark/bookmark-store.ts +5 -5
  8. package/backend/clipboard-panel.ts +2 -2
  9. package/backend/code-editor/element/code-mirror-element.ts +1 -1
  10. package/backend/code-editor/language/typoscript.ts +3 -3
  11. package/backend/code-editor/stream-parser/typoscript.ts +2 -2
  12. package/backend/color-picker.ts +2 -2
  13. package/backend/column-selector-button.ts +6 -6
  14. package/backend/context-help.ts +3 -3
  15. package/backend/context-menu.ts +8 -3
  16. package/backend/drag-tooltip.ts +9 -4
  17. package/backend/drag-uploader.ts +4 -4
  18. package/backend/element/draggable-resizable-element.ts +18 -12
  19. package/backend/element/icon-element.ts +2 -2
  20. package/backend/element/thumbnail-element.ts +2 -2
  21. package/backend/element-browser.ts +1 -1
  22. package/backend/event/consumer-scope.ts +2 -2
  23. package/backend/event/interaction-request-assignment.ts +1 -1
  24. package/backend/event/interaction-request-map.ts +3 -3
  25. package/backend/form-engine/container/flex-form-container-container.ts +2 -2
  26. package/backend/form-engine/container/flex-form-section-container.ts +1 -1
  27. package/backend/form-engine/container/inline-control-container.ts +14 -14
  28. package/backend/form-engine/element/abstract-sortable-select-items.ts +3 -3
  29. package/backend/form-engine/element/color-element.ts +1 -1
  30. package/backend/form-engine/element/datetime-element.ts +1 -1
  31. package/backend/form-engine/element/extra/char-counter.ts +2 -2
  32. package/backend/form-engine/element/extra/select-box-filter.ts +1 -1
  33. package/backend/form-engine/element/mfa-info-element.ts +2 -2
  34. package/backend/form-engine/element/online-media-form-element.ts +5 -1
  35. package/backend/form-engine/element/select-multiple-side-by-side-element.ts +2 -2
  36. package/backend/form-engine/element/select-tree.ts +3 -3
  37. package/backend/form-engine/element/slug-element.ts +7 -7
  38. package/backend/form-engine/element/suggest/result-container.ts +1 -1
  39. package/backend/form-engine/element/table-wizard-element.ts +4 -4
  40. package/backend/form-engine/inline-relation/ajax-dispatcher.ts +3 -3
  41. package/backend/form-engine-validation.ts +11 -5
  42. package/backend/form-engine.ts +11 -11
  43. package/backend/global-event-handler.ts +1 -1
  44. package/backend/hotkeys/hotkey-struct.ts +1 -1
  45. package/backend/hotkeys.ts +3 -3
  46. package/backend/image-manipulation.ts +19 -19
  47. package/backend/layout-module/drag-drop.ts +4 -4
  48. package/backend/layout-module/paste.ts +1 -1
  49. package/backend/live-search/element/result/item/action/action-container.ts +1 -1
  50. package/backend/live-search/element/result/item/item-container.ts +4 -4
  51. package/backend/live-search/element/result/result-container.ts +5 -0
  52. package/backend/live-search/element/result/result-pagination.ts +1 -1
  53. package/backend/live-search/live-search.ts +2 -2
  54. package/backend/localization/label-provider.ts +4 -4
  55. package/backend/localization/localization-wizard.ts +4 -4
  56. package/backend/localization/steps/content-record-selection-step.ts +8 -8
  57. package/backend/localization/steps/handler-selection-step.ts +4 -4
  58. package/backend/localization/steps/mode-step.ts +4 -4
  59. package/backend/localization/steps/source-language-step.ts +4 -4
  60. package/backend/localization/steps/target-language-step.ts +4 -4
  61. package/backend/login.ts +2 -2
  62. package/backend/module/iframe.ts +10 -0
  63. package/backend/module/router.ts +10 -0
  64. package/backend/module-menu.ts +3 -3
  65. package/backend/multi-record-selection-action.ts +1 -1
  66. package/backend/multi-record-selection-delete-action.ts +1 -1
  67. package/backend/multi-record-selection.ts +14 -14
  68. package/backend/multi-step-wizard.ts +9 -2
  69. package/backend/new-multiple-pages.ts +2 -2
  70. package/backend/new-record-wizard.ts +15 -15
  71. package/backend/page-wizard/page-wizard.ts +2 -2
  72. package/backend/page-wizard/steps/doktype-step.ts +5 -5
  73. package/backend/pagetsconfig/pagetsconfig-includes.ts +1 -1
  74. package/backend/popover.ts +5 -5
  75. package/backend/record-download-button.ts +1 -1
  76. package/backend/recordlist.ts +6 -6
  77. package/backend/security/element/csp-reports.ts +8 -8
  78. package/backend/setup-module.ts +2 -2
  79. package/backend/sortable-table.ts +10 -4
  80. package/backend/storage/abstract-client-storage.ts +2 -2
  81. package/backend/storage/module-state-storage.ts +2 -2
  82. package/backend/tests/backend/utility/dom-helper-test.ts +2 -2
  83. package/backend/tests/form-engine/element/extra/select-box-filter-test.ts +3 -3
  84. package/backend/tests/form-engine-validation-test.ts +1 -1
  85. package/backend/tests/tree/tree-test.ts +41 -0
  86. package/backend/tree/file-storage-browser.ts +1 -1
  87. package/backend/tree/file-storage-tree-container.ts +4 -4
  88. package/backend/tree/page-browser.ts +1 -1
  89. package/backend/tree/page-position-select.ts +1 -1
  90. package/backend/tree/page-tree-element.ts +1 -1
  91. package/backend/tree/page-tree.ts +7 -1
  92. package/backend/tree/tree-module-state.ts +5 -5
  93. package/backend/tree/tree.ts +15 -8
  94. package/backend/user-pass-login.ts +2 -2
  95. package/backend/utility/collapse-state-persister.ts +1 -1
  96. package/backend/utility/collapse-state-search.ts +6 -6
  97. package/backend/utility/dom-helper.ts +3 -3
  98. package/backend/utility.ts +6 -6
  99. package/backend/viewport/content-navigation.ts +5 -0
  100. package/backend/viewport/navigation-container.ts +1 -1
  101. package/backend/viewport/toolbar.ts +3 -3
  102. package/backend/window-manager.ts +2 -2
  103. package/backend/wizard/events/auto-advance-event.ts +6 -0
  104. package/backend/wizard/events/before-next-step-event.ts +6 -0
  105. package/backend/wizard/events/step-summary-event.ts +6 -0
  106. package/backend/wizard/move-content-element.ts +1 -1
  107. package/backend/wizard/wizard.ts +8 -10
  108. package/belog/backend-log.ts +2 -2
  109. package/beuser/permissions.ts +2 -2
  110. package/core/ajax/ajax-response.ts +1 -1
  111. package/core/ajax/input-transformer.ts +1 -1
  112. package/core/event/debounce-event.ts +4 -4
  113. package/core/event/event-interface.ts +3 -3
  114. package/core/event/regular-event.ts +7 -7
  115. package/core/event/request-animation-frame-event.ts +4 -4
  116. package/core/event/throttle-event.ts +4 -4
  117. package/core/java-script-item-processor.ts +6 -0
  118. package/core/referrer-refresh.ts +2 -2
  119. package/core/security-utility.ts +1 -1
  120. package/dashboard/dashboard-wizard.ts +2 -2
  121. package/dashboard/dashboard.ts +5 -5
  122. package/dashboard/wizard/steps/preset-step.ts +3 -3
  123. package/extensionmanager/main.ts +7 -7
  124. package/filelist/browse-files.ts +1 -1
  125. package/filelist/browse-folders.ts +2 -2
  126. package/filelist/file-list-dragdrop.ts +5 -5
  127. package/filelist/file-list-transfer-handler.ts +2 -2
  128. package/filelist/file-list.ts +5 -5
  129. package/form/backend/form-editor/component/date-editor.ts +4 -0
  130. package/form/backend/form-editor/component/form-element-selector.ts +4 -0
  131. package/form/backend/form-editor/inspector-component.ts +6 -6
  132. package/form/backend/form-editor/mediator.ts +36 -36
  133. package/form/backend/form-editor/modals-component.ts +1 -1
  134. package/form/backend/form-editor/stage-component.ts +4 -4
  135. package/form/backend/form-editor/view-model.ts +7 -7
  136. package/form/backend/form-manager/view-model.ts +5 -5
  137. package/form/backend/form-wizard/form-wizard.ts +2 -2
  138. package/form/backend/form-wizard/steps/storage-step.ts +1 -1
  139. package/impexp/import-export.ts +1 -1
  140. package/info/translation-status.ts +2 -2
  141. package/install/ajax/ajax-queue.ts +1 -1
  142. package/install/module/abstract-interactable-module.ts +2 -2
  143. package/install/module/environment/image-processing.ts +4 -4
  144. package/install/module/environment/mail-test.ts +2 -2
  145. package/install/module/maintenance/clear-tables.ts +3 -3
  146. package/install/module/maintenance/clear-typo3temp-files.ts +8 -8
  147. package/install/module/maintenance/create-admin.ts +3 -3
  148. package/install/module/maintenance/database-analyzer.ts +9 -7
  149. package/install/module/maintenance/language-packs.ts +4 -4
  150. package/install/module/maintenance/reference-index.ts +1 -1
  151. package/install/module/settings/change-install-tool-password.ts +1 -1
  152. package/install/module/settings/extension-configuration.ts +5 -5
  153. package/install/module/settings/features.ts +1 -1
  154. package/install/module/settings/local-configuration.ts +5 -5
  155. package/install/module/settings/presets.ts +2 -2
  156. package/install/module/settings/system-maintainer.ts +1 -1
  157. package/install/module/upgrade/extension-scanner.ts +5 -5
  158. package/install/module/upgrade/tca-migrations-check.ts +1 -1
  159. package/install/module/upgrade/upgrade-docs.ts +16 -16
  160. package/install/module/upgrade/upgrade-wizards.ts +7 -8
  161. package/install/renderable/language-packs.ts +8 -2
  162. package/lowlevel/query-generator.ts +2 -2
  163. package/package.json +2 -2
  164. package/redirects/event-handler.ts +6 -0
  165. package/rte-ckeditor/ckeditor5.ts +7 -3
  166. package/rte-ckeditor/tests/ckeditor5-test.ts +68 -0
  167. package/scheduler/form-engine/element/timing-options-element.ts +1 -1
  168. package/scheduler/scheduler.ts +2 -2
  169. package/styleguide/checkbox-demo.ts +1 -1
  170. package/tstemplate/template-analyzer.ts +1 -1
  171. package/viewpage/main.ts +1 -1
  172. package/workspaces/backend.ts +5 -5
  173. package/workspaces/preview.ts +2 -2
  174. package/workspaces/renderable/record-table.ts +1 -1
  175. package/workspaces/renderable/send-to-stage-form.ts +1 -1
@@ -37,23 +37,23 @@
37
37
 
38
38
  constructor() {
39
39
  this.adminPanel = document.querySelector(AdminPanelSelectors.adminPanelRole) as HTMLFormElement;
40
- this.modules = (this.querySelectorAll(AdminPanelSelectors.moduleTriggerRole) as Element[]).map(
41
- (moduleTrigger: HTMLElement) => {
40
+ this.modules = this.querySelectorAll(AdminPanelSelectors.moduleTriggerRole).map(
41
+ (moduleTrigger) => {
42
42
  const moduleParent = moduleTrigger.closest(AdminPanelSelectors.moduleParentClass);
43
43
  return new AdminPanelModule(this, moduleParent, moduleTrigger);
44
44
  },
45
45
  );
46
46
  this.popups = this.querySelectorAll(AdminPanelSelectors.popupTriggerRole).map(
47
- (popupTrigger: HTMLElement) => new AdminPanelPopup(this, popupTrigger),
47
+ (popupTrigger) => new AdminPanelPopup(this, popupTrigger),
48
48
  );
49
49
  this.querySelectorAll(AdminPanelSelectors.panelTriggerRole).forEach(
50
- (panelTrigger: HTMLElement) => {
50
+ (panelTrigger) => {
51
51
  const panelParent = panelTrigger.closest(AdminPanelSelectors.panelParentClass);
52
52
  new AdminPanelPanel(panelParent, panelTrigger);
53
53
  },
54
54
  );
55
55
  this.querySelectorAll(AdminPanelSelectors.contentSettingsTriggerRole).forEach(
56
- (contentSettingTrigger: HTMLElement) => {
56
+ (contentSettingTrigger) => {
57
57
  const contentSettingElement = contentSettingTrigger
58
58
  .closest(AdminPanelSelectors.contentParentClass)
59
59
  .querySelector(AdminPanelSelectors.contentSettingsParentClass);
@@ -67,11 +67,11 @@
67
67
  }
68
68
 
69
69
  disableModules(): void {
70
- this.modules.forEach((module: AdminPanelModule) => module.disable());
70
+ this.modules.forEach((module) => module.disable());
71
71
  }
72
72
 
73
73
  disablePopups(): void {
74
- this.popups.forEach((popup: AdminPanelPopup) => popup.disable());
74
+ this.popups.forEach((popup) => popup.disable());
75
75
  }
76
76
 
77
77
  renderBackdrop(): void {
@@ -93,33 +93,33 @@
93
93
  }
94
94
  }
95
95
 
96
- private querySelectorAll(selectors: string, subject: Element = null): Node[] {
96
+ private querySelectorAll<T extends HTMLElement = HTMLElement>(selectors: string, subject: Element = null): T[] {
97
97
  if (subject === null) {
98
- return Array.from(document.querySelectorAll(selectors));
98
+ return Array.from(document.querySelectorAll<T>(selectors));
99
99
  }
100
- return Array.from(subject.querySelectorAll(selectors));
100
+ return Array.from(subject.querySelectorAll<T>(selectors));
101
101
  }
102
102
 
103
103
  private initializeEvents(): void {
104
104
  this
105
105
  .querySelectorAll(AdminPanelSelectors.contentTabRole)
106
- .forEach((tab: HTMLElement) => tab.addEventListener('click', this.switchTab.bind(this)));
106
+ .forEach((tab) => tab.addEventListener('click', this.switchTab.bind(this)));
107
107
  this
108
108
  .querySelectorAll(AdminPanelSelectors.zoomTarget)
109
- .forEach((zoomTrigger: HTMLElement) => zoomTrigger.addEventListener('click', this.openZoom.bind(this)));
109
+ .forEach((zoomTrigger) => zoomTrigger.addEventListener('click', this.openZoom.bind(this)));
110
110
  this
111
111
  .querySelectorAll(AdminPanelSelectors.zoomClose)
112
- .forEach((zoomTrigger: HTMLElement) => zoomTrigger.addEventListener('click', this.closeZoom.bind(this)));
112
+ .forEach((zoomTrigger) => zoomTrigger.addEventListener('click', this.closeZoom.bind(this)));
113
113
  this
114
114
  .querySelectorAll(AdminPanelSelectors.triggerRole)
115
- .forEach((trigger: HTMLElement) => trigger.addEventListener('click', this.toggleAdminPanelState.bind(this)));
115
+ .forEach((trigger) => trigger.addEventListener('click', this.toggleAdminPanelState.bind(this)));
116
116
  this
117
117
  .querySelectorAll(AdminPanelSelectors.saveButtonRole)
118
- .forEach((elm: HTMLElement) => elm.addEventListener('click', this.sendAdminPanelForm.bind(this)));
118
+ .forEach((elm) => elm.addEventListener('click', this.sendAdminPanelForm.bind(this)));
119
119
 
120
120
  this
121
121
  .querySelectorAll('[data-typo3-role=typo3-adminPanel-content-close]')
122
- .forEach((elm: HTMLElement) => {
122
+ .forEach((elm) => {
123
123
  elm.addEventListener('click', () => {
124
124
  this.disableModules();
125
125
  this.removeBackdrop();
@@ -127,7 +127,7 @@
127
127
  });
128
128
  this
129
129
  .querySelectorAll('.typo3-adminPanel-table th, .typo3-adminPanel-table td')
130
- .forEach((elm: HTMLElement) => {
130
+ .forEach((elm) => {
131
131
  elm.addEventListener('click', () => {
132
132
  elm.focus();
133
133
  try {
@@ -149,9 +149,9 @@
149
149
  const contentTabs = this.querySelectorAll(AdminPanelSelectors.contentTabRole, currentContent);
150
150
  const contentPanes = this.querySelectorAll(AdminPanelSelectors.contentPaneRole, currentContent);
151
151
 
152
- contentTabs.forEach((element: HTMLElement) => element.classList.remove(activeTabClass));
152
+ contentTabs.forEach((element) => element.classList.remove(activeTabClass));
153
153
  currentTab.classList.add(activeTabClass);
154
- contentPanes.forEach((element: HTMLElement) => element.classList.remove(activePaneClass));
154
+ contentPanes.forEach((element) => element.classList.remove(activePaneClass));
155
155
 
156
156
  const activePane = document.querySelector('[data-typo3-tab-id=' + currentTab.dataset.typo3TabTarget + ']');
157
157
  activePane.classList.add(activePaneClass);
@@ -196,7 +196,7 @@
196
196
  */
197
197
  private getCleanReloadUrl(): string {
198
198
  const urlParams: string[] = [];
199
- location.search.substr(1).split('&').forEach((item: string): void => {
199
+ location.search.substr(1).split('&').forEach((item): void => {
200
200
  if (item && !item.includes('ADMCMD_')) {
201
201
  urlParams.push(item);
202
202
  }
@@ -208,12 +208,12 @@
208
208
 
209
209
  private addBackdropListener(): void {
210
210
  this.querySelectorAll('.' + AdminPanelClasses.backdrop)
211
- .forEach((elm: HTMLElement) => {
211
+ .forEach((elm) => {
212
212
  elm.addEventListener('click', () => {
213
213
  this.removeBackdrop();
214
214
  this
215
215
  .querySelectorAll(AdminPanelSelectors.moduleTriggerRole)
216
- .forEach((innerElm: HTMLElement) => {
216
+ .forEach((innerElm) => {
217
217
  innerElm.closest(AdminPanelSelectors.moduleParentClass)
218
218
  .classList.remove(AdminPanelClasses.activeModule);
219
219
  });
@@ -1,11 +1,11 @@
1
1
  ((): void => {
2
2
  class AdminPanelCache {
3
- private readonly buttons: NodeList;
3
+ private readonly buttons: NodeListOf<HTMLElement>;
4
4
 
5
5
  constructor() {
6
- this.buttons = document.querySelectorAll('[data-typo3-role="clearCacheButton"]');
6
+ this.buttons = document.querySelectorAll<HTMLElement>('[data-typo3-role="clearCacheButton"]');
7
7
 
8
- this.buttons.forEach((element: HTMLElement): void => {
8
+ this.buttons.forEach((element): void => {
9
9
  element.addEventListener('click', (): void => {
10
10
  const url = element.dataset.typo3AjaxUrl;
11
11
  const request = new XMLHttpRequest();
@@ -19,6 +19,11 @@ import documentService from '@typo3/core/document-service';
19
19
  import Utility from '@typo3/backend/utility';
20
20
 
21
21
  declare type ActionDispatchArgument = unknown;
22
+ /**
23
+ * Delegates are invoked with arguments resolved from the DOM, so their concrete
24
+ * signature is only known to the registering side.
25
+ */
26
+ declare type ActionDispatchDelegate = (...args: never[]) => void;
22
27
 
23
28
  /**
24
29
  * Module: @typo3/backend/action-dispatcher
@@ -33,7 +38,7 @@ declare type ActionDispatchArgument = unknown;
33
38
  * data-dispatch-disabled>
34
39
  */
35
40
  class ActionDispatcher {
36
- private delegates: {[key: string]: (...args: ActionDispatchArgument[]) => void} = {};
41
+ private delegates: Record<string, ActionDispatchDelegate> = {};
37
42
 
38
43
  public constructor() {
39
44
  this.createDelegates();
@@ -82,7 +87,7 @@ class ActionDispatcher {
82
87
  const action = target.dataset.dispatchAction;
83
88
  let args: ActionDispatchArgument[] = ActionDispatcher.resolveArguments(target);
84
89
  if (args instanceof Array) {
85
- args = args.map((arg: string): ActionDispatchArgument => {
90
+ args = args.map((arg): ActionDispatchArgument => {
86
91
  switch (arg) {
87
92
  case '{$target}':
88
93
  return target;
@@ -94,7 +99,7 @@ class ActionDispatcher {
94
99
  });
95
100
  }
96
101
  if (this.delegates[action]) {
97
- this.delegates[action].apply(null, args || []);
102
+ this.delegates[action].apply(null, (args || []) as never[]);
98
103
  }
99
104
  }
100
105
  }
@@ -159,10 +159,10 @@ class BookmarkStore {
159
159
  let bookmarks = await this.getBookmarks();
160
160
 
161
161
  if (options?.accessibleOnly) {
162
- bookmarks = bookmarks.filter((b: Bookmark) => b.accessible);
162
+ bookmarks = bookmarks.filter((b) => b.accessible);
163
163
  }
164
164
  if (options?.groupId !== undefined) {
165
- bookmarks = bookmarks.filter((b: Bookmark) => b.groupId === options.groupId);
165
+ bookmarks = bookmarks.filter((b) => b.groupId === options.groupId);
166
166
  }
167
167
  if (options?.limit !== undefined && options.limit > 0 && bookmarks.length > options.limit) {
168
168
  bookmarks = bookmarks.slice(0, options.limit);
@@ -178,8 +178,8 @@ class BookmarkStore {
178
178
  groupSortingMap.set(group.id, group.sorting);
179
179
  });
180
180
 
181
- const groupIds = [...new Set(bookmarks.map((b: Bookmark) => b.groupId))];
182
- const sortedBookmarkGroupIds = groupIds.sort((a: BookmarkGroupId, b: BookmarkGroupId) => {
181
+ const groupIds = [...new Set(bookmarks.map((b) => b.groupId))];
182
+ const sortedBookmarkGroupIds = groupIds.sort((a, b) => {
183
183
  // First sort by priority (lower values first)
184
184
  const priorityA = groupPriorityMap.get(a) ?? Number.MAX_SAFE_INTEGER;
185
185
  const priorityB = groupPriorityMap.get(b) ?? Number.MAX_SAFE_INTEGER;
@@ -195,7 +195,7 @@ class BookmarkStore {
195
195
  });
196
196
 
197
197
  for (const groupId of sortedBookmarkGroupIds) {
198
- const groupBookmarks = bookmarks.filter((b: Bookmark) => b.groupId === groupId);
198
+ const groupBookmarks = bookmarks.filter((b) => b.groupId === groupId);
199
199
  if (groupBookmarks.length > 0) {
200
200
  grouped.set(groupId, groupBookmarks);
201
201
  }
@@ -105,7 +105,7 @@ export class ClipboardPanel extends LitElement {
105
105
  <div class="table-fit">
106
106
  <table class="table">
107
107
  <tbody>
108
- ${clipboardData.tabs.map((tab: ClipboardTab): TemplateResult => this.renderTab(tab, clipboardData))}
108
+ ${clipboardData.tabs.map((tab): TemplateResult => this.renderTab(tab, clipboardData))}
109
109
  </tbody>
110
110
  </table>
111
111
  </div>
@@ -166,7 +166,7 @@ export class ClipboardPanel extends LitElement {
166
166
  `}
167
167
  </td>
168
168
  </tr>
169
- ${clipboardData.current === tab.identifier && tab.items ? tab.items.map((tabItem: ClipboardTabItem): TemplateResult => this.renderTabItem(tabItem, tab.identifier, clipboardData)) : nothing}
169
+ ${clipboardData.current === tab.identifier && tab.items ? tab.items.map((tabItem): TemplateResult => this.renderTabItem(tabItem, tab.identifier, clipboardData)) : nothing}
170
170
  `;
171
171
  }
172
172
 
@@ -163,7 +163,7 @@ export class CodeMirrorElement extends LitElement {
163
163
  root: document.body
164
164
  };
165
165
  const observer = new IntersectionObserver((entries: IntersectionObserverEntry[]): void => {
166
- entries.forEach((entry: IntersectionObserverEntry): void => {
166
+ entries.forEach((entry): void => {
167
167
  if (entry.intersectionRatio > 0) {
168
168
  observer.unobserve(entry.target);
169
169
  if (this.firstElementChild && this.firstElementChild.nodeName.toLowerCase() === 'textarea') {
@@ -90,7 +90,7 @@ export async function complete(context: CompletionContext): Promise<CompletionRe
90
90
  const completions = getCompletions(tokenValue, keywords);
91
91
  return {
92
92
  from: completionStart,
93
- options: completions.map((result: string) => {
93
+ options: completions.map((result) => {
94
94
  return { label: result, type: 'keyword' };
95
95
  })
96
96
  };
@@ -129,7 +129,7 @@ function extractCodemirror5StyleLineTokens(lineCount: number, context: Completio
129
129
  // stream parser doesn't perform proper tokenization.
130
130
  // Insert content as null-type token into the lineToken array.
131
131
  if (lastToken < start) {
132
- context.state.sliceDoc(lastToken, start).split(context.state.lineBreak).forEach((part: string) => {
132
+ context.state.sliceDoc(lastToken, start).split(context.state.lineBreak).forEach((part) => {
133
133
  if (part) {
134
134
  lineTokens[Math.min(lineNumber - 1, lineCount - 1)].push({ type: null, string: part, start: lastToken, end: lastToken + part.length });
135
135
  lineNumber++;
@@ -162,7 +162,7 @@ function tokenIsSubStringOfKeywords(token: string, keywords: string[]): boolean
162
162
  }
163
163
 
164
164
  function getCompletions(token: string, keywords: string[]) {
165
- const found = new Set();
165
+ const found = new Set<string>();
166
166
 
167
167
  const maybeAdd = (str: string) => {
168
168
  if (str.lastIndexOf(token, 0) === 0 && !found.has(str)) {
@@ -8,8 +8,8 @@ type Keyword = {
8
8
  };
9
9
 
10
10
  type CombinatorReturnType = boolean | undefined;
11
- type CombinatorFunction = (type?: Type, value?: unknown) => CombinatorReturnType;
12
- type CombinatorLexFunction = ((type?: Type, value?: unknown) => CombinatorReturnType) & { lex: true };
11
+ type CombinatorFunction = (type?: Type, value?: Value) => CombinatorReturnType;
12
+ type CombinatorLexFunction = ((type?: Type, value?: Value) => CombinatorReturnType) & { lex: true };
13
13
  type CC = CombinatorFunction | CombinatorLexFunction;
14
14
 
15
15
  type CX = {
@@ -107,7 +107,7 @@ export class Typo3BackendColorPicker extends LitElement {
107
107
 
108
108
  // input: react on user input
109
109
  // change: react on indirect changes, e.g. a value picker
110
- ['input', 'change'].forEach((eventName: string): void => {
110
+ ['input', 'change'].forEach((eventName): void => {
111
111
  new RegularEvent(eventName, (e: Event): void => {
112
112
  const input = (e.target as HTMLInputElement);
113
113
  this.color = input.value;
@@ -151,7 +151,7 @@ class LegacyColorPicker {
151
151
  }
152
152
 
153
153
  const colorPicker = document.createElement('typo3-backend-color-picker');
154
- colorPicker.swatches = options.swatches.map((swatch: string) => ({ color: swatch, label: swatch }));
154
+ colorPicker.swatches = options.swatches.map((swatch) => ({ color: swatch, label: swatch }));
155
155
  colorPicker.opacity = options.opacity ?? false;
156
156
  element.parentNode.insertBefore(colorPicker, element);
157
157
  colorPicker.appendChild(element);
@@ -116,7 +116,7 @@ export class ColumnSelectorButton extends PseudoButtonLitElement {
116
116
  * @private
117
117
  */
118
118
  private static filterColumns(columnsFilter: HTMLInputElement, columns: NodeListOf<HTMLInputElement>): void {
119
- columns.forEach((column: HTMLInputElement) => {
119
+ columns.forEach((column) => {
120
120
  const columnContainer: HTMLDivElement = column.closest(Selectors.columnsContainerSelector);
121
121
  if (!column.disabled && columnContainer !== null) {
122
122
  const filterValue: string = columnContainer.querySelector('.form-check-label')?.textContent;
@@ -218,7 +218,7 @@ export class ColumnSelectorButton extends PseudoButtonLitElement {
218
218
  ColumnSelectorButton.toggleSelectorActions(columns, selectAll, selectNone, true);
219
219
 
220
220
  // Add event listener for each column to toggle the selector actions after change
221
- columns.forEach((column: HTMLInputElement) => {
221
+ columns.forEach((column) => {
222
222
  column.addEventListener('change', (): void => {
223
223
  ColumnSelectorButton.toggleSelectorActions(columns, selectAll, selectNone);
224
224
  });
@@ -248,7 +248,7 @@ export class ColumnSelectorButton extends PseudoButtonLitElement {
248
248
 
249
249
  // Add event listener for all columns select actions. querySelectorAll will return
250
250
  // at least two actions (selectAll and selectNone) which we checked above already
251
- columnsSelectorActions.querySelectorAll('button[data-action]').forEach((action: HTMLButtonElement) => {
251
+ columnsSelectorActions.querySelectorAll<HTMLButtonElement>('button[data-action]').forEach((action) => {
252
252
  action.addEventListener('click', (e: Event): void => {
253
253
  e.preventDefault();
254
254
 
@@ -261,21 +261,21 @@ export class ColumnSelectorButton extends PseudoButtonLitElement {
261
261
  // Perform requested action
262
262
  switch (target.dataset.action) {
263
263
  case SelectorActions.toggle:
264
- columns.forEach((column: HTMLInputElement) => {
264
+ columns.forEach((column) => {
265
265
  if (!column.disabled && !ColumnSelectorButton.isColumnHidden(column)) {
266
266
  column.checked = !column.checked;
267
267
  }
268
268
  });
269
269
  break;
270
270
  case SelectorActions.all:
271
- columns.forEach((column: HTMLInputElement) => {
271
+ columns.forEach((column) => {
272
272
  if (!column.disabled && !ColumnSelectorButton.isColumnHidden(column)) {
273
273
  column.checked = true;
274
274
  }
275
275
  });
276
276
  break;
277
277
  case SelectorActions.none:
278
- columns.forEach((column: HTMLInputElement) => {
278
+ columns.forEach((column) => {
279
279
  if (!column.disabled && !ColumnSelectorButton.isColumnHidden(column)) {
280
280
  column.checked = false;
281
281
  }
@@ -32,8 +32,8 @@ class ContextHelp {
32
32
 
33
33
  public async initialize(): Promise<void> {
34
34
  await DocumentService.ready();
35
- const elements = document.querySelectorAll(this.selector);
36
- elements.forEach((element: HTMLElement): void => {
35
+ const elements = document.querySelectorAll<HTMLElement>(this.selector);
36
+ elements.forEach((element): void => {
37
37
  element.dataset.bsHtml = 'true';
38
38
  element.dataset.bsPlacement = this.placement;
39
39
  element.dataset.bsTrigger = this.trigger;
@@ -56,7 +56,7 @@ class ContextHelp {
56
56
 
57
57
  new RegularEvent('click', (e: Event): void => {
58
58
  const me = e.target as HTMLElement;
59
- elements.forEach((element: HTMLElement): void => {
59
+ elements.forEach((element): void => {
60
60
  if (!element.isEqualNode(me)) {
61
61
  Popover.hide(element);
62
62
  }
@@ -192,11 +192,11 @@ export class ContextMenuElement extends LitElement {
192
192
  onComplete: () => {
193
193
  this.focusFirstElement = true;
194
194
  },
195
- onError: (error: Error|AjaxResponse) => {
195
+ onError: (error: unknown) => {
196
196
  if (error instanceof AjaxResponse) {
197
197
  Notification.error('', error.response.status + ' ' + error.response.statusText, 5);
198
198
  } else {
199
- Notification.error('', error.message);
199
+ Notification.error('', (error as Error).message);
200
200
  }
201
201
  },
202
202
  });
@@ -551,7 +551,7 @@ export class ContextMenuElement extends LitElement {
551
551
 
552
552
  private getNodeByIdentifier(identifier: string): MenuItemInterface | null {
553
553
  const flattenedNodes = this.flattenMenuItems(this.nodes);
554
- return flattenedNodes.find((node: MenuItemInterface) => {
554
+ return flattenedNodes.find((node) => {
555
555
  return this.getNodeIdentifier(node) === identifier;
556
556
  }) ?? null;
557
557
  }
@@ -748,4 +748,9 @@ declare global {
748
748
  interface HTMLElementTagNameMap {
749
749
  'typo3-backend-context-menu': ContextMenuElement;
750
750
  }
751
+
752
+ interface DocumentEventMap {
753
+ [ContextMenuEvent.open]: CustomEvent<ContextMenuEventDetail>;
754
+ [ContextMenuEvent.close]: CustomEvent<ContextMenuEventDetail>;
755
+ }
751
756
  }
@@ -144,15 +144,15 @@ export class DragToolTip extends LitElement implements DragTooltipMetadata {
144
144
  return;
145
145
  }
146
146
 
147
- const propertyNames = [...changedProperties.keys()].filter(
148
- (propName: keyof this) => (this.constructor as typeof ReactiveElement).elementProperties.get(propName).attribute !== false
147
+ const propertyNames = ([...changedProperties.keys()] as (keyof this)[]).filter(
148
+ (propName) => (this.constructor as typeof ReactiveElement).elementProperties.get(propName).attribute !== false
149
149
  );
150
150
 
151
151
  if (propertyNames.length === 0) {
152
152
  return;
153
153
  }
154
154
 
155
- const newProperties = propertyNames.map((propName: keyof this) => [ propName, this[propName] ]);
155
+ const newProperties = propertyNames.map((propName) => [ propName, this[propName] ]);
156
156
  this.broadcast('changedProperties', Object.fromEntries(newProperties));
157
157
  }
158
158
 
@@ -212,7 +212,7 @@ export class DragToolTip extends LitElement implements DragTooltipMetadata {
212
212
 
213
213
  protected onBroadcastChangedProperties = (event: CustomEvent<{ payload: Partial<WritablePart<DragToolTip>> }>) => {
214
214
  const newProperties = event.detail.payload;
215
- Object.keys(newProperties).forEach((key: keyof WritablePart<DragToolTip>) => {
215
+ (Object.keys(newProperties) as (keyof WritablePart<DragToolTip>)[]).forEach((key) => {
216
216
  (this[key] as unknown) = newProperties[key];
217
217
  });
218
218
  this.skipNextUpdateBroadcast = true;
@@ -282,4 +282,9 @@ declare global {
282
282
  interface HTMLElementTagNameMap {
283
283
  'typo3-backend-drag-tooltip': DragToolTip;
284
284
  }
285
+
286
+ interface DocumentEventMap {
287
+ 'typo3:drag-tooltip:metadata-update': CustomEvent<DragTooltipMetadata>;
288
+ 'typo3:drag-tooltip:changedProperties': CustomEvent<{ payload: Partial<WritablePart<DragToolTip>> }>;
289
+ }
285
290
  }
@@ -258,7 +258,7 @@ export default class DragUploader {
258
258
  if (node.matches('.t3js-drag-uploader')) {
259
259
  new DragUploader(node);
260
260
  } else {
261
- node.querySelectorAll('.t3js-drag-uploader').forEach((element: HTMLElement): void => {
261
+ node.querySelectorAll<HTMLElement>('.t3js-drag-uploader').forEach((element): void => {
262
262
  new DragUploader(element);
263
263
  });
264
264
  }
@@ -269,7 +269,7 @@ export default class DragUploader {
269
269
  observer.observe(document, { childList: true, subtree: true });
270
270
 
271
271
  DocumentService.ready().then((): void => {
272
- document.querySelectorAll('.t3js-drag-uploader').forEach((element: HTMLElement): void => {
272
+ document.querySelectorAll<HTMLElement>('.t3js-drag-uploader').forEach((element): void => {
273
273
  new DragUploader(element);
274
274
  });
275
275
  });
@@ -403,7 +403,7 @@ export default class DragUploader {
403
403
 
404
404
  // Check for each file if is already exist before adding it to the queue
405
405
  const ajaxCalls: Promise<void>[] = [];
406
- validFiles.forEach((file: File) => {
406
+ validFiles.forEach((file) => {
407
407
  const request = new AjaxRequest(TYPO3.settings.ajaxUrls.file_exists).withQueryArguments({
408
408
  fileName: file.name,
409
409
  fileTarget: this.target,
@@ -606,7 +606,7 @@ export default class DragUploader {
606
606
  this.askForOverride[index].action = <Action>select.value;
607
607
  }
608
608
  } else {
609
- modal.querySelectorAll('.t3js-actions').forEach((select: HTMLSelectElement) => select.disabled = false);
609
+ modal.querySelectorAll<HTMLSelectElement>('.t3js-actions').forEach((select) => select.disabled = false);
610
610
  }
611
611
  }).delegateTo(modal, '.t3js-actions-all');
612
612
 
@@ -94,22 +94,22 @@ export class DraggableResizableElement extends LitElement {
94
94
 
95
95
  public override connectedCallback(): void {
96
96
  super.connectedCallback();
97
- this.pointerEventNames.pointerDown.forEach((name: string): void =>
98
- document.addEventListener(name, this.handleStart, true));
99
- this.pointerEventNames.pointerMove.forEach((name: string): void =>
100
- document.addEventListener(name, this.handleUpdate, true));
101
- this.pointerEventNames.pointerUp.forEach((name: string): void =>
102
- document.addEventListener(name, this.handleFinish, true));
97
+ this.pointerEventNames.pointerDown.forEach((name): void =>
98
+ document.addEventListener(name, this.handleStart as EventListener, true));
99
+ this.pointerEventNames.pointerMove.forEach((name): void =>
100
+ document.addEventListener(name, this.handleUpdate as EventListener, true));
101
+ this.pointerEventNames.pointerUp.forEach((name): void =>
102
+ document.addEventListener(name, this.handleFinish as EventListener, true));
103
103
  }
104
104
 
105
105
  public override disconnectedCallback(): void {
106
106
  super.disconnectedCallback();
107
- this.pointerEventNames.pointerDown.forEach((name: string): void =>
108
- document.removeEventListener(name, this.handleStart, true));
109
- this.pointerEventNames.pointerMove.forEach((name: string): void =>
110
- document.removeEventListener(name, this.handleUpdate, true));
111
- this.pointerEventNames.pointerUp.forEach((name: string): void =>
112
- document.removeEventListener(name, this.handleFinish, true));
107
+ this.pointerEventNames.pointerDown.forEach((name): void =>
108
+ document.removeEventListener(name, this.handleStart as EventListener, true));
109
+ this.pointerEventNames.pointerMove.forEach((name): void =>
110
+ document.removeEventListener(name, this.handleUpdate as EventListener, true));
111
+ this.pointerEventNames.pointerUp.forEach((name): void =>
112
+ document.removeEventListener(name, this.handleFinish as EventListener, true));
113
113
  }
114
114
 
115
115
  protected override render(): TemplateResult {
@@ -246,4 +246,10 @@ declare global {
246
246
  interface HTMLElementTagNameMap {
247
247
  'typo3-backend-draggable-resizable': DraggableResizableElement;
248
248
  }
249
+
250
+ interface HTMLElementEventMap {
251
+ 'draggable-resizable-started': DraggableResizableEvent;
252
+ 'draggable-resizable-updated': DraggableResizableEvent;
253
+ 'draggable-resizable-finished': DraggableResizableEvent;
254
+ }
249
255
  }
@@ -48,10 +48,10 @@ export class IconElement extends LitElement {
48
48
  @property({ type: String }) raw?: string = null;
49
49
 
50
50
  private readonly iconTask = new Task(this, {
51
- task: async ([identifier, size, overlay, state, markup]: [string, Sizes, States, string, MarkupIdentifiers], { signal }): Promise<string> => {
51
+ task: async ([identifier, size, overlay, state, markup], { signal }): Promise<string> => {
52
52
  return await Icons.getIcon(identifier, size, overlay, state, markup, signal);
53
53
  },
54
- args: () => [this.identifier, this.size, this.overlay, this.state, this.markup]
54
+ args: () => [this.identifier, this.size, this.overlay, this.state, this.markup] as const
55
55
  });
56
56
 
57
57
  protected override render(): TemplateResult | symbol {
@@ -34,7 +34,7 @@ export class ThumbnailElement extends LitElement {
34
34
  @property({ type: Number, reflect: true }) height: number;
35
35
 
36
36
  private readonly thumbnailTask = new Task(this, {
37
- task: async ([url, size, keepAspectRatio, width, height]: [string, ThumbnailSizeType, boolean, number, number]): Promise<TemplateResult> => {
37
+ task: async ([url, size, keepAspectRatio, width, height]): Promise<TemplateResult> => {
38
38
  const thumbnailUrl = new URL(url, window.origin);
39
39
  thumbnailUrl.searchParams.set('size', size);
40
40
  thumbnailUrl.searchParams.set('keepAspectRatio', keepAspectRatio ? '1' : '0');
@@ -60,7 +60,7 @@ export class ThumbnailElement extends LitElement {
60
60
  }));
61
61
  return html`${img}`;
62
62
  },
63
- args: () => [this.url, this.size, this.keepAspectRatio, this.width, this.height]
63
+ args: () => [this.url, this.size, this.keepAspectRatio, this.width, this.height] as const
64
64
  });
65
65
 
66
66
  protected override createRenderRoot(): HTMLElement | ShadowRoot {
@@ -79,7 +79,7 @@ class ElementBrowser {
79
79
  const isInModalFrame = typeof window.frames !== 'undefined'
80
80
  && typeof window.frames.frameElement !== 'undefined'
81
81
  && window.frames.frameElement.classList.contains('t3js-modal-iframe');
82
- const otherModalFrames = Array.from(top.frames || []).filter((item: Window) => {
82
+ const otherModalFrames = Array.from(top.frames || []).filter((item) => {
83
83
  try {
84
84
  return typeof item.frameElement !== 'undefined'
85
85
  && item.frameElement.classList.contains('t3js-modal-iframe')
@@ -33,14 +33,14 @@ class ConsumerScope {
33
33
 
34
34
  public detach(consumer: Consumable): void {
35
35
  this.consumers = this.consumers.filter(
36
- (currentConsumer: Consumable) => currentConsumer !== consumer,
36
+ (currentConsumer) => currentConsumer !== consumer,
37
37
  );
38
38
  }
39
39
 
40
40
  public async invoke(request: InteractionRequest): Promise<void> {
41
41
  const promises: Promise<void>[] = [];
42
42
  this.consumers.forEach(
43
- (consumer: Consumable) => {
43
+ (consumer) => {
44
44
  const promise: Promise<void> = consumer.consume.call(consumer, request);
45
45
  if (promise) {
46
46
  promises.push(promise);
@@ -20,5 +20,5 @@ export interface PromiseControls<T> {
20
20
 
21
21
  export interface InteractionRequestAssignment {
22
22
  request: InteractionRequest;
23
- deferreds: PromiseControls<unknown>[];
23
+ deferreds: PromiseControls<never>[];
24
24
  }
@@ -17,7 +17,7 @@ import type { InteractionRequestAssignment, PromiseControls } from './interactio
17
17
  class InteractionRequestMap {
18
18
  private assignments: InteractionRequestAssignment[] = [];
19
19
 
20
- public attachFor(request: InteractionRequest, deferred: PromiseControls<unknown>): void {
20
+ public attachFor(request: InteractionRequest, deferred: PromiseControls<never>): void {
21
21
  let targetAssignment: InteractionRequestAssignment = this.getFor(request);
22
22
  if (targetAssignment === null) {
23
23
  targetAssignment = { request, deferreds: [] };
@@ -29,14 +29,14 @@ class InteractionRequestMap {
29
29
  public detachFor(request: InteractionRequest): void {
30
30
  const targetAssignment = this.getFor(request);
31
31
  this.assignments = this.assignments.filter(
32
- (assignment: InteractionRequestAssignment) => assignment === targetAssignment,
32
+ (assignment) => assignment === targetAssignment,
33
33
  );
34
34
  }
35
35
 
36
36
  public getFor(triggerEvent: InteractionRequest): InteractionRequestAssignment | null {
37
37
  let targetAssignment: InteractionRequestAssignment = null;
38
38
  this.assignments.some(
39
- (assignment: InteractionRequestAssignment) => {
39
+ (assignment) => {
40
40
  if (assignment.request === triggerEvent) {
41
41
  targetAssignment = assignment;
42
42
  return true;
@@ -135,7 +135,7 @@ class FlexFormContainerContainer {
135
135
  }
136
136
 
137
137
  private registerPanelToggle(): void {
138
- ['hide.bs.collapse', 'show.bs.collapse'].forEach((eventName: string): void => {
138
+ ['hide.bs.collapse', 'show.bs.collapse'].forEach((eventName): void => {
139
139
  new RegularEvent(eventName, (e: Event): void => {
140
140
  if (e.target !== this.containerContent) {
141
141
  return;
@@ -147,7 +147,7 @@ class FlexFormContainerContainer {
147
147
  }
148
148
 
149
149
  private registerPreviewUpdate(): void {
150
- ['input', 'change'].forEach((eventName: string): void => {
150
+ ['input', 'change'].forEach((eventName): void => {
151
151
  new RegularEvent(eventName, (): void => {
152
152
  this.generatePreview();
153
153
  }).delegateTo(this.containerContent, 'input[type="text"], textarea');