angular-three 2.0.0-beta.31 → 2.0.0-beta.310

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 (152) hide show
  1. package/README.md +221 -4
  2. package/esm2022/index.mjs +13 -13
  3. package/esm2022/lib/canvas.mjs +128 -200
  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 +62 -31
  11. package/esm2022/lib/loop.mjs +28 -25
  12. package/esm2022/lib/pipes/hexify.mjs +67 -0
  13. package/esm2022/lib/portal.mjs +173 -193
  14. package/esm2022/lib/renderer/catalogue.mjs +2 -2
  15. package/esm2022/lib/renderer/constants.mjs +5 -6
  16. package/esm2022/lib/renderer/index.mjs +387 -234
  17. package/esm2022/lib/renderer/state.mjs +49 -0
  18. package/esm2022/lib/renderer/utils.mjs +107 -95
  19. package/esm2022/lib/roots.mjs +85 -61
  20. package/esm2022/lib/routed-scene.mjs +6 -7
  21. package/esm2022/lib/store.mjs +170 -194
  22. package/esm2022/lib/three-types.mjs +2 -2
  23. package/esm2022/lib/types.mjs +1 -1
  24. package/esm2022/lib/utils/apply-props.mjs +24 -28
  25. package/esm2022/lib/utils/attach.mjs +12 -9
  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 +92 -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 +52 -58
  34. package/esm2022/lib/utils/update.mjs +8 -4
  35. package/esm2022/testing/angular-three-testing.mjs +5 -0
  36. package/esm2022/testing/index.mjs +3 -0
  37. package/esm2022/testing/lib/test-bed.mjs +130 -0
  38. package/esm2022/testing/lib/test-canvas.mjs +45 -0
  39. package/esm2022/testing/lib/utils/mock-canvas.mjs +37 -0
  40. package/esm2022/testing/lib/utils/web-gl-rendering-context.mjs +752 -0
  41. package/fesm2022/angular-three-testing.mjs +966 -0
  42. package/fesm2022/angular-three-testing.mjs.map +1 -0
  43. package/fesm2022/angular-three.mjs +2506 -2539
  44. package/fesm2022/angular-three.mjs.map +1 -1
  45. package/index.d.ts +14 -12
  46. package/lib/canvas.d.ts +366 -96
  47. package/lib/directives/args.d.ts +14 -7
  48. package/lib/directives/selection.d.ts +17 -0
  49. package/lib/dom/events.d.ts +2 -3
  50. package/lib/events.d.ts +4 -80
  51. package/lib/html.d.ts +17 -0
  52. package/lib/instance.d.ts +3 -35
  53. package/lib/loader.d.ts +18 -6
  54. package/lib/loop.d.ts +11 -59
  55. package/lib/pipes/hexify.d.ts +20 -0
  56. package/lib/portal.d.ts +54 -48
  57. package/lib/renderer/catalogue.d.ts +7 -3
  58. package/lib/renderer/constants.d.ts +4 -5
  59. package/lib/renderer/index.d.ts +64 -4
  60. package/lib/renderer/state.d.ts +24 -0
  61. package/lib/renderer/utils.d.ts +9 -27
  62. package/lib/roots.d.ts +9 -7
  63. package/lib/store.d.ts +13 -141
  64. package/lib/three-types.d.ts +500 -147
  65. package/lib/types.d.ts +291 -0
  66. package/lib/utils/apply-props.d.ts +1 -3
  67. package/lib/utils/attach.d.ts +3 -5
  68. package/lib/{before-render.d.ts → utils/before-render.d.ts} +1 -1
  69. package/lib/utils/is.d.ts +13 -14
  70. package/lib/utils/make.d.ts +7 -13
  71. package/lib/utils/non-nullish.d.ts +4 -0
  72. package/lib/utils/object-events.d.ts +34 -0
  73. package/lib/utils/parameters.d.ts +20 -0
  74. package/lib/utils/resolve-ref.d.ts +2 -0
  75. package/lib/utils/signal-store.d.ts +13 -4
  76. package/lib/utils/update.d.ts +1 -1
  77. package/metadata.json +1 -1
  78. package/package.json +40 -24
  79. package/plugin/generators.json +8 -30
  80. package/plugin/package.json +3 -22
  81. package/plugin/src/generators/add-soba/compat.js.map +1 -0
  82. package/plugin/src/generators/add-soba/generator.d.ts +3 -0
  83. package/plugin/src/generators/add-soba/generator.js +78 -0
  84. package/plugin/src/generators/add-soba/generator.js.map +1 -0
  85. package/plugin/src/generators/add-soba/schema.json +4 -0
  86. package/plugin/src/generators/init/compat.d.ts +1 -3
  87. package/plugin/src/generators/init/files/experience/experience.component.ts__tmpl__ +18 -7
  88. package/plugin/src/generators/init/generator.d.ts +5 -5
  89. package/plugin/src/generators/init/generator.js +100 -106
  90. package/plugin/src/generators/init/generator.js.map +1 -1
  91. package/plugin/src/generators/init/schema.json +8 -12
  92. package/plugin/src/generators/utils.js +4 -3
  93. package/plugin/src/generators/utils.js.map +1 -1
  94. package/plugin/src/generators/version.d.ts +17 -0
  95. package/plugin/src/generators/version.js +21 -0
  96. package/plugin/src/generators/version.js.map +1 -0
  97. package/plugin/src/index.d.ts +0 -3
  98. package/plugin/src/index.js +0 -9
  99. package/plugin/src/index.js.map +1 -1
  100. package/testing/README.md +3 -0
  101. package/testing/index.d.ts +2 -0
  102. package/testing/lib/test-bed.d.ts +38 -0
  103. package/testing/lib/test-canvas.d.ts +11 -0
  104. package/testing/lib/utils/mock-canvas.d.ts +5 -0
  105. package/testing/lib/utils/web-gl-rendering-context.d.ts +16 -0
  106. package/testing/package.json +3 -0
  107. package/web-types.json +1 -1
  108. package/esm2022/lib/before-render.mjs +0 -13
  109. package/esm2022/lib/directives/common.mjs +0 -41
  110. package/esm2022/lib/directives/key.mjs +0 -29
  111. package/esm2022/lib/directives/parent.mjs +0 -35
  112. package/esm2022/lib/ref.mjs +0 -48
  113. package/esm2022/lib/renderer/store.mjs +0 -408
  114. package/esm2022/lib/utils/safe-detect-changes.mjs +0 -17
  115. package/lib/directives/common.d.ts +0 -15
  116. package/lib/directives/key.d.ts +0 -10
  117. package/lib/directives/parent.d.ts +0 -11
  118. package/lib/ref.d.ts +0 -8
  119. package/lib/renderer/store.d.ts +0 -67
  120. package/lib/utils/safe-detect-changes.d.ts +0 -2
  121. package/plugin/migrations.json +0 -16
  122. package/plugin/src/generators/init/files/experience/experience.component.html__tmpl__ +0 -4
  123. package/plugin/src/generators/init-cannon/compat.js.map +0 -1
  124. package/plugin/src/generators/init-cannon/generator.d.ts +0 -2
  125. package/plugin/src/generators/init-cannon/generator.js +0 -23
  126. package/plugin/src/generators/init-cannon/generator.js.map +0 -1
  127. package/plugin/src/generators/init-cannon/schema.json +0 -6
  128. package/plugin/src/generators/init-postprocessing/compat.d.ts +0 -2
  129. package/plugin/src/generators/init-postprocessing/compat.js +0 -6
  130. package/plugin/src/generators/init-postprocessing/compat.js.map +0 -1
  131. package/plugin/src/generators/init-postprocessing/generator.d.ts +0 -2
  132. package/plugin/src/generators/init-postprocessing/generator.js +0 -21
  133. package/plugin/src/generators/init-postprocessing/generator.js.map +0 -1
  134. package/plugin/src/generators/init-postprocessing/schema.json +0 -6
  135. package/plugin/src/generators/init-soba/compat.d.ts +0 -2
  136. package/plugin/src/generators/init-soba/compat.js +0 -6
  137. package/plugin/src/generators/init-soba/compat.js.map +0 -1
  138. package/plugin/src/generators/init-soba/generator.d.ts +0 -2
  139. package/plugin/src/generators/init-soba/generator.js +0 -27
  140. package/plugin/src/generators/init-soba/generator.js.map +0 -1
  141. package/plugin/src/generators/init-soba/schema.json +0 -6
  142. package/plugin/src/generators/versions.d.ts +0 -13
  143. package/plugin/src/generators/versions.js +0 -17
  144. package/plugin/src/generators/versions.js.map +0 -1
  145. package/plugin/src/migrations/migrate-to-ngxtension/compat.d.ts +0 -2
  146. package/plugin/src/migrations/migrate-to-ngxtension/compat.js +0 -6
  147. package/plugin/src/migrations/migrate-to-ngxtension/compat.js.map +0 -1
  148. package/plugin/src/migrations/migrate-to-ngxtension/migrate-to-ngxtension.d.ts +0 -2
  149. package/plugin/src/migrations/migrate-to-ngxtension/migrate-to-ngxtension.js +0 -41
  150. package/plugin/src/migrations/migrate-to-ngxtension/migrate-to-ngxtension.js.map +0 -1
  151. /package/plugin/src/generators/{init-cannon → add-soba}/compat.d.ts +0 -0
  152. /package/plugin/src/generators/{init-cannon → add-soba}/compat.js +0 -0
@@ -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.1.3", ngImport: i0, type: NgtTestCanvas, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
34
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.1.3", 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.1.3", 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