From 695a71e229b6c8d0b7ec7cea8bed4268cf4c84e8 Mon Sep 17 00:00:00 2001 From: Ben Tran Date: Thu, 16 Apr 2026 13:47:26 +0930 Subject: [PATCH 1/9] INT-3396: Go zoneless --- README.md | 19 +-------- stories/Editor.stories.ts | 2 +- .../src/main/ts/editor/editor.component.ts | 21 ++++------ .../src/main/ts/utils/Utils.ts | 11 +++-- .../src/test/ts/alien/InitTestEnvironment.ts | 6 +-- .../src/test/ts/alien/TestHooks.ts | 8 +++- .../test/ts/browser/EventBlacklistingTest.ts | 18 +++----- .../src/test/ts/browser/FormControlTest.ts | 4 +- .../src/test/ts/browser/NgModelTest.ts | 4 +- .../src/test/ts/browser/NgZoneTest.ts | 42 ------------------- .../src/test/ts/browser/PropTest.ts | 4 +- 11 files changed, 37 insertions(+), 102 deletions(-) delete mode 100644 tinymce-angular-component/src/test/ts/browser/NgZoneTest.ts diff --git a/README.md b/README.md index e0881664..39c8d05d 100644 --- a/README.md +++ b/README.md @@ -20,23 +20,8 @@ This package is a thin wrapper around [TinyMCE](https://github.com/tinymce/tinym |<= 8 |3.x | |< 5 | Not supported | -### Not yet Zoneless ( >=Angular v21 ) -* This wrapper still requires `zone.js` to ensure backward compatibility to older Angular versions. Therefore, if your application uses Angular v21 or higher, it needs to include `provideZoneDetection()` in its providers. - -```jsx -import { NgModule, provideZoneChangeDetection } from '@angular/core'; - -@NgModule({ - declarations: [ - // ... - ], - imports: [ - // ... - ], - providers: [ provideZoneChangeDetection() ], - bootstrap: [ AppComponent ] -}) -``` +### Zoneless Support ( >=Angular v19 ) +This wrapper supports Angular's zoneless change detection. No additional configuration is needed — the component works with both zone-based and zoneless applications. ### Issues diff --git a/stories/Editor.stories.ts b/stories/Editor.stories.ts index 87db2d26..0429d627 100644 --- a/stories/Editor.stories.ts +++ b/stories/Editor.stories.ts @@ -30,7 +30,7 @@ export const IframeStory: StoryObj = { initialValue: sampleContent, init: { height: 300, - plugins: 'help', + plugins: 'help code', }, } }; diff --git a/tinymce-angular-component/src/main/ts/editor/editor.component.ts b/tinymce-angular-component/src/main/ts/editor/editor.component.ts index 2aff2f9b..ce122020 100644 --- a/tinymce-angular-component/src/main/ts/editor/editor.component.ts +++ b/tinymce-angular-component/src/main/ts/editor/editor.component.ts @@ -7,7 +7,6 @@ import { forwardRef, Inject, Input, - NgZone, OnDestroy, PLATFORM_ID, InjectionToken, @@ -34,7 +33,7 @@ const EDITOR_COMPONENT_VALUE_ACCESSOR = { multi: true }; -export type Version = `${'4' | '5' | '6' | '7' | '8'}${'' | '-dev' | '-testing' | `.${number}` | `.${number}.${number}`}`; +export type Version = `${'5' | '6' | '7' | '8'}${'' | '-dev' | '-testing' | `.${number}` | `.${number}.${number}`}`; @Component({ selector: 'editor', @@ -97,7 +96,7 @@ export class EditorComponent extends Events implements AfterViewInit, ControlVal return this._editor; } - public ngZone: NgZone; + // public ngZone: NgZone; private _elementRef: ElementRef; private _element?: HTMLElement; @@ -112,14 +111,14 @@ export class EditorComponent extends Events implements AfterViewInit, ControlVal public constructor( elementRef: ElementRef, - ngZone: NgZone, + // ngZone: NgZone, private cdRef: ChangeDetectorRef, @Inject(PLATFORM_ID) private platformId: object, @Optional() @Inject(TINYMCE_SCRIPT_SRC) private tinymceScriptSrc?: string ) { super(); this._elementRef = elementRef; - this.ngZone = ngZone; + // this.ngZone = ngZone; } public writeValue(value: string | null): void { @@ -222,9 +221,9 @@ export class EditorComponent extends Events implements AfterViewInit, ControlVal this._element.style.visibility = ''; } - this.ngZone.runOutsideAngular(() => { - getTinymce().init(finalInit); - }); + // this.ngZone.runOutsideAngular(() => { + getTinymce().init(finalInit); + // }); }; private getScriptSrc() { @@ -236,16 +235,15 @@ export class EditorComponent extends Events implements AfterViewInit, ControlVal private initEditor(editor: TinyMCEEditor) { listenTinyMCEEvent(editor, 'blur', this.destroy$).subscribe(() => { this.cdRef.markForCheck(); - this.ngZone.run(() => this.onTouchedCallback()); + this.onTouchedCallback(); }); listenTinyMCEEvent(editor, this.modelEvents, this.destroy$).subscribe(() => { this.cdRef.markForCheck(); - this.ngZone.run(() => this.emitOnChange(editor)); + this.emitOnChange(editor); }); if (typeof this.initialValue === 'string') { - this.ngZone.run(() => { editor.setContent(this.initialValue as string); if (editor.getContent() !== this.initialValue) { this.emitOnChange(editor); @@ -253,7 +251,6 @@ export class EditorComponent extends Events implements AfterViewInit, ControlVal if (this.onInitNgModel !== undefined) { this.onInitNgModel.emit(editor as unknown as EventObj); } - }); } } diff --git a/tinymce-angular-component/src/main/ts/utils/Utils.ts b/tinymce-angular-component/src/main/ts/utils/Utils.ts index 7776e6f6..759d366b 100644 --- a/tinymce-angular-component/src/main/ts/utils/Utils.ts +++ b/tinymce-angular-component/src/main/ts/utils/Utils.ts @@ -25,16 +25,15 @@ const listenTinyMCEEvent = ( const bindHandlers = (ctx: EditorComponent, editor: any, destroy$: Subject): void => { const allowedEvents = getValidEvents(ctx); allowedEvents.forEach((eventName) => { - const eventEmitter: EventEmitter = ctx[eventName]; + const eventEmitter: EventEmitter = ctx[eventName] listenTinyMCEEvent(editor, eventName.substring(2), destroy$).subscribe((event) => { - // Caretaker note: `ngZone.run()` runs change detection since it notifies the forked Angular zone that it's - // being re-entered. We don't want to run `ApplicationRef.tick()` if anyone listens to the specific event - // within the template. E.g. if the `onSelectionChange` is not listened within the template like: + // Caretaker note: We only emit if the event emitter is observed to avoid scheduling unnecessary change + // detection runs. E.g. if `onSelectionChange` is not bound in the template like: // `` - // then it won't be "observed", and we won't run "dead" change detection. + // then it won't be "observed" and we can skip emmitting the event if (isObserved(eventEmitter)) { - ctx.ngZone.run(() => eventEmitter.emit({ event, editor })); + eventEmitter.emit({ event, editor }); } }); }); diff --git a/tinymce-angular-component/src/test/ts/alien/InitTestEnvironment.ts b/tinymce-angular-component/src/test/ts/alien/InitTestEnvironment.ts index ef30f93d..ff22163b 100644 --- a/tinymce-angular-component/src/test/ts/alien/InitTestEnvironment.ts +++ b/tinymce-angular-component/src/test/ts/alien/InitTestEnvironment.ts @@ -1,13 +1,11 @@ import 'core-js/features/reflect'; -import 'zone.js'; -import 'zone.js/plugins/fake-async-test'; import { TestBed } from '@angular/core/testing'; import { BrowserTestingModule, platformBrowserTesting } from '@angular/platform-browser/testing'; -import { NgModule, provideZoneChangeDetection } from '@angular/core'; +import { NgModule, provideZonelessChangeDetection } from '@angular/core'; @NgModule({ - providers: [ provideZoneChangeDetection() ], + providers: [ provideZonelessChangeDetection() ], }) class AppTestingModule {} diff --git a/tinymce-angular-component/src/test/ts/alien/TestHooks.ts b/tinymce-angular-component/src/test/ts/alien/TestHooks.ts index 262e5e57..2b589804 100644 --- a/tinymce-angular-component/src/test/ts/alien/TestHooks.ts +++ b/tinymce-angular-component/src/test/ts/alien/TestHooks.ts @@ -85,10 +85,14 @@ export const editorHook = (component: Type, moduleDef: TestModul // after global tinymce is removed in a clean up. Specifically, it happens when unloading/loading different versions of TinyMCE if (editor.licenseKeyManager) { editor.licenseKeyManager.validate({}).then(() => { - resolve(editor as Editor); + setTimeout(() => { + resolve(editor as Editor); + }, 500); }).catch((reason) => console.warn(reason)); } else { - resolve(editor as Editor); + setTimeout(() => { + resolve(editor as Editor); + }, 500); } }); }) diff --git a/tinymce-angular-component/src/test/ts/browser/EventBlacklistingTest.ts b/tinymce-angular-component/src/test/ts/browser/EventBlacklistingTest.ts index ffcc2c68..b3351198 100644 --- a/tinymce-angular-component/src/test/ts/browser/EventBlacklistingTest.ts +++ b/tinymce-angular-component/src/test/ts/browser/EventBlacklistingTest.ts @@ -4,19 +4,13 @@ import { describe, it } from '@ephox/bedrock-client'; import { EditorComponent } from '../../../main/ts/public_api'; import { eachVersionContext, editorHook } from '../alien/TestHooks'; -import { map, merge, timer, first, buffer, Observable, tap, firstValueFrom } from 'rxjs'; -import { NgZone } from '@angular/core'; +import { map, merge, timer, first, buffer, firstValueFrom } from 'rxjs'; import { Assertions } from '@ephox/agar'; import { Fun } from '@ephox/katamari'; -import { throwTimeout } from '../alien/TestHelpers'; +import { supportedTinymceVersions, throwTimeout } from '../alien/TestHelpers'; describe('EventBlacklistingTest', () => { - const shouldRunInAngularZone = (source: Observable) => - source.pipe( - tap(() => Assertions.assertEq('Subscribers to events should run within NgZone', true, NgZone.isInAngularZone())) - ); - - eachVersionContext([ '4', '5', '6', '7', '8' ], () => { + eachVersionContext(supportedTinymceVersions(), () => { const createFixture = editorHook(EditorComponent); it('Events should be bound when allowed', async () => { @@ -27,9 +21,9 @@ describe('EventBlacklistingTest', () => { const pEventsCompleted = firstValueFrom( merge( - fixture.editorComponent.onKeyUp.pipe(map(Fun.constant('onKeyUp')), shouldRunInAngularZone), - fixture.editorComponent.onKeyDown.pipe(map(Fun.constant('onKeyDown')), shouldRunInAngularZone), - fixture.editorComponent.onClick.pipe(map(Fun.constant('onClick')), shouldRunInAngularZone) + fixture.editorComponent.onKeyUp.pipe(map(Fun.constant('onKeyUp'))), + fixture.editorComponent.onKeyDown.pipe(map(Fun.constant('onKeyDown'))), + fixture.editorComponent.onClick.pipe(map(Fun.constant('onClick'))) ).pipe(throwTimeout(10000, 'Timed out waiting for some event to fire'), buffer(timer(100)), first()) ); fixture.editor.fire('keydown'); diff --git a/tinymce-angular-component/src/test/ts/browser/FormControlTest.ts b/tinymce-angular-component/src/test/ts/browser/FormControlTest.ts index 720813d8..d20db257 100644 --- a/tinymce-angular-component/src/test/ts/browser/FormControlTest.ts +++ b/tinymce-angular-component/src/test/ts/browser/FormControlTest.ts @@ -10,7 +10,7 @@ import { eachVersionContext, editorHook, fixtureHook } from '../alien/TestHooks' import { By } from '@angular/platform-browser'; import { first, firstValueFrom, switchMap } from 'rxjs'; import type { Editor } from 'tinymce'; -import { fakeTypeInEditor } from '../alien/TestHelpers'; +import { fakeTypeInEditor, supportedTinymceVersions } from '../alien/TestHelpers'; type FormControlProps = Partial>; @@ -21,7 +21,7 @@ describe('FormControlTest', () => { } }; - eachVersionContext([ '4', '5', '6', '7', '8' ], () => { + eachVersionContext(supportedTinymceVersions(), () => { [ ChangeDetectionStrategy.Default, ChangeDetectionStrategy.OnPush ].forEach((changeDetection) => { context(`[formControl] with change detection: ${changeDetection}`, () => { @Component({ diff --git a/tinymce-angular-component/src/test/ts/browser/NgModelTest.ts b/tinymce-angular-component/src/test/ts/browser/NgModelTest.ts index 79323fc5..1d0bb1e1 100644 --- a/tinymce-angular-component/src/test/ts/browser/NgModelTest.ts +++ b/tinymce-angular-component/src/test/ts/browser/NgModelTest.ts @@ -8,14 +8,14 @@ import { describe, it } from '@ephox/bedrock-client'; import { EditorComponent } from '../../../main/ts/editor/editor.component'; import { eachVersionContext, editorHook } from '../alien/TestHooks'; -import { fakeTypeInEditor } from '../alien/TestHelpers'; +import { fakeTypeInEditor, supportedTinymceVersions } from '../alien/TestHelpers'; describe('NgModelTest', () => { const assertNgModelState = (prop: 'valid' | 'pristine' | 'touched', expected: boolean, ngModel: NgModel) => { Assertions.assertEq('assert ngModel ' + prop + ' state', expected, ngModel[prop]); }; - eachVersionContext([ '4', '5', '6', '7', '8' ], () => { + eachVersionContext(supportedTinymceVersions(), () => { @Component({ standalone: true, imports: [ EditorComponent, FormsModule ], diff --git a/tinymce-angular-component/src/test/ts/browser/NgZoneTest.ts b/tinymce-angular-component/src/test/ts/browser/NgZoneTest.ts deleted file mode 100644 index fe41e20b..00000000 --- a/tinymce-angular-component/src/test/ts/browser/NgZoneTest.ts +++ /dev/null @@ -1,42 +0,0 @@ -import '../alien/InitTestEnvironment'; - -import { NgZone } from '@angular/core'; -import { Assertions } from '@ephox/agar'; -import { describe, it } from '@ephox/bedrock-client'; - -import { EditorComponent } from '../../../main/ts/editor/editor.component'; -import { eachVersionContext, fixtureHook } from '../alien/TestHooks'; -import { first } from 'rxjs'; -import { throwTimeout } from '../alien/TestHelpers'; - -describe('NgZoneTest', () => { - eachVersionContext([ '4', '5', '6', '7', '8' ], () => { - const createFixture = fixtureHook(EditorComponent, { imports: [ EditorComponent ] }); - - it('Subscribers to events should run within NgZone', async () => { - const fixture = createFixture(); - const editor = fixture.componentInstance; - fixture.detectChanges(); - await new Promise((resolve) => { - editor.onInit.pipe(first(), throwTimeout(10000, 'Timed out waiting for init event')).subscribe(() => { - Assertions.assertEq('Subscribers to onInit should run within NgZone', true, NgZone.isInAngularZone()); - resolve(); - }); - }); - }); - - // Lets just test one EventEmitter, if one works all should work - it('Subscribers to onKeyUp should run within NgZone', async () => { - const fixture = createFixture(); - const editor = fixture.componentInstance; - fixture.detectChanges(); - await new Promise((resolve) => { - editor.onKeyUp.pipe(first(), throwTimeout(10000, 'Timed out waiting for key up event')).subscribe(() => { - Assertions.assertEq('Subscribers to onKeyUp should run within NgZone', true, NgZone.isInAngularZone()); - resolve(); - }); - editor.editor?.fire('keyup'); - }); - }); - }); -}); diff --git a/tinymce-angular-component/src/test/ts/browser/PropTest.ts b/tinymce-angular-component/src/test/ts/browser/PropTest.ts index 9aaae3c5..4a2a7dc0 100644 --- a/tinymce-angular-component/src/test/ts/browser/PropTest.ts +++ b/tinymce-angular-component/src/test/ts/browser/PropTest.ts @@ -5,7 +5,7 @@ import { context, describe, it } from '@ephox/bedrock-client'; import { EditorComponent } from '../../../main/ts/public_api'; import { eachVersionContext, fixtureHook } from '../alien/TestHooks'; -import { captureLogs, throwTimeout } from '../alien/TestHelpers'; +import { captureLogs, supportedTinymceVersions, throwTimeout } from '../alien/TestHelpers'; import { concatMap, distinct, firstValueFrom, mergeMap, of, toArray } from 'rxjs'; import { ComponentFixture } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; @@ -42,7 +42,7 @@ describe('PropTest', () => { ) ); - eachVersionContext([ '4', '5', '6', '7', '8' ], () => { + eachVersionContext(supportedTinymceVersions(), () => { context('Single editor with ID', () => { @Component({ standalone: true, From 75c6f295fa761669ba14e1cd5c6efa6db81e3a1d Mon Sep 17 00:00:00 2001 From: Ben Tran Date: Thu, 16 Apr 2026 14:31:43 +0930 Subject: [PATCH 2/9] Remove zone.js --- package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/package.json b/package.json index 9f7ad2ee..c10c318f 100644 --- a/package.json +++ b/package.json @@ -71,8 +71,7 @@ "to-string-loader": "^1.1.5", "tslib": "^2.6.2", "typescript": "^5.9.3", - "webpack": "^5.95.0", - "zone.js": "~0.16.0" + "webpack": "^5.95.0" }, "version": "9.1.2-rc", "name": "@tinymce/tinymce-angular", From 199d9b582f0021117ca3731dd0e08a0bb3325883 Mon Sep 17 00:00:00 2001 From: Ben Tran Date: Thu, 16 Apr 2026 15:02:14 +0930 Subject: [PATCH 3/9] Enable zoneless in storybook --- angular.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/angular.json b/angular.json index 5bcbb5dc..64492bbe 100644 --- a/angular.json +++ b/angular.json @@ -21,6 +21,7 @@ "configDir": ".storybook", "browserTarget": "angular:build", "compodoc": false, + "experimentalZoneless": true, "port": 9001 } }, @@ -30,7 +31,8 @@ "configDir": ".storybook", "browserTarget": "angular:build", "compodoc": false, - "outputDir": "storybook-static" + "outputDir": "storybook-static", + "experimentalZoneless": true } } } From bc9355b8ad4e4004b031b6d0381a2d791091ad5a Mon Sep 17 00:00:00 2001 From: Ben Tran Date: Thu, 16 Apr 2026 15:02:31 +0930 Subject: [PATCH 4/9] Clean up --- .../src/main/ts/editor/editor.component.ts | 14 ++++---------- yarn.lock | 5 ----- 2 files changed, 4 insertions(+), 15 deletions(-) diff --git a/tinymce-angular-component/src/main/ts/editor/editor.component.ts b/tinymce-angular-component/src/main/ts/editor/editor.component.ts index ce122020..80f620d4 100644 --- a/tinymce-angular-component/src/main/ts/editor/editor.component.ts +++ b/tinymce-angular-component/src/main/ts/editor/editor.component.ts @@ -2,17 +2,17 @@ import { isPlatformBrowser, CommonModule } from '@angular/common'; import { AfterViewInit, + ChangeDetectionStrategy, + ChangeDetectorRef, Component, ElementRef, forwardRef, Inject, + InjectionToken, Input, OnDestroy, - PLATFORM_ID, - InjectionToken, Optional, - ChangeDetectorRef, - ChangeDetectionStrategy + PLATFORM_ID, } from '@angular/core'; import { FormsModule, ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; import { Subject, takeUntil } from 'rxjs'; @@ -96,8 +96,6 @@ export class EditorComponent extends Events implements AfterViewInit, ControlVal return this._editor; } - // public ngZone: NgZone; - private _elementRef: ElementRef; private _element?: HTMLElement; private _disabled?: boolean; @@ -111,14 +109,12 @@ export class EditorComponent extends Events implements AfterViewInit, ControlVal public constructor( elementRef: ElementRef, - // ngZone: NgZone, private cdRef: ChangeDetectorRef, @Inject(PLATFORM_ID) private platformId: object, @Optional() @Inject(TINYMCE_SCRIPT_SRC) private tinymceScriptSrc?: string ) { super(); this._elementRef = elementRef; - // this.ngZone = ngZone; } public writeValue(value: string | null): void { @@ -221,9 +217,7 @@ export class EditorComponent extends Events implements AfterViewInit, ControlVal this._element.style.visibility = ''; } - // this.ngZone.runOutsideAngular(() => { getTinymce().init(finalInit); - // }); }; private getScriptSrc() { diff --git a/yarn.lock b/yarn.lock index f2a4697d..a90c6749 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13914,8 +13914,3 @@ zone.js@~0.10.3: version "0.10.3" resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.10.3.tgz#3e5e4da03c607c9dcd92e37dd35687a14a140c16" integrity sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg== - -zone.js@~0.16.0: - version "0.16.0" - resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.16.0.tgz#955b9e28846d76ca2ef7091c8f9e96f35f79e828" - integrity sha512-LqLPpIQANebrlxY6jKcYKdgN5DTXyyHAKnnWWjE5pPfEQ4n7j5zn7mOEEpwNZVKGqx3kKKmvplEmoBrvpgROTA== From d46fda549062874bdf5d04c5046cb37c2cab13f5 Mon Sep 17 00:00:00 2001 From: Ben Tran Date: Tue, 21 Apr 2026 12:12:06 +0930 Subject: [PATCH 5/9] Fix lint errors --- .../src/main/ts/editor/editor.component.ts | 14 +++++++------- .../src/main/ts/utils/Utils.ts | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/tinymce-angular-component/src/main/ts/editor/editor.component.ts b/tinymce-angular-component/src/main/ts/editor/editor.component.ts index 80f620d4..6b94a1fb 100644 --- a/tinymce-angular-component/src/main/ts/editor/editor.component.ts +++ b/tinymce-angular-component/src/main/ts/editor/editor.component.ts @@ -238,13 +238,13 @@ export class EditorComponent extends Events implements AfterViewInit, ControlVal }); if (typeof this.initialValue === 'string') { - editor.setContent(this.initialValue as string); - if (editor.getContent() !== this.initialValue) { - this.emitOnChange(editor); - } - if (this.onInitNgModel !== undefined) { - this.onInitNgModel.emit(editor as unknown as EventObj); - } + editor.setContent(this.initialValue as string); + if (editor.getContent() !== this.initialValue) { + this.emitOnChange(editor); + } + if (this.onInitNgModel !== undefined) { + this.onInitNgModel.emit(editor as unknown as EventObj); + } } } diff --git a/tinymce-angular-component/src/main/ts/utils/Utils.ts b/tinymce-angular-component/src/main/ts/utils/Utils.ts index 759d366b..83a6dd1e 100644 --- a/tinymce-angular-component/src/main/ts/utils/Utils.ts +++ b/tinymce-angular-component/src/main/ts/utils/Utils.ts @@ -25,7 +25,7 @@ const listenTinyMCEEvent = ( const bindHandlers = (ctx: EditorComponent, editor: any, destroy$: Subject): void => { const allowedEvents = getValidEvents(ctx); allowedEvents.forEach((eventName) => { - const eventEmitter: EventEmitter = ctx[eventName] + const eventEmitter: EventEmitter = ctx[eventName]; listenTinyMCEEvent(editor, eventName.substring(2), destroy$).subscribe((event) => { // Caretaker note: We only emit if the event emitter is observed to avoid scheduling unnecessary change From e603d762bfcf13ac5facd5b0762b83185213b303 Mon Sep 17 00:00:00 2001 From: Ben Tran Date: Tue, 21 Apr 2026 13:29:12 +0930 Subject: [PATCH 6/9] Increase the timeout for test hook --- tinymce-angular-component/src/test/ts/alien/TestHooks.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tinymce-angular-component/src/test/ts/alien/TestHooks.ts b/tinymce-angular-component/src/test/ts/alien/TestHooks.ts index 2b589804..785ea916 100644 --- a/tinymce-angular-component/src/test/ts/alien/TestHooks.ts +++ b/tinymce-angular-component/src/test/ts/alien/TestHooks.ts @@ -72,7 +72,7 @@ export const editorHook = (component: Type, moduleDef: TestModul return firstValueFrom( editorComponent.onInit.pipe( - throwTimeout(10000, `Timed out waiting for editor to load`), + throwTimeout(15000, `Timed out waiting for editor to load`), switchMap( ({ editor }) => new Promise((resolve) => { From b2fa0aeb32d1cbbf2a458333b2446ff9068fc91e Mon Sep 17 00:00:00 2001 From: Ben Tran Date: Wed, 22 Apr 2026 12:53:20 +0930 Subject: [PATCH 7/9] Add an after hook to delete tinymce --- .../src/test/ts/alien/InitTestEnvironment.ts | 4 ++-- .../src/test/ts/alien/TestHooks.ts | 15 +++++++-------- .../src/test/ts/browser/EventBlacklistingTest.ts | 8 ++++++-- .../src/test/ts/browser/LoadTinyTest.ts | 6 +++--- 4 files changed, 18 insertions(+), 15 deletions(-) diff --git a/tinymce-angular-component/src/test/ts/alien/InitTestEnvironment.ts b/tinymce-angular-component/src/test/ts/alien/InitTestEnvironment.ts index ff22163b..918d764b 100644 --- a/tinymce-angular-component/src/test/ts/alien/InitTestEnvironment.ts +++ b/tinymce-angular-component/src/test/ts/alien/InitTestEnvironment.ts @@ -2,10 +2,10 @@ import 'core-js/features/reflect'; import { TestBed } from '@angular/core/testing'; import { BrowserTestingModule, platformBrowserTesting } from '@angular/platform-browser/testing'; -import { NgModule, provideZonelessChangeDetection } from '@angular/core'; +import { NgModule } from '@angular/core'; @NgModule({ - providers: [ provideZonelessChangeDetection() ], + providers: [], }) class AppTestingModule {} diff --git a/tinymce-angular-component/src/test/ts/alien/TestHooks.ts b/tinymce-angular-component/src/test/ts/alien/TestHooks.ts index 785ea916..c9513569 100644 --- a/tinymce-angular-component/src/test/ts/alien/TestHooks.ts +++ b/tinymce-angular-component/src/test/ts/alien/TestHooks.ts @@ -23,9 +23,8 @@ export const tinymceVersionHook = (version: Version) => { before(async () => { await VersionLoader.pLoadVersion(version); }); - after(() => { - deleteTinymce(); - }); + + after(deleteTinymce); }; export interface EditorFixture extends ComponentFixture { @@ -72,7 +71,7 @@ export const editorHook = (component: Type, moduleDef: TestModul return firstValueFrom( editorComponent.onInit.pipe( - throwTimeout(15000, `Timed out waiting for editor to load`), + throwTimeout(10000, `Timed out waiting for editor to load`), switchMap( ({ editor }) => new Promise((resolve) => { @@ -85,14 +84,14 @@ export const editorHook = (component: Type, moduleDef: TestModul // after global tinymce is removed in a clean up. Specifically, it happens when unloading/loading different versions of TinyMCE if (editor.licenseKeyManager) { editor.licenseKeyManager.validate({}).then(() => { - setTimeout(() => { + // setTimeout(() => { resolve(editor as Editor); - }, 500); + // }, 500); }).catch((reason) => console.warn(reason)); } else { - setTimeout(() => { + // setTimeout(() => { resolve(editor as Editor); - }, 500); + // }, 500); } }); }) diff --git a/tinymce-angular-component/src/test/ts/browser/EventBlacklistingTest.ts b/tinymce-angular-component/src/test/ts/browser/EventBlacklistingTest.ts index b3351198..4fca2e8c 100644 --- a/tinymce-angular-component/src/test/ts/browser/EventBlacklistingTest.ts +++ b/tinymce-angular-component/src/test/ts/browser/EventBlacklistingTest.ts @@ -1,16 +1,20 @@ import '../alien/InitTestEnvironment'; -import { describe, it } from '@ephox/bedrock-client'; +import { after, describe, it } from '@ephox/bedrock-client'; import { EditorComponent } from '../../../main/ts/public_api'; import { eachVersionContext, editorHook } from '../alien/TestHooks'; import { map, merge, timer, first, buffer, firstValueFrom } from 'rxjs'; import { Assertions } from '@ephox/agar'; import { Fun } from '@ephox/katamari'; -import { supportedTinymceVersions, throwTimeout } from '../alien/TestHelpers'; +import { deleteTinymce, supportedTinymceVersions, throwTimeout } from '../alien/TestHelpers'; describe('EventBlacklistingTest', () => { eachVersionContext(supportedTinymceVersions(), () => { + after(() => { + deleteTinymce(); + }); + const createFixture = editorHook(EditorComponent); it('Events should be bound when allowed', async () => { diff --git a/tinymce-angular-component/src/test/ts/browser/LoadTinyTest.ts b/tinymce-angular-component/src/test/ts/browser/LoadTinyTest.ts index 9b00970e..5fbfd779 100644 --- a/tinymce-angular-component/src/test/ts/browser/LoadTinyTest.ts +++ b/tinymce-angular-component/src/test/ts/browser/LoadTinyTest.ts @@ -1,7 +1,7 @@ import '../alien/InitTestEnvironment'; import { Assertions } from '@ephox/agar'; -import { describe, it, context, before } from '@ephox/bedrock-client'; +import { describe, it, context, after } from '@ephox/bedrock-client'; import { Global } from '@ephox/katamari'; import { EditorComponent, TINYMCE_SCRIPT_SRC } from '../../../main/ts/public_api'; @@ -28,7 +28,7 @@ describe('LoadTinyTest', () => { ], }); - before(deleteTinymce); + after(deleteTinymce); it('Should be able to load local version of TinyMCE specified via dependency injection', async () => { const { editor } = await createFixture(); @@ -51,7 +51,7 @@ describe('LoadTinyTest', () => { context(`With cloud version ${version}`, () => { const createFixture = editorHook(EditorComponent); - before(deleteTinymce); + after(deleteTinymce); it(`Should be able to load TinyMCE ${version} from Cloud`, async () => { const { editor } = await createFixture({ cloudChannel: version, apiKey: key }); From b272afa5a5183f7f1cbf9ff5382605dd8e2922d2 Mon Sep 17 00:00:00 2001 From: Ben Tran Date: Wed, 22 Apr 2026 13:15:07 +0930 Subject: [PATCH 8/9] Fix lint --- tinymce-angular-component/src/test/ts/alien/TestHooks.ts | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/tinymce-angular-component/src/test/ts/alien/TestHooks.ts b/tinymce-angular-component/src/test/ts/alien/TestHooks.ts index c9513569..53f3bee0 100644 --- a/tinymce-angular-component/src/test/ts/alien/TestHooks.ts +++ b/tinymce-angular-component/src/test/ts/alien/TestHooks.ts @@ -84,14 +84,10 @@ export const editorHook = (component: Type, moduleDef: TestModul // after global tinymce is removed in a clean up. Specifically, it happens when unloading/loading different versions of TinyMCE if (editor.licenseKeyManager) { editor.licenseKeyManager.validate({}).then(() => { - // setTimeout(() => { - resolve(editor as Editor); - // }, 500); + resolve(editor as Editor); }).catch((reason) => console.warn(reason)); } else { - // setTimeout(() => { - resolve(editor as Editor); - // }, 500); + resolve(editor as Editor); } }); }) From 4c825269ccb6cc4492ca1cb468d61c4d14a4c89e Mon Sep 17 00:00:00 2001 From: Ben Tran Date: Wed, 22 Apr 2026 13:37:17 +0930 Subject: [PATCH 9/9] Clean up --- package.json | 11 +--- yarn.lock | 179 +++------------------------------------------------ 2 files changed, 11 insertions(+), 179 deletions(-) diff --git a/package.json b/package.json index c10c318f..10291005 100644 --- a/package.json +++ b/package.json @@ -44,34 +44,25 @@ "@tinymce/miniature": "^6.0.0", "@types/chai": "^4.3.16", "@types/node": "^20.14.12", - "autoprefixer": "^10.4.19", "babel-loader": "^9.1.3", "chai": "^5.1.1", - "codelyzer": "^6.0.2", "copyfiles": "^2.4.1", - "core-js": "^3.36.1", "eslint-plugin-chai-friendly": "^1.0.0", "eslint-plugin-storybook": "^0.8.0", "gh-pages": "^6.1.0", "json": "11.0.0", "ng-packagr": "^18.1.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "regenerator-runtime": "^0.14.1", "rimraf": "^6.0.1", "rxjs": "^7.8.1", "storybook": "^9", "tinymce": "^8.0.0", - "tinymce-4": "npm:tinymce@^4", "tinymce-5": "npm:tinymce@^5", "tinymce-6": "npm:tinymce@^6", "tinymce-7": "npm:tinymce@^7", "tinymce-7.5.0": "npm:tinymce@7.5.0", "tinymce-8": "npm:tinymce@^8", - "to-string-loader": "^1.1.5", "tslib": "^2.6.2", - "typescript": "^5.9.3", - "webpack": "^5.95.0" + "typescript": "^5.9.3" }, "version": "9.1.2-rc", "name": "@tinymce/tinymce-angular", diff --git a/yarn.lock b/yarn.lock index a90c6749..fcfe5f4c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -338,11 +338,6 @@ tslib "^2.3.0" yargs "^18.0.0" -"@angular/compiler@9.0.0": - version "9.0.0" - resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-9.0.0.tgz#87e0bef4c369b6cadae07e3a4295778fc93799d5" - integrity sha512-ctjwuntPfZZT2mNj2NDIVu51t9cvbhl/16epc5xEwyzyDt76pX9UgwvY+MbXrf/C/FWwdtmNtfP698BKI+9leQ== - "@angular/compiler@^21.0.8": version "21.0.8" resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-21.0.8.tgz#be391e920dd592e4a6c8365178e99d43816b367e" @@ -350,11 +345,6 @@ dependencies: tslib "^2.3.0" -"@angular/core@9.0.0": - version "9.0.0" - resolved "https://registry.yarnpkg.com/@angular/core/-/core-9.0.0.tgz#227dc53e1ac81824f998c6e76000b7efc522641e" - integrity sha512-6Pxgsrf0qF9iFFqmIcWmjJGkkCaCm6V5QNnxMy2KloO3SDq6QuMVRbN9RtC8Urmo25LP+eZ6ZgYqFYpdD8Hd9w== - "@angular/core@^21.0.8": version "21.0.8" resolved "https://registry.yarnpkg.com/@angular/core/-/core-21.0.8.tgz#f5203d106cd1da0b4e415f02025cc4ec3108ccea" @@ -5438,11 +5428,6 @@ anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" -app-root-path@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-3.1.0.tgz#5971a2fc12ba170369a7a1ef018c71e6e47c2e86" - integrity sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA== - archiver-utils@^5.0.0, archiver-utils@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-5.0.2.tgz#63bc719d951803efc72cf961a56ef810760dd14d" @@ -5488,14 +5473,6 @@ aria-query@5.3.0: dependencies: dequal "^2.0.3" -aria-query@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-3.0.0.tgz#65b3fcc1ca1155a8c9ae64d6eee297f15d5133cc" - integrity sha512-majUxHgLehQTeSA+hClx+DY09OVUqG3GtezWkF1krgLGNdlDu9l9V8DaqNMWbq4Eddc8wsyDA0hpDUtnYxQEXw== - dependencies: - ast-types-flow "0.0.7" - commander "^2.11.0" - aria-query@^5.0.0: version "5.3.2" resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.2.tgz#93f81a43480e33a338f19163a3d10a50c01dcd59" @@ -5536,11 +5513,6 @@ assertion-error@^2.0.1: resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-2.0.1.tgz#f641a196b335690b1070bf00b6e7593fec190bf7" integrity sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== -ast-types-flow@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" - integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== - ast-types@^0.13.4: version "0.13.4" resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.4.tgz#ee0d77b343263965ecc3fb62da16e7222b2b6782" @@ -5565,7 +5537,7 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== -autoprefixer@10.4.21, autoprefixer@^10.4.19: +autoprefixer@10.4.21: version "10.4.21" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.21.tgz#77189468e7a8ad1d9a37fbc08efc9f480cf0a95d" integrity sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ== @@ -5586,13 +5558,6 @@ axios@^1.6.2: form-data "^4.0.4" proxy-from-env "^1.1.0" -axobject-query@2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.0.2.tgz#ea187abe5b9002b377f925d8bf7d1c561adf38f9" - integrity sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww== - dependencies: - ast-types-flow "0.0.7" - b4a@^1.6.4: version "1.7.3" resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.7.3.tgz#24cf7ccda28f5465b66aec2bac69e32809bf112f" @@ -6258,26 +6223,6 @@ clone@^1.0.2: resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== -codelyzer@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/codelyzer/-/codelyzer-6.0.2.tgz#25d72eae641e8ff13ffd7d99b27c9c7ad5d7e135" - integrity sha512-v3+E0Ucu2xWJMOJ2fA/q9pDT/hlxHftHGPUay1/1cTgyPV5JTHFdO9hqo837Sx2s9vKBMTt5gO+lhF95PO6J+g== - dependencies: - "@angular/compiler" "9.0.0" - "@angular/core" "9.0.0" - app-root-path "^3.0.0" - aria-query "^3.0.0" - axobject-query "2.0.2" - css-selector-tokenizer "^0.7.1" - cssauron "^1.4.0" - damerau-levenshtein "^1.0.4" - rxjs "^6.5.3" - semver-dsl "^1.0.1" - source-map "^0.5.7" - sprintf-js "^1.1.2" - tslib "^1.10.0" - zone.js "~0.10.3" - color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -6349,7 +6294,7 @@ commander@^13.0.0: resolved "https://registry.yarnpkg.com/commander/-/commander-13.1.0.tgz#776167db68c78f38dcce1f9b8d7b8b9a488abf46" integrity sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw== -commander@^2.11.0, commander@^2.20.0: +commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -6515,7 +6460,7 @@ core-js-compat@^3.43.0: dependencies: browserslist "^4.28.0" -core-js@^3.36.1, core-js@^3.6.4: +core-js@^3.6.4: version "3.46.0" resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.46.0.tgz#323a092b96381a9184d0cd49ee9083b2f93373bb" integrity sha512-vDMm9B0xnqqZ8uSBpZ8sNtRtOdmfShrvT6h2TuQGLs0Is+cR0DYbj/KWP6ALVNbWPpqA/qPLoOuppJN07humpA== @@ -6649,14 +6594,6 @@ css-select@^6.0.0: domutils "^3.2.2" nth-check "^2.1.1" -css-selector-tokenizer@^0.7.1: - version "0.7.3" - resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz#735f26186e67c749aaf275783405cf0661fae8f1" - integrity sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg== - dependencies: - cssesc "^3.0.0" - fastparse "^1.1.2" - css-shorthand-properties@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/css-shorthand-properties/-/css-shorthand-properties-1.1.2.tgz#38fe2d8422190607cdb19c273c42303b774daf99" @@ -6682,23 +6619,11 @@ css.escape@^1.5.1: resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" integrity sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg== -cssauron@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/cssauron/-/cssauron-1.4.0.tgz#a6602dff7e04a8306dc0db9a551e92e8b5662ad8" - integrity sha512-Ht70DcFBh+/ekjVrYS2PlDMdSQEl3OFNmjK6lcn49HptBgilXf/Zwg4uFh9Xn0pX3Q8YOkSjIFOfK2osvdqpBw== - dependencies: - through X.X.X - cssesc@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -damerau-levenshtein@^1.0.4: - version "1.0.8" - resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" - integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== - data-uri-to-buffer@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz#d8feb2b2881e6a4f58c2e08acfd0e2834e26222e" @@ -7840,11 +7765,6 @@ fast-xml-parser@^4.4.1: dependencies: strnum "^1.1.1" -fastparse@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" - integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ== - fastq@^1.6.0: version "1.19.1" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.19.1.tgz#d50eaba803c8846a883c16492821ebcd2cda55f5" @@ -9284,7 +9204,7 @@ jquery@^3.4.1: resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.7.1.tgz#083ef98927c9a6a74d05a6af02806566d16274de" integrity sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg== -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: +js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== @@ -9349,7 +9269,7 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -json5@^1.0.1, json5@^1.0.2: +json5@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== @@ -9565,15 +9485,6 @@ loader-utils@3.3.1: resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.3.1.tgz#735b9a19fd63648ca7adbd31c2327dfe281304e5" integrity sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg== -loader-utils@^1.0.0: - version "1.4.2" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.2.tgz#29a957f3a63973883eb684f10ffd3d151fec01a3" - integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^1.0.1" - loader-utils@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" @@ -9685,13 +9596,6 @@ loglevel@^1.6.0: resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.9.2.tgz#c2e028d6c757720107df4e64508530db6621ba08" integrity sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg== -loose-envify@^1.1.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - loupe@^3.1.0, loupe@^3.1.1, loupe@^3.1.4: version "3.2.1" resolved "https://registry.yarnpkg.com/loupe/-/loupe-3.2.1.tgz#0095cf56dc5b7a9a7c08ff5b1a8796ec8ad17e76" @@ -11294,14 +11198,6 @@ raw-body@~2.5.3: iconv-lite "~0.4.24" unpipe "~1.0.0" -react-dom@^18.2.0: - version "18.3.1" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" - integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== - dependencies: - loose-envify "^1.1.0" - scheduler "^0.23.2" - react-is@^17.0.1: version "17.0.2" resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" @@ -11312,13 +11208,6 @@ react-is@^18.0.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== -react@^18.2.0: - version "18.3.1" - resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" - integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== - dependencies: - loose-envify "^1.1.0" - readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@~2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" @@ -11441,11 +11330,6 @@ regenerate@^1.4.2: resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== -regenerator-runtime@^0.14.1: - version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" - integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== - regex-parser@^2.2.11: version "2.3.0" resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.3.0.tgz#4bb61461b1a19b8b913f3960364bb57887f920ee" @@ -11802,13 +11686,6 @@ rxjs@7.8.2, rxjs@^7.8.1: dependencies: tslib "^2.1.0" -rxjs@^6.5.3: - version "6.6.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" - integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== - dependencies: - tslib "^1.9.0" - safaridriver@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/safaridriver/-/safaridriver-0.1.2.tgz#166571d5881c7d6f884900d92d51ee1309c05aa4" @@ -11863,13 +11740,6 @@ sax@^1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.4.3.tgz#fcebae3b756cdc8428321805f4b70f16ec0ab5db" integrity sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ== -scheduler@^0.23.2: - version "0.23.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" - integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== - dependencies: - loose-envify "^1.1.0" - schema-utils@^2.7.0: version "2.7.1" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" @@ -11921,19 +11791,12 @@ selfsigned@^2.1.1, selfsigned@^2.4.1: "@types/node-forge" "^1.3.0" node-forge "^1" -semver-dsl@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/semver-dsl/-/semver-dsl-1.0.1.tgz#d3678de5555e8a61f629eed025366ae5f27340a0" - integrity sha512-e8BOaTo007E3dMuQQTnPdalbKTABKNS7UxoBIDnwOqRa+QwMrCPjynB8zAlPF6xlqUfdLPPLIJ13hJNmhtq8Ng== - dependencies: - semver "^5.3.0" - semver@7.7.3, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.5.4, semver@^7.6.0, semver@^7.6.2, semver@^7.7.2: version "7.7.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.3.tgz#4b5f4143d007633a8dc671cd0a6ef9147b8bb946" integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== -semver@^5.3.0, semver@^5.6.0: +semver@^5.6.0: version "5.7.2" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== @@ -12285,11 +12148,6 @@ source-map@0.7.6, source-map@^0.7.4: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.6.tgz#a3658ab87e5b6429c8a1f3ba0083d4c61ca3ef02" integrity sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ== -source-map@^0.5.7: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== - spacetrim@0.11.59: version "0.11.59" resolved "https://registry.yarnpkg.com/spacetrim/-/spacetrim-0.11.59.tgz#b9cf378b5d1ab9ed729d4c7c3e4412ec00a187b9" @@ -12356,7 +12214,7 @@ split@^1.0.1: dependencies: through "2" -sprintf-js@^1.1.1, sprintf-js@^1.1.2: +sprintf-js@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== @@ -12737,7 +12595,7 @@ through2@^2.0.1: readable-stream "~2.3.6" xtend "~4.0.1" -through@2, through@X.X.X, through@^2.3.8: +through@2, through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== @@ -12760,11 +12618,6 @@ tinyglobby@0.2.15, tinyglobby@^0.2.12, tinyglobby@^0.2.15: fdir "^6.5.0" picomatch "^4.0.3" -"tinymce-4@npm:tinymce@^4": - version "4.9.11" - resolved "https://registry.yarnpkg.com/tinymce/-/tinymce-4.9.11.tgz#e3dae099722294c5b8d84ba7ef18dd126de6b582" - integrity sha512-nkSLsax+VY5DBRjMFnHFqPwTnlLEGHCco82FwJF2JNH6W+5/ClvNC1P4uhD5lXPDNiDykSHR0XJdEh7w/ICHzA== - "tinymce-5@npm:tinymce@^5": version "5.10.9" resolved "https://registry.yarnpkg.com/tinymce/-/tinymce-5.10.9.tgz#1dfacb3231c71a688d90ff44a0b3f2e91b3b9edf" @@ -12832,13 +12685,6 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -to-string-loader@^1.1.5: - version "1.2.0" - resolved "https://registry.yarnpkg.com/to-string-loader/-/to-string-loader-1.2.0.tgz#4364aa044b9aa876473f4d7a36ef7d216a276e9c" - integrity sha512-KsWUL8FccgBW9FPFm4vYoQbOOcO5m6hKOGYoXjbseD9/4Ft+ravXN5jolQ9kTKYcK4zPt1j+khx97GPGnVoi6A== - dependencies: - loader-utils "^1.0.0" - toidentifier@1.0.1, toidentifier@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" @@ -12940,7 +12786,7 @@ tslib@2.8.1, tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3. resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== -tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0: +tslib@^1.8.1: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== @@ -13520,7 +13366,7 @@ webpack-virtual-modules@^0.6.0: resolved "https://registry.yarnpkg.com/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz#057faa9065c8acf48f24cb57ac0e77739ab9a7e8" integrity sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ== -webpack@5, webpack@^5.95.0: +webpack@5: version "5.104.1" resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.104.1.tgz#94bd41eb5dbf06e93be165ba8be41b8260d4fb1a" integrity sha512-Qphch25abbMNtekmEGJmeRUhLDbe+QfiWTiqpKYkpCOWY64v9eyl+KRRLmqOFA2AvKPpc9DC6+u2n76tQLBoaA== @@ -13909,8 +13755,3 @@ zod@4.1.13: version "4.3.5" resolved "https://registry.yarnpkg.com/zod/-/zod-4.3.5.tgz#aeb269a6f9fc259b1212c348c7c5432aaa474d2a" integrity sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g== - -zone.js@~0.10.3: - version "0.10.3" - resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.10.3.tgz#3e5e4da03c607c9dcd92e37dd35687a14a140c16" - integrity sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg==