angular-three 2.0.0-beta.9 → 2.1.0

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 (160) hide show
  1. package/README.md +221 -4
  2. package/esm2022/index.mjs +13 -14
  3. package/esm2022/lib/canvas.mjs +130 -197
  4. package/esm2022/lib/directives/args.mjs +46 -20
  5. package/esm2022/lib/directives/selection.mjs +65 -0
  6. package/esm2022/lib/dom/events.mjs +2 -2
  7. package/esm2022/lib/events.mjs +33 -31
  8. package/esm2022/lib/html.mjs +40 -0
  9. package/esm2022/lib/instance.mjs +43 -36
  10. package/esm2022/lib/loader.mjs +72 -36
  11. package/esm2022/lib/loop.mjs +29 -26
  12. package/esm2022/lib/pipes/hexify.mjs +67 -0
  13. package/esm2022/lib/portal.mjs +173 -193
  14. package/esm2022/lib/renderer/catalogue.mjs +3 -3
  15. package/esm2022/lib/renderer/constants.mjs +6 -6
  16. package/esm2022/lib/renderer/index.mjs +356 -217
  17. package/esm2022/lib/renderer/state.mjs +54 -0
  18. package/esm2022/lib/renderer/utils.mjs +120 -64
  19. package/esm2022/lib/roots.mjs +86 -62
  20. package/esm2022/lib/routed-scene.mjs +11 -8
  21. package/esm2022/lib/store.mjs +164 -195
  22. package/esm2022/lib/three-types.mjs +1 -1
  23. package/esm2022/lib/types.mjs +1 -1
  24. package/esm2022/lib/utils/apply-props.mjs +31 -28
  25. package/esm2022/lib/utils/attach.mjs +26 -12
  26. package/esm2022/lib/utils/before-render.mjs +12 -0
  27. package/esm2022/lib/utils/is.mjs +6 -5
  28. package/esm2022/lib/utils/make.mjs +19 -17
  29. package/esm2022/lib/utils/non-nullish.mjs +7 -0
  30. package/esm2022/lib/utils/object-events.mjs +91 -0
  31. package/esm2022/lib/utils/parameters.mjs +70 -0
  32. package/esm2022/lib/utils/resolve-ref.mjs +8 -0
  33. package/esm2022/lib/utils/signal-store.mjs +59 -60
  34. package/esm2022/lib/utils/update.mjs +8 -4
  35. package/esm2022/nativescript/angular-three-nativescript.mjs +5 -0
  36. package/esm2022/nativescript/index.mjs +2 -0
  37. package/esm2022/nativescript/lib/canvas.mjs +127 -0
  38. package/esm2022/testing/angular-three-testing.mjs +5 -0
  39. package/esm2022/testing/index.mjs +3 -0
  40. package/esm2022/testing/lib/test-bed.mjs +130 -0
  41. package/esm2022/testing/lib/test-canvas.mjs +45 -0
  42. package/esm2022/testing/lib/utils/mock-canvas.mjs +37 -0
  43. package/esm2022/testing/lib/utils/web-gl-rendering-context.mjs +752 -0
  44. package/fesm2022/angular-three-nativescript.mjs +134 -0
  45. package/fesm2022/angular-three-nativescript.mjs.map +1 -0
  46. package/fesm2022/angular-three-testing.mjs +966 -0
  47. package/fesm2022/angular-three-testing.mjs.map +1 -0
  48. package/fesm2022/angular-three.mjs +2271 -2306
  49. package/fesm2022/angular-three.mjs.map +1 -1
  50. package/index.d.ts +14 -14
  51. package/lib/canvas.d.ts +357 -96
  52. package/lib/directives/args.d.ts +14 -7
  53. package/lib/directives/selection.d.ts +17 -0
  54. package/lib/dom/events.d.ts +2 -3
  55. package/lib/events.d.ts +4 -80
  56. package/lib/html.d.ts +17 -0
  57. package/lib/instance.d.ts +3 -35
  58. package/lib/loader.d.ts +19 -7
  59. package/lib/loop.d.ts +11 -59
  60. package/lib/pipes/hexify.d.ts +20 -0
  61. package/lib/portal.d.ts +54 -48
  62. package/lib/renderer/catalogue.d.ts +7 -3
  63. package/lib/renderer/constants.d.ts +5 -5
  64. package/lib/renderer/index.d.ts +63 -4
  65. package/lib/renderer/state.d.ts +25 -0
  66. package/lib/renderer/utils.d.ts +10 -27
  67. package/lib/roots.d.ts +9 -7
  68. package/lib/store.d.ts +13 -141
  69. package/lib/three-types.d.ts +528 -147
  70. package/lib/types.d.ts +291 -0
  71. package/lib/utils/apply-props.d.ts +2 -3
  72. package/lib/utils/attach.d.ts +4 -6
  73. package/lib/{before-render.d.ts → utils/before-render.d.ts} +1 -1
  74. package/lib/utils/is.d.ts +13 -14
  75. package/lib/utils/make.d.ts +7 -13
  76. package/lib/utils/non-nullish.d.ts +4 -0
  77. package/lib/utils/object-events.d.ts +32 -0
  78. package/lib/utils/parameters.d.ts +20 -0
  79. package/lib/utils/resolve-ref.d.ts +2 -0
  80. package/lib/utils/signal-store.d.ts +13 -4
  81. package/lib/utils/update.d.ts +1 -1
  82. package/metadata.json +1 -1
  83. package/nativescript/README.md +5 -0
  84. package/nativescript/index.d.ts +1 -0
  85. package/nativescript/lib/canvas.d.ts +359 -0
  86. package/nativescript/package.json +3 -0
  87. package/package.json +65 -14
  88. package/plugin/generators.json +8 -30
  89. package/plugin/package.json +3 -3
  90. package/plugin/src/generators/add-soba/compat.js.map +1 -0
  91. package/plugin/src/generators/add-soba/generator.d.ts +3 -0
  92. package/plugin/src/generators/add-soba/generator.js +77 -0
  93. package/plugin/src/generators/add-soba/generator.js.map +1 -0
  94. package/plugin/src/generators/add-soba/schema.json +4 -0
  95. package/plugin/src/generators/init/compat.d.ts +1 -1
  96. package/plugin/src/generators/init/files/experience/experience.component.ts__tmpl__ +29 -0
  97. package/plugin/src/generators/init/generator.d.ts +5 -1
  98. package/plugin/src/generators/init/generator.js +131 -25
  99. package/plugin/src/generators/init/generator.js.map +1 -1
  100. package/plugin/src/generators/init/schema.json +9 -2
  101. package/plugin/src/generators/utils.d.ts +2 -0
  102. package/plugin/src/generators/utils.js +35 -0
  103. package/plugin/src/generators/utils.js.map +1 -0
  104. package/plugin/src/generators/version.d.ts +17 -0
  105. package/plugin/src/generators/version.js +21 -0
  106. package/plugin/src/generators/version.js.map +1 -0
  107. package/plugin/src/index.d.ts +0 -3
  108. package/plugin/src/index.js +0 -9
  109. package/plugin/src/index.js.map +1 -1
  110. package/testing/README.md +3 -0
  111. package/testing/index.d.ts +2 -0
  112. package/testing/lib/test-bed.d.ts +38 -0
  113. package/testing/lib/test-canvas.d.ts +11 -0
  114. package/testing/lib/utils/mock-canvas.d.ts +5 -0
  115. package/testing/lib/utils/web-gl-rendering-context.d.ts +16 -0
  116. package/testing/package.json +3 -0
  117. package/web-types.json +1 -1
  118. package/esm2022/lib/before-render.mjs +0 -13
  119. package/esm2022/lib/directives/common.mjs +0 -41
  120. package/esm2022/lib/directives/key.mjs +0 -29
  121. package/esm2022/lib/directives/parent.mjs +0 -35
  122. package/esm2022/lib/directives/repeat.mjs +0 -17
  123. package/esm2022/lib/ref.mjs +0 -48
  124. package/esm2022/lib/renderer/store.mjs +0 -405
  125. package/esm2022/lib/utils/assert-injection-context.mjs +0 -14
  126. package/esm2022/lib/utils/create-injection-token.mjs +0 -47
  127. package/esm2022/lib/utils/safe-detect-changes.mjs +0 -17
  128. package/lib/directives/common.d.ts +0 -15
  129. package/lib/directives/key.d.ts +0 -10
  130. package/lib/directives/parent.d.ts +0 -11
  131. package/lib/directives/repeat.d.ts +0 -7
  132. package/lib/ref.d.ts +0 -8
  133. package/lib/renderer/store.d.ts +0 -67
  134. package/lib/utils/assert-injection-context.d.ts +0 -2
  135. package/lib/utils/create-injection-token.d.ts +0 -27
  136. package/lib/utils/safe-detect-changes.d.ts +0 -2
  137. package/plugin/src/generators/init-cannon/compat.js.map +0 -1
  138. package/plugin/src/generators/init-cannon/generator.d.ts +0 -2
  139. package/plugin/src/generators/init-cannon/generator.js +0 -22
  140. package/plugin/src/generators/init-cannon/generator.js.map +0 -1
  141. package/plugin/src/generators/init-cannon/schema.json +0 -6
  142. package/plugin/src/generators/init-postprocessing/compat.d.ts +0 -2
  143. package/plugin/src/generators/init-postprocessing/compat.js +0 -6
  144. package/plugin/src/generators/init-postprocessing/compat.js.map +0 -1
  145. package/plugin/src/generators/init-postprocessing/generator.d.ts +0 -2
  146. package/plugin/src/generators/init-postprocessing/generator.js +0 -20
  147. package/plugin/src/generators/init-postprocessing/generator.js.map +0 -1
  148. package/plugin/src/generators/init-postprocessing/schema.json +0 -6
  149. package/plugin/src/generators/init-soba/compat.d.ts +0 -2
  150. package/plugin/src/generators/init-soba/compat.js +0 -6
  151. package/plugin/src/generators/init-soba/compat.js.map +0 -1
  152. package/plugin/src/generators/init-soba/generator.d.ts +0 -2
  153. package/plugin/src/generators/init-soba/generator.js +0 -24
  154. package/plugin/src/generators/init-soba/generator.js.map +0 -1
  155. package/plugin/src/generators/init-soba/schema.json +0 -6
  156. package/plugin/src/generators/versions.d.ts +0 -12
  157. package/plugin/src/generators/versions.js +0 -16
  158. package/plugin/src/generators/versions.js.map +0 -1
  159. /package/plugin/src/generators/{init-cannon → add-soba}/compat.d.ts +0 -0
  160. /package/plugin/src/generators/{init-cannon → add-soba}/compat.js +0 -0
@@ -0,0 +1,127 @@
1
+ import '@nativescript/canvas-three';
2
+ import { DOCUMENT } from '@angular/common';
3
+ import { booleanAttribute, ChangeDetectionStrategy, Component, createEnvironmentInjector, DestroyRef, EnvironmentInjector, inject, Injector, input, NgZone, NO_ERRORS_SCHEMA, output, untracked, viewChild, ViewContainerRef, } from '@angular/core';
4
+ import { registerElement } from '@nativescript/angular';
5
+ import { Canvas } from '@nativescript/canvas';
6
+ import { injectCanvasRootInitializer, injectStore, makeDpr, NgtRoutedScene, provideNgtRenderer, provideStore, } from 'angular-three';
7
+ import { WebGLRenderer } from 'three';
8
+ import * as i0 from "@angular/core";
9
+ registerElement('Canvas', () => Canvas);
10
+ export class NgtCanvasNative {
11
+ constructor() {
12
+ this.sceneGraph = input.required({
13
+ transform: (value) => {
14
+ if (value === 'routed')
15
+ return NgtRoutedScene;
16
+ return value;
17
+ },
18
+ });
19
+ this.gl = input();
20
+ this.size = input();
21
+ this.shadows = input(false, {
22
+ transform: (value) => {
23
+ if (value === '')
24
+ return booleanAttribute(value);
25
+ return value;
26
+ },
27
+ });
28
+ this.legacy = input(false, { transform: booleanAttribute });
29
+ this.linear = input(false, { transform: booleanAttribute });
30
+ this.flat = input(false, { transform: booleanAttribute });
31
+ this.orthographic = input(false, { transform: booleanAttribute });
32
+ this.frameloop = input('always');
33
+ this.performance = input();
34
+ this.dpr = input([1, 2]);
35
+ this.raycaster = input();
36
+ this.scene = input();
37
+ this.camera = input();
38
+ this.lookAt = input();
39
+ this.created = output();
40
+ this.store = injectStore();
41
+ this.initRoot = injectCanvasRootInitializer();
42
+ this.injector = inject(Injector);
43
+ this.environmentInjector = inject(EnvironmentInjector);
44
+ this.destroyRef = inject(DestroyRef);
45
+ this.zone = inject(NgZone);
46
+ this.canvasViewContainerRef = viewChild.required('canvas', { read: ViewContainerRef });
47
+ this.destroyRef.onDestroy(() => {
48
+ this.glRef?.destroy();
49
+ this.glEnvironmentInjector?.destroy();
50
+ this.configurator?.destroy();
51
+ });
52
+ }
53
+ onReady(event) {
54
+ const canvas = event.object;
55
+ const dpr = makeDpr(untracked(this.dpr), window);
56
+ const canvasWidth = canvas.clientWidth * dpr;
57
+ const canvasHeight = canvas.clientHeight * dpr;
58
+ Object.assign(canvas, { width: canvasWidth, height: canvasHeight });
59
+ const context = canvas.getContext('webgl2');
60
+ const gl = new WebGLRenderer({
61
+ canvas,
62
+ context: context,
63
+ powerPreference: 'high-performance',
64
+ antialias: true,
65
+ alpha: true,
66
+ ...untracked(this.gl),
67
+ });
68
+ gl.setSize(canvasWidth, canvasHeight);
69
+ this.zone.runOutsideAngular(() => {
70
+ this.configurator = this.initRoot(canvas);
71
+ this.configurator.configure({
72
+ gl,
73
+ size: { width: canvasWidth, height: canvasHeight, top: 0, left: 0 },
74
+ shadows: untracked(this.shadows),
75
+ legacy: untracked(this.legacy),
76
+ linear: untracked(this.linear),
77
+ flat: untracked(this.flat),
78
+ orthographic: untracked(this.orthographic),
79
+ frameloop: untracked(this.frameloop),
80
+ performance: untracked(this.performance),
81
+ dpr: untracked(this.dpr),
82
+ raycaster: untracked(this.raycaster),
83
+ scene: untracked(this.scene),
84
+ camera: untracked(this.camera),
85
+ lookAt: untracked(this.lookAt),
86
+ });
87
+ untracked(this.noZoneRender.bind(this));
88
+ });
89
+ }
90
+ noZoneRender() {
91
+ // NOTE: destroy previous instances if existed
92
+ this.glEnvironmentInjector?.destroy();
93
+ this.glRef?.destroy();
94
+ // NOTE: Flag the canvas active, rendering will now begin
95
+ this.store.update((state) => ({ internal: { ...state.internal, active: true } }));
96
+ // emit created event if observed
97
+ this.created.emit(this.store.snapshot);
98
+ this.glEnvironmentInjector = createEnvironmentInjector([{ provide: DOCUMENT, useValue: document }, provideNgtRenderer(this.store)], this.environmentInjector);
99
+ this.glRef = untracked(this.canvasViewContainerRef).createComponent(untracked(this.sceneGraph), {
100
+ environmentInjector: this.glEnvironmentInjector,
101
+ injector: this.injector,
102
+ });
103
+ this.glRef.changeDetectorRef.detectChanges();
104
+ }
105
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtCanvasNative, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
106
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.2.0", type: NgtCanvasNative, isStandalone: true, selector: "NgtCanvas", inputs: { sceneGraph: { classPropertyName: "sceneGraph", publicName: "sceneGraph", isSignal: true, isRequired: true, transformFunction: null }, gl: { classPropertyName: "gl", publicName: "gl", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, shadows: { classPropertyName: "shadows", publicName: "shadows", isSignal: true, isRequired: false, transformFunction: null }, legacy: { classPropertyName: "legacy", publicName: "legacy", isSignal: true, isRequired: false, transformFunction: null }, linear: { classPropertyName: "linear", publicName: "linear", isSignal: true, isRequired: false, transformFunction: null }, flat: { classPropertyName: "flat", publicName: "flat", isSignal: true, isRequired: false, transformFunction: null }, orthographic: { classPropertyName: "orthographic", publicName: "orthographic", isSignal: true, isRequired: false, transformFunction: null }, frameloop: { classPropertyName: "frameloop", publicName: "frameloop", isSignal: true, isRequired: false, transformFunction: null }, performance: { classPropertyName: "performance", publicName: "performance", isSignal: true, isRequired: false, transformFunction: null }, dpr: { classPropertyName: "dpr", publicName: "dpr", isSignal: true, isRequired: false, transformFunction: null }, raycaster: { classPropertyName: "raycaster", publicName: "raycaster", isSignal: true, isRequired: false, transformFunction: null }, scene: { classPropertyName: "scene", publicName: "scene", isSignal: true, isRequired: false, transformFunction: null }, camera: { classPropertyName: "camera", publicName: "camera", isSignal: true, isRequired: false, transformFunction: null }, lookAt: { classPropertyName: "lookAt", publicName: "lookAt", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { created: "created" }, providers: [{ provide: DOCUMENT, useValue: document }, provideStore()], viewQueries: [{ propertyName: "canvasViewContainerRef", first: true, predicate: ["canvas"], descendants: true, read: ViewContainerRef, isSignal: true }], ngImport: i0, template: `
107
+ <GridLayout>
108
+ <Canvas #canvas style="width: 100%; height: auto" (ready)="onReady($event)"></Canvas>
109
+ </GridLayout>
110
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
111
+ }
112
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtCanvasNative, decorators: [{
113
+ type: Component,
114
+ args: [{
115
+ selector: 'NgtCanvas',
116
+ standalone: true,
117
+ template: `
118
+ <GridLayout>
119
+ <Canvas #canvas style="width: 100%; height: auto" (ready)="onReady($event)"></Canvas>
120
+ </GridLayout>
121
+ `,
122
+ providers: [{ provide: DOCUMENT, useValue: document }, provideStore()],
123
+ schemas: [NO_ERRORS_SCHEMA],
124
+ changeDetection: ChangeDetectionStrategy.OnPush,
125
+ }]
126
+ }], ctorParameters: () => [] });
127
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FudmFzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL25hdGl2ZXNjcmlwdC9zcmMvbGliL2NhbnZhcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLDRCQUE0QixDQUFDO0FBRXBDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQ04sZ0JBQWdCLEVBQ2hCLHVCQUF1QixFQUN2QixTQUFTLEVBRVQseUJBQXlCLEVBQ3pCLFVBQVUsRUFDVixtQkFBbUIsRUFDbkIsTUFBTSxFQUNOLFFBQVEsRUFDUixLQUFLLEVBQ0wsTUFBTSxFQUNOLGdCQUFnQixFQUNoQixNQUFNLEVBRU4sU0FBUyxFQUNULFNBQVMsRUFDVCxnQkFBZ0IsR0FDaEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QyxPQUFPLEVBQ04sMkJBQTJCLEVBQzNCLFdBQVcsRUFDWCxPQUFPLEVBTVAsY0FBYyxFQUdkLGtCQUFrQixFQUNsQixZQUFZLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUE2QixhQUFhLEVBQUUsTUFBTSxPQUFPLENBQUM7O0FBRWpFLGVBQWUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7QUFjeEMsTUFBTSxPQUFPLGVBQWU7SUF5QzNCO1FBeENBLGVBQVUsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFrQztZQUM1RCxTQUFTLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDcEIsSUFBSSxLQUFLLEtBQUssUUFBUTtvQkFBRSxPQUFPLGNBQWMsQ0FBQztnQkFDOUMsT0FBTyxLQUFLLENBQUM7WUFDZCxDQUFDO1NBQ0QsQ0FBQyxDQUFDO1FBQ0gsT0FBRSxHQUFH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Q3ZCLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDOUMsQ0FBQzs4R0E5R1csZUFBZTtrR0FBZixlQUFlLHU3REFKaEIsQ0FBQyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxFQUFFLFlBQVksRUFBRSxDQUFDLHVIQXVDQSxnQkFBZ0IsNkNBNUM1RTs7OztFQUlUOzsyRkFLVyxlQUFlO2tCQVozQixTQUFTO21CQUFDO29CQUNWLFFBQVEsRUFBRSxXQUFXO29CQUNyQixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFOzs7O0VBSVQ7b0JBQ0QsU0FBUyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRSxZQUFZLEVBQUUsQ0FBQztvQkFDdEUsT0FBTyxFQUFFLENBQUMsZ0JBQWdCLENBQUM7b0JBQzNCLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2lCQUMvQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnQG5hdGl2ZXNjcmlwdC9jYW52YXMtdGhyZWUnO1xuXG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuXHRib29sZWFuQXR0cmlidXRlLFxuXHRDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcblx0Q29tcG9uZW50LFxuXHRDb21wb25lbnRSZWYsXG5cdGNyZWF0ZUVudmlyb25tZW50SW5qZWN0b3IsXG5cdERlc3Ryb3lSZWYsXG5cdEVudmlyb25tZW50SW5qZWN0b3IsXG5cdGluamVjdCxcblx0SW5qZWN0b3IsXG5cdGlucHV0LFxuXHROZ1pvbmUsXG5cdE5PX0VSUk9SU19TQ0hFTUEsXG5cdG91dHB1dCxcblx0VHlwZSxcblx0dW50cmFja2VkLFxuXHR2aWV3Q2hpbGQsXG5cdFZpZXdDb250YWluZXJSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgcmVnaXN0ZXJFbGVtZW50IH0gZnJvbSAnQG5hdGl2ZXNjcmlwdC9hbmd1bGFyJztcbmltcG9ydCB7IENhbnZhcyB9IGZyb20gJ0BuYXRpdmVzY3JpcHQvY2FudmFzJztcbmltcG9ydCB7XG5cdGluamVjdENhbnZhc1Jvb3RJbml0aWFsaXplcixcblx0aW5qZWN0U3RvcmUsXG5cdG1ha2VEcHIsXG5cdE5ndENhbnZhc0NvbmZpZ3VyYXRvcixcblx0Tmd0Q2FudmFzT3B0aW9ucyxcblx0Tmd0RHByLFxuXHROZ3RHTE9wdGlvbnMsXG5cdE5ndFBlcmZvcm1hbmNlLFxuXHROZ3RSb3V0ZWRTY2VuZSxcblx0Tmd0U2l6ZSxcblx0Tmd0U3RhdGUsXG5cdHByb3ZpZGVOZ3RSZW5kZXJlcixcblx0cHJvdmlkZVN0b3JlLFxufSBmcm9tICdhbmd1bGFyLXRocmVlJztcbmltcG9ydCB7IFJheWNhc3RlciwgU2NlbmUsIFZlY3RvcjMsIFdlYkdMUmVuZGVyZXIgfSBmcm9tICd0aHJlZSc7XG5cbnJlZ2lzdGVyRWxlbWVudCgnQ2FudmFzJywgKCkgPT4gQ2FudmFzKTtcblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnTmd0Q2FudmFzJyxcblx0c3RhbmRhbG9uZTogdHJ1ZSxcblx0dGVtcGxhdGU6IGBcblx0XHQ8R3JpZExheW91dD5cblx0XHRcdDxDYW52YXMgI2NhbnZhcyBzdHlsZT1cIndpZHRoOiAxMDAlOyBoZWlnaHQ6IGF1dG9cIiAocmVhZHkpPVwib25SZWFkeSgkZXZlbnQpXCI+PC9DYW52YXM+XG5cdFx0PC9HcmlkTGF5b3V0PlxuXHRgLFxuXHRwcm92aWRlcnM6IFt7IHByb3ZpZGU6IERPQ1VNRU5ULCB1c2VWYWx1ZTogZG9jdW1lbnQgfSwgcHJvdmlkZVN0b3JlKCldLFxuXHRzY2hlbWFzOiBbTk9fRVJST1JTX1NDSEVNQV0sXG5cdGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3RDYW52YXNOYXRpdmUge1xuXHRzY2VuZUdyYXBoID0gaW5wdXQucmVxdWlyZWQ8VHlwZTxhbnk+LCBUeXBlPGFueT4gfCAncm91dGVkJz4oe1xuXHRcdHRyYW5zZm9ybTogKHZhbHVlKSA9PiB7XG5cdFx0XHRpZiAodmFsdWUgPT09ICdyb3V0ZWQnKSByZXR1cm4gTmd0Um91dGVkU2NlbmU7XG5cdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0fSxcblx0fSk7XG5cdGdsID0gaW5wdXQ8Tmd0R0xPcHRpb25zPigpO1xuXHRzaXplID0gaW5wdXQ8Tmd0U2l6ZT4oKTtcblx0c2hhZG93cyA9IGlucHV0KGZhbHNlLCB7XG5cdFx0dHJhbnNmb3JtOiAodmFsdWUpID0+IHtcblx0XHRcdGlmICh2YWx1ZSA9PT0gJycpIHJldHVybiBib29sZWFuQXR0cmlidXRlKHZhbHVlKTtcblx0XHRcdHJldHVybiB2YWx1ZSBhcyBOb25OdWxsYWJsZTxOZ3RDYW52YXNPcHRpb25zWydzaGFkb3dzJ10+O1xuXHRcdH0sXG5cdH0pO1xuXHRsZWdhY3kgPSBpbnB1dChmYWxzZSwgeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSk7XG5cdGxpbmVhciA9IGlucHV0KGZhbHNlLCB7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KTtcblx0ZmxhdCA9IGlucHV0KGZhbHNlLCB7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KTtcblx0b3J0aG9ncmFwaGljID0gaW5wdXQoZmFsc2UsIHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pO1xuXHRmcmFtZWxvb3AgPSBpbnB1dDxOb25OdWxsYWJsZTxOZ3RDYW52YXNPcHRpb25zWydmcmFtZWxvb3AnXT4+KCdhbHdheXMnKTtcblx0cGVyZm9ybWFuY2UgPSBpbnB1dDxQYXJ0aWFsPE9taXQ8Tmd0UGVyZm9ybWFuY2UsICdyZWdyZXNzJz4+PigpO1xuXHRkcHIgPSBpbnB1dDxOZ3REcHI+KFsxLCAyXSk7XG5cdHJheWNhc3RlciA9IGlucHV0PFBhcnRpYWw8UmF5Y2FzdGVyPj4oKTtcblx0c2NlbmUgPSBpbnB1dDxTY2VuZSB8IFBhcnRpYWw8U2NlbmU+PigpO1xuXHRjYW1lcmEgPSBpbnB1dDxOb25OdWxsYWJsZTxOZ3RDYW52YXNPcHRpb25zWydjYW1lcmEnXT4+KCk7XG5cdGxvb2tBdCA9IGlucHV0PFZlY3RvcjMgfCBQYXJhbWV0ZXJzPFZlY3RvcjNbJ3NldCddPj4oKTtcblx0Y3JlYXRlZCA9IG91dHB1dDxOZ3RTdGF0ZT4oKTtcblxuXHRwcml2YXRlIHN0b3JlID0gaW5qZWN0U3RvcmUoKTtcblx0cHJpdmF0ZSBpbml0Um9vdCA9IGluamVjdENhbnZhc1Jvb3RJbml0aWFsaXplcigpO1xuXHRwcml2YXRlIGluamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcblx0cHJpdmF0ZSBlbnZpcm9ubWVudEluamVjdG9yID0gaW5qZWN0KEVudmlyb25tZW50SW5qZWN0b3IpO1xuXHRwcml2YXRlIGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cdHByaXZhdGUgem9uZSA9IGluamVjdChOZ1pvbmUpO1xuXG5cdHByaXZhdGUgY2FudmFzVmlld0NvbnRhaW5lclJlZiA9IHZpZXdDaGlsZC5yZXF1aXJlZCgnY2FudmFzJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pO1xuXG5cdHByaXZhdGUgY29uZmlndXJhdG9yPzogTmd0Q2FudmFzQ29uZmlndXJhdG9yO1xuXHRwcml2YXRlIGdsRW52aXJvbm1lbnRJbmplY3Rvcj86IEVudmlyb25tZW50SW5qZWN0b3I7XG5cdHByaXZhdGUgZ2xSZWY/OiBDb21wb25lbnRSZWY8YW55PjtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHR0aGlzLmRlc3Ryb3lSZWYub25EZXN0cm95KCgpID0+IHtcblx0XHRcdHRoaXMuZ2xSZWY/LmRlc3Ryb3koKTtcblx0XHRcdHRoaXMuZ2xFbnZpcm9ubWVudEluamVjdG9yPy5kZXN0cm95KCk7XG5cdFx0XHR0aGlzLmNvbmZpZ3VyYXRvcj8uZGVzdHJveSgpO1xuXHRcdH0pO1xuXHR9XG5cblx0b25SZWFkeShldmVudDogYW55KSB7XG5cdFx0Y29uc3QgY2FudmFzID0gZXZlbnQub2JqZWN0O1xuXHRcdGNvbnN0IGRwciA9IG1ha2VEcHIodW50cmFja2VkKHRoaXMuZHByKSwgd2luZG93KTtcblx0XHRjb25zdCBjYW52YXNXaWR0aCA9IGNhbnZhcy5jbGllbnRXaWR0aCAqIGRwcjtcblx0XHRjb25zdCBjYW52YXNIZWlnaHQgPSBjYW52YXMuY2xpZW50SGVpZ2h0ICogZHByO1xuXHRcdE9iamVjdC5hc3NpZ24oY2FudmFzLCB7IHdpZHRoOiBjYW52YXNXaWR0aCwgaGVpZ2h0OiBjYW52YXNIZWlnaHQgfSk7XG5cblx0XHRjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoJ3dlYmdsMicpO1xuXHRcdGNvbnN0IGdsID0gbmV3IFdlYkdMUmVuZGVyZXIoe1xuXHRcdFx0Y2FudmFzLFxuXHRcdFx0Y29udGV4dDogY29udGV4dCBhcyB1bmtub3duIGFzIFdlYkdMUmVuZGVyaW5nQ29udGV4dCxcblx0XHRcdHBvd2VyUHJlZmVyZW5jZTogJ2hpZ2gtcGVyZm9ybWFuY2UnLFxuXHRcdFx0YW50aWFsaWFzOiB0cnVlLFxuXHRcdFx0YWxwaGE6IHRydWUsXG5cdFx0XHQuLi51bnRyYWNrZWQodGhpcy5nbCksXG5cdFx0fSk7XG5cdFx0Z2wuc2V0U2l6ZShjYW52YXNXaWR0aCwgY2FudmFzSGVpZ2h0KTtcblxuXHRcdHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG5cdFx0XHR0aGlzLmNvbmZpZ3VyYXRvciA9IHRoaXMuaW5pdFJvb3QoY2FudmFzKTtcblx0XHRcdHRoaXMuY29uZmlndXJhdG9yLmNvbmZpZ3VyZSh7XG5cdFx0XHRcdGdsLFxuXHRcdFx0XHRzaXplOiB7IHdpZHRoOiBjYW52YXNXaWR0aCwgaGVpZ2h0OiBjYW52YXNIZWlnaHQsIHRvcDogMCwgbGVmdDogMCB9LFxuXHRcdFx0XHRzaGFkb3dzOiB1bnRyYWNrZWQodGhpcy5zaGFkb3dzKSxcblx0XHRcdFx0bGVnYWN5OiB1bnRyYWNrZWQodGhpcy5sZWdhY3kpLFxuXHRcdFx0XHRsaW5lYXI6IHVudHJhY2tlZCh0aGlzLmxpbmVhciksXG5cdFx0XHRcdGZsYXQ6IHVudHJhY2tlZCh0aGlzLmZsYXQpLFxuXHRcdFx0XHRvcnRob2dyYXBoaWM6IHVudHJhY2tlZCh0aGlzLm9ydGhvZ3JhcGhpYyksXG5cdFx0XHRcdGZyYW1lbG9vcDogdW50cmFja2VkKHRoaXMuZnJhbWVsb29wKSxcblx0XHRcdFx0cGVyZm9ybWFuY2U6IHVudHJhY2tlZCh0aGlzLnBlcmZvcm1hbmNlKSxcblx0XHRcdFx0ZHByOiB1bnRyYWNrZWQodGhpcy5kcHIpLFxuXHRcdFx0XHRyYXljYXN0ZXI6IHVudHJhY2tlZCh0aGlzLnJheWNhc3RlciksXG5cdFx0XHRcdHNjZW5lOiB1bnRyYWNrZWQodGhpcy5zY2VuZSksXG5cdFx0XHRcdGNhbWVyYTogdW50cmFja2VkKHRoaXMuY2FtZXJhKSxcblx0XHRcdFx0bG9va0F0OiB1bnRyYWNrZWQodGhpcy5sb29rQXQpLFxuXHRcdFx0fSk7XG5cdFx0XHR1bnRyYWNrZWQodGhpcy5ub1pvbmVSZW5kZXIuYmluZCh0aGlzKSk7XG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIG5vWm9uZVJlbmRlcigpIHtcblx0XHQvLyBOT1RFOiBkZXN0cm95IHByZXZpb3VzIGluc3RhbmNlcyBpZiBleGlzdGVkXG5cdFx0dGhpcy5nbEVudmlyb25tZW50SW5qZWN0b3I/LmRlc3Ryb3koKTtcblx0XHR0aGlzLmdsUmVmPy5kZXN0cm95KCk7XG5cblx0XHQvLyBOT1RFOiBGbGFnIHRoZSBjYW52YXMgYWN0aXZlLCByZW5kZXJpbmcgd2lsbCBub3cgYmVnaW5cblx0XHR0aGlzLnN0b3JlLnVwZGF0ZSgoc3RhdGUpID0+ICh7IGludGVybmFsOiB7IC4uLnN0YXRlLmludGVybmFsLCBhY3RpdmU6IHRydWUgfSB9KSk7XG5cblx0XHQvLyBlbWl0IGNyZWF0ZWQgZXZlbnQgaWYgb2JzZXJ2ZWRcblx0XHR0aGlzLmNyZWF0ZWQuZW1pdCh0aGlzLnN0b3JlLnNuYXBzaG90KTtcblxuXHRcdHRoaXMuZ2xFbnZpcm9ubWVudEluamVjdG9yID0gY3JlYXRlRW52aXJvbm1lbnRJbmplY3Rvcihcblx0XHRcdFt7IHByb3ZpZGU6IERPQ1VNRU5ULCB1c2VWYWx1ZTogZG9jdW1lbnQgfSwgcHJvdmlkZU5ndFJlbmRlcmVyKHRoaXMuc3RvcmUpXSxcblx0XHRcdHRoaXMuZW52aXJvbm1lbnRJbmplY3Rvcixcblx0XHQpO1xuXHRcdHRoaXMuZ2xSZWYgPSB1bnRyYWNrZWQodGhpcy5jYW52YXNWaWV3Q29udGFpbmVyUmVmKS5jcmVhdGVDb21wb25lbnQodW50cmFja2VkKHRoaXMuc2NlbmVHcmFwaCksIHtcblx0XHRcdGVudmlyb25tZW50SW5qZWN0b3I6IHRoaXMuZ2xFbnZpcm9ubWVudEluamVjdG9yLFxuXHRcdFx0aW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IsXG5cdFx0fSk7XG5cblx0XHR0aGlzLmdsUmVmLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcblx0fVxufVxuIl19
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci10aHJlZS10ZXN0aW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3Rlc3Rpbmcvc3JjL2FuZ3VsYXItdGhyZWUtdGVzdGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ==
@@ -0,0 +1,3 @@
1
+ export * from './lib/test-bed';
2
+ export * from './lib/test-canvas';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2NvcmUvdGVzdGluZy9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLG1CQUFtQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9saWIvdGVzdC1iZWQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdGVzdC1jYW52YXMnO1xuIl19
@@ -0,0 +1,130 @@
1
+ import { CUSTOM_ELEMENTS_SCHEMA, ENVIRONMENT_INITIALIZER } from '@angular/core';
2
+ import { TestBed } from '@angular/core/testing';
3
+ import { getLocalState, injectCanvasRootInitializer, NGT_STORE, provideStore, } from 'angular-three';
4
+ import { NgtTestCanvas } from './test-canvas';
5
+ import { createMockCanvas } from './utils/mock-canvas';
6
+ export class NgtTestBed {
7
+ static create(sceneGraph, { mockCanvasOptions = {}, canvasConfiguration = {}, errorOnUnknownElements, providers, declarations, imports, teardown, deferBlockBehavior, } = {}) {
8
+ const mockedCanvas = createMockCanvas(mockCanvasOptions);
9
+ const fixture = TestBed.configureTestingModule({
10
+ providers: [
11
+ provideStore(),
12
+ {
13
+ provide: ENVIRONMENT_INITIALIZER,
14
+ useFactory: () => {
15
+ const initRoot = injectCanvasRootInitializer();
16
+ return () => {
17
+ const configurator = initRoot(mockedCanvas);
18
+ configurator.configure({
19
+ frameloop: 'never',
20
+ size: {
21
+ width: mockCanvasOptions.width ?? 1280,
22
+ height: mockCanvasOptions.height ?? 800,
23
+ top: 0,
24
+ left: 0,
25
+ },
26
+ ...canvasConfiguration,
27
+ events: undefined,
28
+ });
29
+ };
30
+ },
31
+ multi: true,
32
+ },
33
+ ...(providers ?? []),
34
+ ],
35
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
36
+ errorOnUnknownElements: errorOnUnknownElements ?? false,
37
+ declarations,
38
+ imports,
39
+ teardown,
40
+ deferBlockBehavior,
41
+ }).createComponent(NgtTestCanvas);
42
+ fixture.componentRef.setInput('sceneGraph', sceneGraph);
43
+ fixture.detectChanges();
44
+ const store = TestBed.inject(NGT_STORE);
45
+ TestBed.flushEffects();
46
+ return {
47
+ store,
48
+ fixture,
49
+ scene: store.snapshot.scene,
50
+ sceneInstanceNode: getLocalState(store.snapshot.scene),
51
+ canvas: mockedCanvas,
52
+ destroy: fixture.componentInstance.destroy.bind(fixture.componentInstance),
53
+ fireEvent: this.createEventFirer(store, fixture),
54
+ advance: this.createAdvance(store),
55
+ toGraph: this.createToGraph(store),
56
+ };
57
+ }
58
+ static createToGraph(store) {
59
+ function graphify(type, name, children) {
60
+ return { type, name, children };
61
+ }
62
+ function toGraph(node) {
63
+ return node.children.map((child) => graphify(child.type, child.name || '', toGraph(child)));
64
+ }
65
+ return () => {
66
+ const state = store.snapshot;
67
+ return toGraph(state.scene);
68
+ };
69
+ }
70
+ static createAdvance(store) {
71
+ return async (frames, delta = 1) => {
72
+ const state = store.snapshot;
73
+ const subscribers = state.internal.subscribers;
74
+ const promises = [];
75
+ for (const subscriber of subscribers) {
76
+ for (let i = 0; i < frames; i++) {
77
+ if (Array.isArray(delta)) {
78
+ promises.push(new Promise((res) => {
79
+ subscriber.callback({ ...state, delta: delta[i] || delta[-1] });
80
+ res();
81
+ }));
82
+ }
83
+ else {
84
+ promises.push(new Promise((res) => {
85
+ subscriber.callback({ ...state, delta });
86
+ res();
87
+ }));
88
+ }
89
+ }
90
+ }
91
+ await Promise.all(promises);
92
+ };
93
+ }
94
+ static createEventFirer(store, fixture) {
95
+ let autoDetectChanges = true;
96
+ async function fireEvent(el, eventName, eventData = {}) {
97
+ const localState = getLocalState(el);
98
+ if (!localState) {
99
+ console.warn(`[NGT Test] ${el} has no local state`);
100
+ return;
101
+ }
102
+ const handler = localState.handlers[eventName];
103
+ if (!handler) {
104
+ console.warn(`[NGT Test] ${el} has no ${eventName} handler`);
105
+ return;
106
+ }
107
+ const raycastEvent = {
108
+ camera: store.snapshot.camera,
109
+ stopPropagation: () => { },
110
+ target: el,
111
+ currentTarget: el,
112
+ sourceEvent: eventData,
113
+ nativeEvent: eventData,
114
+ object: el,
115
+ eventObject: el,
116
+ ...eventData,
117
+ };
118
+ const result = await handler(raycastEvent);
119
+ if (autoDetectChanges) {
120
+ fixture.detectChanges();
121
+ }
122
+ return result;
123
+ }
124
+ fireEvent.setAutoDetectChanges = (auto) => {
125
+ autoDetectChanges = auto;
126
+ };
127
+ return fireEvent;
128
+ }
129
+ }
130
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1iZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvcmUvdGVzdGluZy9zcmMvbGliL3Rlc3QtYmVkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSx1QkFBdUIsRUFBUSxNQUFNLGVBQWUsQ0FBQztBQUN0RixPQUFPLEVBQW9CLE9BQU8sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2xFLE9BQU8sRUFDTixhQUFhLEVBQ2IsMkJBQTJCLEVBQzNCLFNBQVMsRUFPVCxZQUFZLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQVF2RCxNQUFNLE9BQU8sVUFBVTtJQUN0QixNQUFNLENBQUMsTUFBTSxDQUNaLFVBQWEsRUFDYixFQUNDLGlCQUFpQixHQUFHLEVBQUUsRUFDdEIsbUJBQW1CLEdBQUcsRUFBRSxFQUN4QixzQkFBc0IsRUFDdEIsU0FBUyxFQUNULFlBQVksRUFDWixPQUFPLEVBQ1AsUUFBUSxFQUNSLGtCQUFrQixNQUlxRCxFQUFFO1FBRTFFLE1BQU0sWUFBWSxHQUFHLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFekQsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLHNCQUFzQixDQUFDO1lBQzlDLFNBQVMsRUFBRTtnQkFDVixZQUFZLEVBQUU7Z0JBQ2Q7b0JBQ0MsT0FBTyxFQUFFLHVCQUF1QjtvQkFDaEMsVUFBVSxFQUFFLEdBQUcsRUFBRTt3QkFDaEIsTUFBTSxRQUFRLEdBQUcsMkJBQTJCLEVBQUUsQ0FBQzt3QkFFL0MsT0FBTyxHQUFHLEVBQUU7NEJBQ1gsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDOzRCQUM1QyxZQUFZLENBQUMsU0FBUyxDQUFDO2dDQUN0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Z0JBQ3BELE9BQU87WUFDUixDQUFDO1lBRUQsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMvQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2QsT0FBTyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsV0FBVyxTQUFTLFVBQVUsQ0FBQyxDQUFDO2dCQUM3RCxPQUFPO1lBQ1IsQ0FBQztZQUVELE1BQU0sWUFBWSxHQUFHO2dCQUNwQixNQUFNLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNO2dCQUM3QixlQUFlLEVBQUUsR0FBRyxFQUFFLEdBQUUsQ0FBQztnQkFDekIsTUFBTSxFQUFFLEVBQUU7Z0JBQ1YsYUFBYSxFQUFFLEVBQUU7Z0JBQ2pCLFdBQVcsRUFBRSxTQUFTO2dCQUN0QixXQUFXLEVBQUUsU0FBUztnQkFDdEIsTUFBTSxFQUFFLEVBQUU7Z0JBQ1YsV0FBVyxFQUFFLEVBQUU7Z0JBQ2YsR0FBRyxTQUFTO2FBQ1osQ0FBQztZQUVGLE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDLFlBQW1CLENBQUMsQ0FBQztZQUVsRCxJQUFJLGlCQUFpQixFQUFFLENBQUM7Z0JBQ3ZCLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN6QixDQUFDO1lBRUQsT0FBTyxNQUFNLENBQUM7UUFDZixDQUFDO1FBRUQsU0FBUyxDQUFDLG9CQUFvQixHQUFHLENBQUMsSUFBYSxFQUFFLEVBQUU7WUFDbEQsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQzFCLENBQUMsQ0FBQztRQUVGLE9BQU8sU0FBUyxDQUFDO0lBQ2xCLENBQUM7Q0FDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENVU1RPTV9FTEVNRU5UU19TQ0hFTUEsIEVOVklST05NRU5UX0lOSVRJQUxJWkVSLCBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21wb25lbnRGaXh0dXJlLCBUZXN0QmVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS90ZXN0aW5nJztcbmltcG9ydCB7XG5cdGdldExvY2FsU3RhdGUsXG5cdGluamVjdENhbnZhc1Jvb3RJbml0aWFsaXplcixcblx0TkdUX1NUT1JFLFxuXHROZ3RBbnlSZWNvcmQsXG5cdE5ndENhbnZhc09wdGlvbnMsXG5cdE5ndEV2ZW50SGFuZGxlcnMsXG5cdE5ndEluc3RhbmNlTm9kZSxcblx0Tmd0U2lnbmFsU3RvcmUsXG5cdE5ndFN0YXRlLFxuXHRwcm92aWRlU3RvcmUsXG59IGZyb20gJ2FuZ3VsYXItdGhyZWUnO1xuaW1wb3J0IHsgT2JqZWN0M0QgfSBmcm9tICd0aHJlZSc7XG5pbXBvcnQgeyBOZ3RUZXN0Q2FudmFzIH0gZnJvbSAnLi90ZXN0LWNhbnZhcyc7XG5pbXBvcnQgeyBjcmVhdGVNb2NrQ2FudmFzIH0gZnJvbSAnLi91dGlscy9tb2NrLWNhbnZhcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmd0VGVzdEdyYXBoZWRPYmplY3Qge1xuXHR0eXBlOiBzdHJpbmc7XG5cdG5hbWU6IHN0cmluZztcblx0Y2hpbGRyZW46IE5ndFRlc3RHcmFwaGVkT2JqZWN0W107XG59XG5cbmV4cG9ydCBjbGFzcyBOZ3RUZXN0QmVkIHtcblx0c3RhdGljIGNyZWF0ZTxUIGV4dGVuZHMgVHlwZTxhbnk+Pihcblx0XHRzY2VuZUdyYXBoOiBULFxuXHRcdHtcblx0XHRcdG1vY2tDYW52YXNPcHRpb25zID0ge30sXG5cdFx0XHRjYW52YXNDb25maWd1cmF0aW9uID0ge30sXG5cdFx0XHRlcnJvck9uVW5rbm93bkVsZW1lbnRzLFxuXHRcdFx0cHJvdmlkZXJzLFxuXHRcdFx0ZGVjbGFyYXRpb25zLFxuXHRcdFx0aW1wb3J0cyxcblx0XHRcdHRlYXJkb3duLFxuXHRcdFx0ZGVmZXJCbG9ja0JlaGF2aW9yLFxuXHRcdH06IHtcblx0XHRcdG1vY2tDYW52YXNPcHRpb25zPzogeyB3aWR0aD86IG51bWJlcjsgaGVpZ2h0PzogbnVtYmVyOyBiZWZvcmVSZXR1cm4/OiAoY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCkgPT4gdm9pZCB9O1xuXHRcdFx0Y2FudmFzQ29uZmlndXJhdGlvbj86IFBhcnRpYWw8T21pdDxOZ3RDYW52YXNPcHRpb25zLCAnZnJhbWVsb29wJyB8ICdzaXplJyB8ICdldmVudHMnPj47XG5cdFx0fSAmIE9taXQ8UGFyYW1ldGVyczxUZXN0QmVkWydjb25maWd1cmVUZXN0aW5nTW9kdWxlJ10+WzBdLCAnc2NoZW1hcyc+ID0ge30sXG5cdCkge1xuXHRcdGNvbnN0IG1vY2tlZENhbnZhcyA9IGNyZWF0ZU1vY2tDYW52YXMobW9ja0NhbnZhc09wdGlvbnMpO1xuXG5cdFx0Y29uc3QgZml4dHVyZSA9IFRlc3RCZWQuY29uZmlndXJlVGVzdGluZ01vZHVsZSh7XG5cdFx0XHRwcm92aWRlcnM6IFtcblx0XHRcdFx0cHJvdmlkZVN0b3JlKCksXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRwcm92aWRlOiBFTlZJUk9OTUVOVF9JTklUSUFMSVpFUixcblx0XHRcdFx0XHR1c2VGYWN0b3J5OiAoKSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBpbml0Um9vdCA9IGluamVjdENhbnZhc1Jvb3RJbml0aWFsaXplcigpO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBjb25maWd1cmF0b3IgPSBpbml0Um9vdChtb2NrZWRDYW52YXMpO1xuXHRcdFx0XHRcdFx0XHRjb25maWd1cmF0b3IuY29uZmlndXJlKHtcblx0XHRcdFx0XHRcdFx0XHRmcmFtZWxvb3A6ICduZXZlcicsXG5cdFx0XHRcdFx0XHRcdFx0c2l6ZToge1xuXHRcdFx0XHRcdFx0XHRcdFx0d2lkdGg6IG1vY2tDYW52YXNPcHRpb25zLndpZHRoID8/IDEyODAsXG5cdFx0XHRcdFx0XHRcdFx0XHRoZWlnaHQ6IG1vY2tDYW52YXNPcHRpb25zLmhlaWdodCA/PyA4MDAsXG5cdFx0XHRcdFx0XHRcdFx0XHR0b3A6IDAsXG5cdFx0XHRcdFx0XHRcdFx0XHRsZWZ0OiAwLFxuXHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0Li4uY2FudmFzQ29uZmlndXJhdGlvbixcblx0XHRcdFx0XHRcdFx0XHRldmVudHM6IHVuZGVmaW5lZCxcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0bXVsdGk6IHRydWUsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdC4uLihwcm92aWRlcnMgPz8gW10pLFxuXHRcdFx0XSxcblx0XHRcdHNjaGVtYXM6IFtDVVNUT01fRUxFTUVOVFNfU0NIRU1BXSxcblx0XHRcdGVycm9yT25Vbmtub3duRWxlbWVudHM6IGVycm9yT25Vbmtub3duRWxlbWVudHMgPz8gZmFsc2UsXG5cdFx0XHRkZWNsYXJhdGlvbnMsXG5cdFx0XHRpbXBvcnRzLFxuXHRcdFx0dGVhcmRvd24sXG5cdFx0XHRkZWZlckJsb2NrQmVoYXZpb3IsXG5cdFx0fSkuY3JlYXRlQ29tcG9uZW50KE5ndFRlc3RDYW52YXMpO1xuXG5cdFx0Zml4dHVyZS5jb21wb25lbnRSZWYuc2V0SW5wdXQoJ3NjZW5lR3JhcGgnLCBzY2VuZUdyYXBoKTtcblx0XHRmaXh0dXJlLmRldGVjdENoYW5nZXMoKTtcblxuXHRcdGNvbnN0IHN0b3JlID0gVGVzdEJlZC5pbmplY3QoTkdUX1NUT1JFKTtcblxuXHRcdFRlc3RCZWQuZmx1c2hFZmZlY3RzKCk7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0c3RvcmUsXG5cdFx0XHRmaXh0dXJlLFxuXHRcdFx0c2NlbmU6IHN0b3JlLnNuYXBzaG90LnNjZW5lLFxuXHRcdFx0c2NlbmVJbnN0YW5jZU5vZGU6IGdldExvY2FsU3RhdGUoc3RvcmUuc25hcHNob3Quc2NlbmUpISxcblx0XHRcdGNhbnZhczogbW9ja2VkQ2FudmFzLFxuXHRcdFx0ZGVzdHJveTogZml4dHVyZS5jb21wb25lbnRJbnN0YW5jZS5kZXN0cm95LmJpbmQoZml4dHVyZS5jb21wb25lbnRJbnN0YW5jZSksXG5cdFx0XHRmaXJlRXZlbnQ6IHRoaXMuY3JlYXRlRXZlbnRGaXJlcihzdG9yZSwgZml4dHVyZSksXG5cdFx0XHRhZHZhbmNlOiB0aGlzLmNyZWF0ZUFkdmFuY2Uoc3RvcmUpLFxuXHRcdFx0dG9HcmFwaDogdGhpcy5jcmVhdGVUb0dyYXBoKHN0b3JlKSxcblx0XHR9O1xuXHR9XG5cblx0c3RhdGljIGNyZWF0ZVRvR3JhcGgoc3RvcmU6IE5ndFNpZ25hbFN0b3JlPE5ndFN0YXRlPikge1xuXHRcdGZ1bmN0aW9uIGdyYXBoaWZ5KHR5cGU6IHN0cmluZywgbmFtZTogc3RyaW5nLCBjaGlsZHJlbjogTmd0VGVzdEdyYXBoZWRPYmplY3RbXSk6IE5ndFRlc3RHcmFwaGVkT2JqZWN0IHtcblx0XHRcdHJldHVybiB7IHR5cGUsIG5hbWUsIGNoaWxkcmVuIH07XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gdG9HcmFwaChub2RlOiBPYmplY3QzRCk6IE5ndFRlc3RHcmFwaGVkT2JqZWN0W10ge1xuXHRcdFx0cmV0dXJuIG5vZGUuY2hpbGRyZW4ubWFwKChjaGlsZCkgPT4gZ3JhcGhpZnkoY2hpbGQudHlwZSwgY2hpbGQubmFtZSB8fCAnJywgdG9HcmFwaChjaGlsZCkpKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gKCkgPT4ge1xuXHRcdFx0Y29uc3Qgc3RhdGUgPSBzdG9yZS5zbmFwc2hvdDtcblx0XHRcdHJldHVybiB0b0dyYXBoKHN0YXRlLnNjZW5lKTtcblx0XHR9O1xuXHR9XG5cblx0c3RhdGljIGNyZWF0ZUFkdmFuY2Uoc3RvcmU6IE5ndFNpZ25hbFN0b3JlPE5ndFN0YXRlPikge1xuXHRcdHJldHVybiBhc3luYyAoZnJhbWVzOiBudW1iZXIsIGRlbHRhOiBudW1iZXIgfCBudW1iZXJbXSA9IDEpID0+IHtcblx0XHRcdGNvbnN0IHN0YXRlID0gc3RvcmUuc25hcHNob3Q7XG5cdFx0XHRjb25zdCBzdWJzY3JpYmVycyA9IHN0YXRlLmludGVybmFsLnN1YnNjcmliZXJzO1xuXG5cdFx0XHRjb25zdCBwcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG5cblx0XHRcdGZvciAoY29uc3Qgc3Vic2NyaWJlciBvZiBzdWJzY3JpYmVycykge1xuXHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGZyYW1lczsgaSsrKSB7XG5cdFx0XHRcdFx0aWYgKEFycmF5LmlzQXJyYXkoZGVsdGEpKSB7XG5cdFx0XHRcdFx0XHRwcm9taXNlcy5wdXNoKFxuXHRcdFx0XHRcdFx0XHRuZXcgUHJvbWlzZSgocmVzKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0c3Vic2NyaWJlci5jYWxsYmFjayh7IC4uLnN0YXRlLCBkZWx0YTogZGVsdGFbaV0gfHwgZGVsdGFbLTFdIH0pO1xuXHRcdFx0XHRcdFx0XHRcdHJlcygpO1xuXHRcdFx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHByb21pc2VzLnB1c2goXG5cdFx0XHRcdFx0XHRcdG5ldyBQcm9taXNlKChyZXMpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRzdWJzY3JpYmVyLmNhbGxiYWNrKHsgLi4uc3RhdGUsIGRlbHRhIH0pO1xuXHRcdFx0XHRcdFx0XHRcdHJlcygpO1xuXHRcdFx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcblx0XHR9O1xuXHR9XG5cblx0c3RhdGljIGNyZWF0ZUV2ZW50RmlyZXIoc3RvcmU6IE5ndFNpZ25hbFN0b3JlPE5ndFN0YXRlPiwgZml4dHVyZTogQ29tcG9uZW50Rml4dHVyZTxOZ3RUZXN0Q2FudmFzPikge1xuXHRcdGxldCBhdXRvRGV0ZWN0Q2hhbmdlcyA9IHRydWU7XG5cblx0XHRhc3luYyBmdW5jdGlvbiBmaXJlRXZlbnQoZWw6IE5ndEluc3RhbmNlTm9kZSwgZXZlbnROYW1lOiBrZXlvZiBOZ3RFdmVudEhhbmRsZXJzLCBldmVudERhdGE6IE5ndEFueVJlY29yZCA9IHt9KSB7XG5cdFx0XHRjb25zdCBsb2NhbFN0YXRlID0gZ2V0TG9jYWxTdGF0ZShlbCk7XG5cdFx0XHRpZiAoIWxvY2FsU3RhdGUpIHtcblx0XHRcdFx0Y29uc29sZS53YXJuKGBbTkdUIFRlc3RdICR7ZWx9IGhhcyBubyBsb2NhbCBzdGF0ZWApO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGhhbmRsZXIgPSBsb2NhbFN0YXRlLmhhbmRsZXJzW2V2ZW50TmFtZV07XG5cdFx0XHRpZiAoIWhhbmRsZXIpIHtcblx0XHRcdFx0Y29uc29sZS53YXJuKGBbTkdUIFRlc3RdICR7ZWx9IGhhcyBubyAke2V2ZW50TmFtZX0gaGFuZGxlcmApO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHJheWNhc3RFdmVudCA9IHtcblx0XHRcdFx0Y2FtZXJhOiBzdG9yZS5zbmFwc2hvdC5jYW1lcmEsXG5cdFx0XHRcdHN0b3BQcm9wYWdhdGlvbjogKCkgPT4ge30sXG5cdFx0XHRcdHRhcmdldDogZWwsXG5cdFx0XHRcdGN1cnJlbnRUYXJnZXQ6IGVsLFxuXHRcdFx0XHRzb3VyY2VFdmVudDogZXZlbnREYXRhLFxuXHRcdFx0XHRuYXRpdmVFdmVudDogZXZlbnREYXRhLFxuXHRcdFx0XHRvYmplY3Q6IGVsLFxuXHRcdFx0XHRldmVudE9iamVjdDogZWwsXG5cdFx0XHRcdC4uLmV2ZW50RGF0YSxcblx0XHRcdH07XG5cblx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IGhhbmRsZXIocmF5Y2FzdEV2ZW50IGFzIGFueSk7XG5cblx0XHRcdGlmIChhdXRvRGV0ZWN0Q2hhbmdlcykge1xuXHRcdFx0XHRmaXh0dXJlLmRldGVjdENoYW5nZXMoKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9XG5cblx0XHRmaXJlRXZlbnQuc2V0QXV0b0RldGVjdENoYW5nZXMgPSAoYXV0bzogYm9vbGVhbikgPT4ge1xuXHRcdFx0YXV0b0RldGVjdENoYW5nZXMgPSBhdXRvO1xuXHRcdH07XG5cblx0XHRyZXR1cm4gZmlyZUV2ZW50O1xuXHR9XG59XG4iXX0=
@@ -0,0 +1,45 @@
1
+ import { afterNextRender, ChangeDetectionStrategy, Component, createEnvironmentInjector, DestroyRef, effect, EnvironmentInjector, inject, Injector, input, ViewContainerRef, } from '@angular/core';
2
+ import { extend, injectStore, provideNgtRenderer } from 'angular-three';
3
+ import * as THREE from 'three';
4
+ import * as i0 from "@angular/core";
5
+ export class NgtTestCanvas {
6
+ constructor() {
7
+ this.sceneGraph = input.required();
8
+ extend(THREE);
9
+ const vcr = inject(ViewContainerRef);
10
+ const parentEnvironmentInjector = inject(EnvironmentInjector);
11
+ const parentInjector = inject(Injector);
12
+ const store = injectStore();
13
+ afterNextRender(() => {
14
+ effect(() => {
15
+ const sceneGraph = this.sceneGraph();
16
+ this.environmentInjector = createEnvironmentInjector([provideNgtRenderer(store)], parentEnvironmentInjector);
17
+ this.ref = vcr.createComponent(sceneGraph, {
18
+ environmentInjector: this.environmentInjector,
19
+ injector: parentInjector,
20
+ });
21
+ this.ref.changeDetectorRef.detectChanges();
22
+ }, { injector: parentInjector });
23
+ });
24
+ inject(DestroyRef).onDestroy(() => {
25
+ this.environmentInjector?.destroy();
26
+ this.ref?.destroy();
27
+ });
28
+ }
29
+ destroy() {
30
+ this.environmentInjector?.destroy();
31
+ this.ref?.destroy();
32
+ }
33
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtTestCanvas, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
34
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.0", type: NgtTestCanvas, isStandalone: true, selector: "ngt-test-canvas", inputs: { sceneGraph: { classPropertyName: "sceneGraph", publicName: "sceneGraph", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
35
+ }
36
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtTestCanvas, decorators: [{
37
+ type: Component,
38
+ args: [{
39
+ selector: 'ngt-test-canvas',
40
+ template: '',
41
+ standalone: true,
42
+ changeDetection: ChangeDetectionStrategy.OnPush,
43
+ }]
44
+ }], ctorParameters: () => [] });
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1jYW52YXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvcmUvdGVzdGluZy9zcmMvbGliL3Rlc3QtY2FudmFzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTixlQUFlLEVBQ2YsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFFVCx5QkFBeUIsRUFDekIsVUFBVSxFQUNWLE1BQU0sRUFDTixtQkFBbUIsRUFDbkIsTUFBTSxFQUNOLFFBQVEsRUFDUixLQUFLLEVBRUwsZ0JBQWdCLEdBQ2hCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hFLE9BQU8sS0FBSyxLQUFLLE1BQU0sT0FBTyxDQUFDOztBQVEvQixNQUFNLE9BQU8sYUFBYTtJQU16QjtRQUxBLGVBQVUsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFhLENBQUM7UUFNeEMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWQsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDckMsTUFBTSx5QkFBeUIsR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUM5RCxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDeEMsTUFBTSxLQUFLLEdBQUcsV0FBVyxFQUFFLENBQUM7UUFFNUIsZUFBZSxDQUFDLEdBQUcsRUFBRTtZQUNwQixNQUFNLENBQ0wsR0FBRyxFQUFFO2dCQUNKLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFFckMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLHlCQUF5QixDQUFDLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO2dCQUU3RyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxlQUFlLENBQUMsVUFBVSxFQUFFO29CQUMxQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsbUJBQW1CO29CQUM3QyxRQUFRLEVBQUUsY0FBYztpQkFDeEIsQ0FBQyxDQUFDO2dCQUNILElBQUksQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDNUMsQ0FBQyxFQUNELEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxDQUM1QixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNqQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsT0FBTyxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsQ0FBQztRQUNyQixDQUFDLENBQUMsQ0FBQztJQUNKLENBQUM7SUFFRCxPQUFPO1FBQ04sSUFBSSxDQUFDLG1CQUFtQixFQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUM7SUFDckIsQ0FBQzs4R0F4Q1csYUFBYTtrR0FBYixhQUFhLDZOQUpmLEVBQUU7OzJGQUlBLGFBQWE7a0JBTnpCLFNBQVM7bUJBQUM7b0JBQ1YsUUFBUSxFQUFFLGlCQUFpQjtvQkFDM0IsUUFBUSxFQUFFLEVBQUU7b0JBQ1osVUFBVSxFQUFFLElBQUk7b0JBQ2hCLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2lCQUMvQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG5cdGFmdGVyTmV4dFJlbmRlcixcblx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG5cdENvbXBvbmVudCxcblx0Q29tcG9uZW50UmVmLFxuXHRjcmVhdGVFbnZpcm9ubWVudEluamVjdG9yLFxuXHREZXN0cm95UmVmLFxuXHRlZmZlY3QsXG5cdEVudmlyb25tZW50SW5qZWN0b3IsXG5cdGluamVjdCxcblx0SW5qZWN0b3IsXG5cdGlucHV0LFxuXHRUeXBlLFxuXHRWaWV3Q29udGFpbmVyUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGV4dGVuZCwgaW5qZWN0U3RvcmUsIHByb3ZpZGVOZ3RSZW5kZXJlciB9IGZyb20gJ2FuZ3VsYXItdGhyZWUnO1xuaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xuXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6ICduZ3QtdGVzdC1jYW52YXMnLFxuXHR0ZW1wbGF0ZTogJycsXG5cdHN0YW5kYWxvbmU6IHRydWUsXG5cdGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3RUZXN0Q2FudmFzIHtcblx0c2NlbmVHcmFwaCA9IGlucHV0LnJlcXVpcmVkPFR5cGU8YW55Pj4oKTtcblxuXHRwcml2YXRlIHJlZj86IENvbXBvbmVudFJlZjxhbnk+O1xuXHRwcml2YXRlIGVudmlyb25tZW50SW5qZWN0b3I/OiBFbnZpcm9ubWVudEluamVjdG9yO1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdGV4dGVuZChUSFJFRSk7XG5cblx0XHRjb25zdCB2Y3IgPSBpbmplY3QoVmlld0NvbnRhaW5lclJlZik7XG5cdFx0Y29uc3QgcGFyZW50RW52aXJvbm1lbnRJbmplY3RvciA9IGluamVjdChFbnZpcm9ubWVudEluamVjdG9yKTtcblx0XHRjb25zdCBwYXJlbnRJbmplY3RvciA9IGluamVjdChJbmplY3Rvcik7XG5cdFx0Y29uc3Qgc3RvcmUgPSBpbmplY3RTdG9yZSgpO1xuXG5cdFx0YWZ0ZXJOZXh0UmVuZGVyKCgpID0+IHtcblx0XHRcdGVmZmVjdChcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHNjZW5lR3JhcGggPSB0aGlzLnNjZW5lR3JhcGgoKTtcblxuXHRcdFx0XHRcdHRoaXMuZW52aXJvbm1lbnRJbmplY3RvciA9IGNyZWF0ZUVudmlyb25tZW50SW5qZWN0b3IoW3Byb3ZpZGVOZ3RSZW5kZXJlcihzdG9yZSldLCBwYXJlbnRFbnZpcm9ubWVudEluamVjdG9yKTtcblxuXHRcdFx0XHRcdHRoaXMucmVmID0gdmNyLmNyZWF0ZUNvbXBvbmVudChzY2VuZUdyYXBoLCB7XG5cdFx0XHRcdFx0XHRlbnZpcm9ubWVudEluamVjdG9yOiB0aGlzLmVudmlyb25tZW50SW5qZWN0b3IsXG5cdFx0XHRcdFx0XHRpbmplY3RvcjogcGFyZW50SW5qZWN0b3IsXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0dGhpcy5yZWYuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR7IGluamVjdG9yOiBwYXJlbnRJbmplY3RvciB9LFxuXHRcdFx0KTtcblx0XHR9KTtcblxuXHRcdGluamVjdChEZXN0cm95UmVmKS5vbkRlc3Ryb3koKCkgPT4ge1xuXHRcdFx0dGhpcy5lbnZpcm9ubWVudEluamVjdG9yPy5kZXN0cm95KCk7XG5cdFx0XHR0aGlzLnJlZj8uZGVzdHJveSgpO1xuXHRcdH0pO1xuXHR9XG5cblx0ZGVzdHJveSgpIHtcblx0XHR0aGlzLmVudmlyb25tZW50SW5qZWN0b3I/LmRlc3Ryb3koKTtcblx0XHR0aGlzLnJlZj8uZGVzdHJveSgpO1xuXHR9XG59XG4iXX0=
@@ -0,0 +1,37 @@
1
+ import { WebGL2RenderingContext } from './web-gl-rendering-context';
2
+ export function createMockCanvas({ width = 1280, height = 800, beforeReturn, }) {
3
+ let canvas;
4
+ if (typeof document !== 'undefined' && typeof document.createElement === 'function') {
5
+ canvas = document.createElement('canvas');
6
+ }
7
+ else {
8
+ canvas = {
9
+ style: {},
10
+ addEventListener: (() => { }),
11
+ removeEventListener: (() => { }),
12
+ clientWidth: width,
13
+ clientHeight: height,
14
+ getContext: (() => new WebGL2RenderingContext(canvas)),
15
+ };
16
+ }
17
+ canvas.width = width;
18
+ canvas.height = height;
19
+ if (globalThis.HTMLCanvasElement) {
20
+ const getContext = HTMLCanvasElement.prototype.getContext;
21
+ HTMLCanvasElement.prototype.getContext = function (...args) {
22
+ const id = args[0];
23
+ if (id.startsWith('webgl'))
24
+ return new WebGL2RenderingContext(this);
25
+ return getContext.apply(this, args);
26
+ };
27
+ }
28
+ beforeReturn?.(canvas);
29
+ class WebGLRenderingContext extends WebGL2RenderingContext {
30
+ }
31
+ // @ts-expect-error - WebGLRenderingContext is not defined in the global scope for non-browser
32
+ globalThis.WebGLRenderingContext ??= WebGLRenderingContext;
33
+ // @ts-expect-error - WebGL2RenderingContext is not defined in the global scope for non-browser
34
+ globalThis.WebGL2RenderingContext ??= WebGL2RenderingContext;
35
+ return canvas;
36
+ }
37
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9jay1jYW52YXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvcmUvdGVzdGluZy9zcmMvbGliL3V0aWxzL21vY2stY2FudmFzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXBFLE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxFQUNoQyxLQUFLLEdBQUcsSUFBSSxFQUNaLE1BQU0sR0FBRyxHQUFHLEVBQ1osWUFBWSxHQUtaO0lBQ0EsSUFBSSxNQUF5QixDQUFDO0lBRTlCLElBQUksT0FBTyxRQUFRLEtBQUssV0FBVyxJQUFJLE9BQU8sUUFBUSxDQUFDLGFBQWEsS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUNyRixNQUFNLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMzQyxDQUFDO1NBQU0sQ0FBQztRQUNQLE1BQU0sR0FBRztZQUNSLEtBQUssRUFBRSxFQUFFO1lBQ1QsZ0JBQWdCLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQVE7WUFDbkMsbUJBQW1CLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQVE7WUFDdEMsV0FBVyxFQUFFLEtBQUs7WUFDbEIsWUFBWSxFQUFFLE1BQU07WUFDcEIsVUFBVSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBUTtTQUN4QyxDQUFDO0lBQ3hCLENBQUM7SUFDRCxNQUFNLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNyQixNQUFNLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUV2QixJQUFJLFVBQVUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sVUFBVSxHQUFHLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUM7UUFDMUQsaUJBQWlCLENBQUMsU0FBUyxDQUFDLFVBQVUsR0FBRyxVQUV4QyxHQUFHLElBQW1DO1lBRXRDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuQixJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDO2dCQUFFLE9BQU8sSUFBSSxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNwRSxPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3JDLENBQVEsQ0FBQztJQUNWLENBQUM7SUFFRCxZQUFZLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUV2QixNQUFNLHFCQUFzQixTQUFRLHNCQUFzQjtLQUFHO0lBQzdELDhGQUE4RjtJQUM5RixVQUFVLENBQUMscUJBQXFCLEtBQUsscUJBQXFCLENBQUM7SUFDM0QsK0ZBQStGO0lBQy9GLFVBQVUsQ0FBQyxzQkFBc0IsS0FBSyxzQkFBc0IsQ0FBQztJQUU3RCxPQUFPLE1BQU0sQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBXZWJHTDJSZW5kZXJpbmdDb250ZXh0IH0gZnJvbSAnLi93ZWItZ2wtcmVuZGVyaW5nLWNvbnRleHQnO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9ja0NhbnZhcyh7XG5cdHdpZHRoID0gMTI4MCxcblx0aGVpZ2h0ID0gODAwLFxuXHRiZWZvcmVSZXR1cm4sXG59OiB7XG5cdHdpZHRoPzogbnVtYmVyO1xuXHRoZWlnaHQ/OiBudW1iZXI7XG5cdGJlZm9yZVJldHVybj86IChjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50KSA9PiB2b2lkO1xufSkge1xuXHRsZXQgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudDtcblxuXHRpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuXHR9IGVsc2Uge1xuXHRcdGNhbnZhcyA9IHtcblx0XHRcdHN0eWxlOiB7fSxcblx0XHRcdGFkZEV2ZW50TGlzdGVuZXI6ICgoKSA9PiB7fSkgYXMgYW55LFxuXHRcdFx0cmVtb3ZlRXZlbnRMaXN0ZW5lcjogKCgpID0+IHt9KSBhcyBhbnksXG5cdFx0XHRjbGllbnRXaWR0aDogd2lkdGgsXG5cdFx0XHRjbGllbnRIZWlnaHQ6IGhlaWdodCxcblx0XHRcdGdldENvbnRleHQ6ICgoKSA9PiBuZXcgV2ViR0wyUmVuZGVyaW5nQ29udGV4dChjYW52YXMpKSBhcyBhbnksXG5cdFx0fSBhcyBIVE1MQ2FudmFzRWxlbWVudDtcblx0fVxuXHRjYW52YXMud2lkdGggPSB3aWR0aDtcblx0Y2FudmFzLmhlaWdodCA9IGhlaWdodDtcblxuXHRpZiAoZ2xvYmFsVGhpcy5IVE1MQ2FudmFzRWxlbWVudCkge1xuXHRcdGNvbnN0IGdldENvbnRleHQgPSBIVE1MQ2FudmFzRWxlbWVudC5wcm90b3R5cGUuZ2V0Q29udGV4dDtcblx0XHRIVE1MQ2FudmFzRWxlbWVudC5wcm90b3R5cGUuZ2V0Q29udGV4dCA9IGZ1bmN0aW9uIChcblx0XHRcdHRoaXM6IEhUTUxDYW52YXNFbGVtZW50LFxuXHRcdFx0Li4uYXJnczogUGFyYW1ldGVyczx0eXBlb2YgZ2V0Q29udGV4dD5cblx0XHQpIHtcblx0XHRcdGNvbnN0IGlkID0gYXJnc1swXTtcblx0XHRcdGlmIChpZC5zdGFydHNXaXRoKCd3ZWJnbCcpKSByZXR1cm4gbmV3IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQodGhpcyk7XG5cdFx0XHRyZXR1cm4gZ2V0Q29udGV4dC5hcHBseSh0aGlzLCBhcmdzKTtcblx0XHR9IGFzIGFueTtcblx0fVxuXG5cdGJlZm9yZVJldHVybj8uKGNhbnZhcyk7XG5cblx0Y2xhc3MgV2ViR0xSZW5kZXJpbmdDb250ZXh0IGV4dGVuZHMgV2ViR0wyUmVuZGVyaW5nQ29udGV4dCB7fVxuXHQvLyBAdHMtZXhwZWN0LWVycm9yIC0gV2ViR0xSZW5kZXJpbmdDb250ZXh0IGlzIG5vdCBkZWZpbmVkIGluIHRoZSBnbG9iYWwgc2NvcGUgZm9yIG5vbi1icm93c2VyXG5cdGdsb2JhbFRoaXMuV2ViR0xSZW5kZXJpbmdDb250ZXh0ID8/PSBXZWJHTFJlbmRlcmluZ0NvbnRleHQ7XG5cdC8vIEB0cy1leHBlY3QtZXJyb3IgLSBXZWJHTDJSZW5kZXJpbmdDb250ZXh0IGlzIG5vdCBkZWZpbmVkIGluIHRoZSBnbG9iYWwgc2NvcGUgZm9yIG5vbi1icm93c2VyXG5cdGdsb2JhbFRoaXMuV2ViR0wyUmVuZGVyaW5nQ29udGV4dCA/Pz0gV2ViR0wyUmVuZGVyaW5nQ29udGV4dDtcblxuXHRyZXR1cm4gY2FudmFzO1xufVxuIl19