@editframe/elements 0.7.0-beta.6 → 0.7.0-beta.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/package.json +2 -2
- package/postcss.config.cjs +12 -0
- package/{dist/packages/elements/src/EF_FRAMEGEN.js → src/EF_FRAMEGEN.ts} +113 -32
- package/src/EF_INTERACTIVE.ts +2 -0
- package/src/elements.css +22 -0
- package/src/index.ts +33 -0
- package/tailwind.config.ts +10 -0
- package/tsconfig.json +4 -0
- package/vite.config.ts +8 -0
- package/dist/lib/av/EncodedAsset.cjs +0 -577
- package/dist/lib/av/EncodedAsset.js +0 -560
- package/dist/lib/av/MP4File.cjs +0 -187
- package/dist/lib/av/MP4File.js +0 -170
- package/dist/lib/av/msToTimeCode.cjs +0 -15
- package/dist/lib/av/msToTimeCode.js +0 -15
- package/dist/lib/util/awaitMicrotask.cjs +0 -4
- package/dist/lib/util/awaitMicrotask.js +0 -4
- package/dist/lib/util/memoize.cjs +0 -14
- package/dist/lib/util/memoize.js +0 -14
- package/dist/packages/elements/src/EF_FRAMEGEN.cjs +0 -197
- package/dist/packages/elements/src/EF_FRAMEGEN.d.ts +0 -44
- package/dist/packages/elements/src/EF_INTERACTIVE.cjs +0 -4
- package/dist/packages/elements/src/EF_INTERACTIVE.d.ts +0 -1
- package/dist/packages/elements/src/EF_INTERACTIVE.js +0 -4
- package/dist/packages/elements/src/elements/CrossUpdateController.cjs +0 -16
- package/dist/packages/elements/src/elements/CrossUpdateController.d.ts +0 -9
- package/dist/packages/elements/src/elements/CrossUpdateController.js +0 -16
- package/dist/packages/elements/src/elements/EFAudio.cjs +0 -53
- package/dist/packages/elements/src/elements/EFAudio.d.ts +0 -10
- package/dist/packages/elements/src/elements/EFAudio.js +0 -54
- package/dist/packages/elements/src/elements/EFCaptions.cjs +0 -164
- package/dist/packages/elements/src/elements/EFCaptions.d.ts +0 -38
- package/dist/packages/elements/src/elements/EFCaptions.js +0 -166
- package/dist/packages/elements/src/elements/EFImage.cjs +0 -79
- package/dist/packages/elements/src/elements/EFImage.d.ts +0 -14
- package/dist/packages/elements/src/elements/EFImage.js +0 -80
- package/dist/packages/elements/src/elements/EFMedia.cjs +0 -336
- package/dist/packages/elements/src/elements/EFMedia.d.ts +0 -61
- package/dist/packages/elements/src/elements/EFMedia.js +0 -336
- package/dist/packages/elements/src/elements/EFSourceMixin.cjs +0 -55
- package/dist/packages/elements/src/elements/EFSourceMixin.d.ts +0 -12
- package/dist/packages/elements/src/elements/EFSourceMixin.js +0 -55
- package/dist/packages/elements/src/elements/EFTemporal.cjs +0 -199
- package/dist/packages/elements/src/elements/EFTemporal.d.ts +0 -38
- package/dist/packages/elements/src/elements/EFTemporal.js +0 -199
- package/dist/packages/elements/src/elements/EFTimegroup.browsertest.d.ts +0 -12
- package/dist/packages/elements/src/elements/EFTimegroup.cjs +0 -352
- package/dist/packages/elements/src/elements/EFTimegroup.d.ts +0 -39
- package/dist/packages/elements/src/elements/EFTimegroup.js +0 -353
- package/dist/packages/elements/src/elements/EFVideo.cjs +0 -109
- package/dist/packages/elements/src/elements/EFVideo.d.ts +0 -14
- package/dist/packages/elements/src/elements/EFVideo.js +0 -110
- package/dist/packages/elements/src/elements/EFWaveform.cjs +0 -242
- package/dist/packages/elements/src/elements/EFWaveform.d.ts +0 -30
- package/dist/packages/elements/src/elements/EFWaveform.js +0 -226
- package/dist/packages/elements/src/elements/FetchMixin.cjs +0 -28
- package/dist/packages/elements/src/elements/FetchMixin.d.ts +0 -8
- package/dist/packages/elements/src/elements/FetchMixin.js +0 -28
- package/dist/packages/elements/src/elements/TimegroupController.cjs +0 -20
- package/dist/packages/elements/src/elements/TimegroupController.d.ts +0 -14
- package/dist/packages/elements/src/elements/TimegroupController.js +0 -20
- package/dist/packages/elements/src/elements/durationConverter.cjs +0 -8
- package/dist/packages/elements/src/elements/durationConverter.d.ts +0 -4
- package/dist/packages/elements/src/elements/durationConverter.js +0 -8
- package/dist/packages/elements/src/elements/parseTimeToMs.cjs +0 -12
- package/dist/packages/elements/src/elements/parseTimeToMs.d.ts +0 -1
- package/dist/packages/elements/src/elements/parseTimeToMs.js +0 -12
- package/dist/packages/elements/src/elements/util.cjs +0 -11
- package/dist/packages/elements/src/elements/util.d.ts +0 -4
- package/dist/packages/elements/src/elements/util.js +0 -11
- package/dist/packages/elements/src/gui/EFFilmstrip.cjs +0 -825
- package/dist/packages/elements/src/gui/EFFilmstrip.d.ts +0 -147
- package/dist/packages/elements/src/gui/EFFilmstrip.js +0 -833
- package/dist/packages/elements/src/gui/EFWorkbench.cjs +0 -214
- package/dist/packages/elements/src/gui/EFWorkbench.d.ts +0 -45
- package/dist/packages/elements/src/gui/EFWorkbench.js +0 -215
- package/dist/packages/elements/src/gui/TWMixin.cjs +0 -28
- package/dist/packages/elements/src/gui/TWMixin.css.cjs +0 -3
- package/dist/packages/elements/src/gui/TWMixin.css.js +0 -4
- package/dist/packages/elements/src/gui/TWMixin.d.ts +0 -3
- package/dist/packages/elements/src/gui/TWMixin.js +0 -28
- package/dist/packages/elements/src/index.cjs +0 -50
- package/dist/packages/elements/src/index.d.ts +0 -10
- package/dist/packages/elements/src/index.js +0 -23
- package/dist/style.css +0 -791
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# @editframe/elements
|
|
2
|
+
|
|
3
|
+
## 0.7.0-beta.9
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#33](https://github.com/editframe/elements/pull/33) [`17c4452`](https://github.com/editframe/elements/commit/17c4452f679b042ac0accd9bf520728455e8cc2c) Thanks [@IliasHad](https://github.com/IliasHad)! - resolve lit global package issue
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@editframe/elements",
|
|
3
|
-
"version": "0.7.0-beta.
|
|
3
|
+
"version": "0.7.0-beta.9",
|
|
4
4
|
"description": "",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": {
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"author": "",
|
|
25
25
|
"license": "UNLICENSED",
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@editframe/assets": "0.7.0-beta.
|
|
27
|
+
"@editframe/assets": "0.7.0-beta.8",
|
|
28
28
|
"@lit/context": "^1.1.2",
|
|
29
29
|
"@lit/task": "^1.0.1",
|
|
30
30
|
"d3": "^7.9.0",
|
|
@@ -1,10 +1,49 @@
|
|
|
1
1
|
import debug from "debug";
|
|
2
2
|
import { TaskStatus } from "@lit/task";
|
|
3
|
-
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
3
|
+
|
|
4
|
+
import type { VideoRenderOptions } from "@editframe/assets";
|
|
5
|
+
import { awaitMicrotask } from "@/util/awaitMicrotask";
|
|
6
|
+
|
|
7
|
+
import { deepGetElementsWithFrameTasks } from "./elements/EFTemporal";
|
|
8
|
+
import { shallowGetTimegroups } from "./elements/EFTimegroup";
|
|
9
|
+
|
|
6
10
|
const log = debug("ef:elements:EF_FRAMEGEN");
|
|
11
|
+
|
|
12
|
+
declare global {
|
|
13
|
+
interface Window {
|
|
14
|
+
EF_FRAMEGEN?: EfFramegen;
|
|
15
|
+
FRAMEGEN_BRIDGE?: {
|
|
16
|
+
onInitialize: (
|
|
17
|
+
callback: (renderId: string, renderOptions: VideoRenderOptions) => void,
|
|
18
|
+
) => void;
|
|
19
|
+
|
|
20
|
+
initialized(renderId: string): void;
|
|
21
|
+
|
|
22
|
+
onBeginFrame(
|
|
23
|
+
callback: (
|
|
24
|
+
renderId: string,
|
|
25
|
+
frameNumber: number,
|
|
26
|
+
isLast: boolean,
|
|
27
|
+
) => void,
|
|
28
|
+
): void;
|
|
29
|
+
|
|
30
|
+
onTriggerCanvas(callback: () => void): void;
|
|
31
|
+
|
|
32
|
+
frameReady(
|
|
33
|
+
renderId: string,
|
|
34
|
+
frameNumber: number,
|
|
35
|
+
audioSamples: ArrayBuffer,
|
|
36
|
+
): void;
|
|
37
|
+
|
|
38
|
+
error(renderId: string, error: Error): void;
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
7
43
|
class TriggerCanvas {
|
|
44
|
+
private canvas: HTMLCanvasElement;
|
|
45
|
+
private ctx: CanvasRenderingContext2D;
|
|
46
|
+
|
|
8
47
|
constructor() {
|
|
9
48
|
this.canvas = document.createElement("canvas");
|
|
10
49
|
this.canvas.width = 1;
|
|
@@ -15,7 +54,7 @@ class TriggerCanvas {
|
|
|
15
54
|
left: "0px",
|
|
16
55
|
width: "1px",
|
|
17
56
|
height: "1px",
|
|
18
|
-
zIndex: "100000"
|
|
57
|
+
zIndex: "100000",
|
|
19
58
|
});
|
|
20
59
|
document.body.prepend(this.canvas);
|
|
21
60
|
const ctx = this.canvas.getContext("2d", { willReadFrequently: true });
|
|
@@ -23,54 +62,70 @@ class TriggerCanvas {
|
|
|
23
62
|
this.ctx = ctx;
|
|
24
63
|
this.ctx.fillStyle = "black";
|
|
25
64
|
}
|
|
65
|
+
|
|
26
66
|
trigger() {
|
|
27
67
|
log("TRIGGERING CANVAS");
|
|
28
68
|
this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
|
|
29
69
|
}
|
|
30
70
|
}
|
|
31
|
-
|
|
71
|
+
|
|
72
|
+
export class EfFramegen {
|
|
73
|
+
time = 0;
|
|
74
|
+
frameDurationMs = 0;
|
|
75
|
+
initialBusyTasks: Promise<unknown[]> = Promise.resolve([]);
|
|
76
|
+
audioBufferPromise?: Promise<AudioBuffer>;
|
|
77
|
+
renderOptions?: VideoRenderOptions;
|
|
78
|
+
frameBox = document.createElement("div");
|
|
79
|
+
BRIDGE = window.FRAMEGEN_BRIDGE;
|
|
80
|
+
triggerCanvas = new TriggerCanvas();
|
|
81
|
+
|
|
82
|
+
trace(...args: any[]) {
|
|
83
|
+
console.trace("[EF_FRAMEGEN]", ...args);
|
|
84
|
+
}
|
|
85
|
+
|
|
32
86
|
constructor() {
|
|
33
|
-
this.time = 0;
|
|
34
|
-
this.frameDurationMs = 0;
|
|
35
|
-
this.initialBusyTasks = Promise.resolve([]);
|
|
36
|
-
this.frameBox = document.createElement("div");
|
|
37
|
-
this.BRIDGE = window.FRAMEGEN_BRIDGE;
|
|
38
|
-
this.triggerCanvas = new TriggerCanvas();
|
|
39
87
|
if (this.BRIDGE) {
|
|
40
88
|
this.connectToBridge();
|
|
41
89
|
}
|
|
42
90
|
}
|
|
43
|
-
|
|
44
|
-
console.trace("[EF_FRAMEGEN]", ...args);
|
|
45
|
-
}
|
|
91
|
+
|
|
46
92
|
connectToBridge() {
|
|
47
93
|
const BRIDGE = this.BRIDGE;
|
|
48
94
|
if (!BRIDGE) {
|
|
49
95
|
throw new Error("No BRIDGE when attempting to connect to bridge");
|
|
50
96
|
}
|
|
97
|
+
|
|
51
98
|
BRIDGE.onInitialize(async (renderId, renderOptions) => {
|
|
52
99
|
log("BRIDGE.onInitialize", renderId, renderOptions);
|
|
53
100
|
await this.initialize(renderId, renderOptions);
|
|
54
101
|
BRIDGE.initialized(renderId);
|
|
55
102
|
});
|
|
103
|
+
|
|
56
104
|
BRIDGE.onBeginFrame((renderId, frameNumber, isLast) => {
|
|
57
105
|
log("BRIDGE.onBeginFrame", renderId, frameNumber, isLast);
|
|
58
106
|
this.beginFrame(renderId, frameNumber, isLast);
|
|
59
107
|
});
|
|
108
|
+
|
|
109
|
+
// BRIDGE.onTriggerCanvas(() => {
|
|
110
|
+
// // this.triggerCanvas.trigger();
|
|
111
|
+
// });
|
|
60
112
|
}
|
|
61
|
-
|
|
113
|
+
|
|
114
|
+
async initialize(renderId: string, renderOptions: VideoRenderOptions) {
|
|
62
115
|
addEventListener("unhandledrejection", (event) => {
|
|
63
116
|
this.trace("Unhandled rejection:", event.reason);
|
|
64
117
|
if (this.BRIDGE) {
|
|
65
118
|
this.BRIDGE.error(renderId, event.reason);
|
|
66
119
|
}
|
|
67
120
|
});
|
|
121
|
+
|
|
68
122
|
addEventListener("error", (event) => {
|
|
69
123
|
this.trace("Uncaught error", event.error);
|
|
70
124
|
if (this.BRIDGE) {
|
|
71
125
|
this.BRIDGE.error(renderId, event.error);
|
|
72
126
|
}
|
|
73
127
|
});
|
|
128
|
+
|
|
74
129
|
this.renderOptions = renderOptions;
|
|
75
130
|
const workbench = document.querySelector("ef-workbench");
|
|
76
131
|
if (!workbench) {
|
|
@@ -80,14 +135,21 @@ class EfFramegen {
|
|
|
80
135
|
const timegroups = shallowGetTimegroups(workbench);
|
|
81
136
|
const temporals = deepGetElementsWithFrameTasks(workbench);
|
|
82
137
|
const firstGroup = timegroups[0];
|
|
138
|
+
|
|
83
139
|
if (!firstGroup) {
|
|
84
140
|
throw new Error("No temporal elements found");
|
|
85
141
|
}
|
|
86
142
|
firstGroup.currentTimeMs = renderOptions.encoderOptions.fromMs;
|
|
87
|
-
|
|
143
|
+
|
|
144
|
+
this.frameDurationMs = 1000 / renderOptions.encoderOptions.video.framerate;
|
|
145
|
+
|
|
88
146
|
this.initialBusyTasks = Promise.all(
|
|
89
|
-
temporals
|
|
147
|
+
temporals
|
|
148
|
+
.filter((temporal) => temporal.frameTask.status < TaskStatus.COMPLETE)
|
|
149
|
+
.map((temporal) => temporal.frameTask)
|
|
150
|
+
.map((task) => task.taskComplete),
|
|
90
151
|
);
|
|
152
|
+
|
|
91
153
|
this.time = 0;
|
|
92
154
|
if (renderOptions.showFrameBox) {
|
|
93
155
|
Object.assign(this.frameBox.style, {
|
|
@@ -98,20 +160,21 @@ class EfFramegen {
|
|
|
98
160
|
position: "absolute",
|
|
99
161
|
top: "0px",
|
|
100
162
|
left: "0px",
|
|
101
|
-
zIndex: "100000"
|
|
163
|
+
zIndex: "100000",
|
|
102
164
|
});
|
|
103
165
|
document.body.prepend(this.frameBox);
|
|
104
166
|
}
|
|
167
|
+
|
|
105
168
|
this.audioBufferPromise = firstGroup.renderAudio(
|
|
106
|
-
renderOptions.encoderOptions.alignedFromUs /
|
|
107
|
-
renderOptions.encoderOptions.alignedToUs /
|
|
169
|
+
renderOptions.encoderOptions.alignedFromUs / 1000,
|
|
170
|
+
renderOptions.encoderOptions.alignedToUs / 1000,
|
|
108
171
|
// renderOptions.encoderOptions.fromMs,
|
|
109
172
|
// renderOptions.encoderOptions.toMs,
|
|
110
173
|
);
|
|
111
174
|
log("Initialized");
|
|
112
175
|
}
|
|
113
|
-
async beginFrame(renderId, frameNumber, isLast) {
|
|
114
|
-
if (this.renderOptions ===
|
|
176
|
+
async beginFrame(renderId: string, frameNumber: number, isLast: boolean) {
|
|
177
|
+
if (this.renderOptions === undefined) {
|
|
115
178
|
throw new Error("No renderOptions");
|
|
116
179
|
}
|
|
117
180
|
if (this.renderOptions.showFrameBox) {
|
|
@@ -131,40 +194,60 @@ class EfFramegen {
|
|
|
131
194
|
if (!firstGroup) {
|
|
132
195
|
throw new Error("No temporal elements found");
|
|
133
196
|
}
|
|
134
|
-
|
|
197
|
+
|
|
198
|
+
this.time =
|
|
199
|
+
this.renderOptions.encoderOptions.fromMs +
|
|
200
|
+
frameNumber * this.frameDurationMs;
|
|
201
|
+
|
|
135
202
|
firstGroup.currentTimeMs = this.time;
|
|
203
|
+
|
|
136
204
|
log("Awaiting initialBusyTasks");
|
|
137
205
|
await this.initialBusyTasks;
|
|
206
|
+
|
|
138
207
|
log("Awaiting microtask");
|
|
139
208
|
await awaitMicrotask();
|
|
209
|
+
|
|
140
210
|
log("Awaiting frame tasks");
|
|
141
211
|
const now = performance.now();
|
|
142
212
|
await Promise.all(
|
|
143
|
-
temporals
|
|
144
|
-
|
|
145
|
-
|
|
213
|
+
temporals
|
|
214
|
+
.filter((temporal) => temporal.frameTask.status < TaskStatus.COMPLETE)
|
|
215
|
+
.map((temporal) => {
|
|
216
|
+
return temporal.frameTask;
|
|
217
|
+
})
|
|
218
|
+
.map((task) => task.taskComplete),
|
|
146
219
|
);
|
|
220
|
+
|
|
147
221
|
log(`frame:${frameNumber} All tasks complete ${performance.now() - now}ms`);
|
|
222
|
+
|
|
148
223
|
if (isLast && this.audioBufferPromise) {
|
|
224
|
+
// Currently we emit the audio in one belch at the end of the render.
|
|
225
|
+
// This is not ideal, but it's the simplest thing that could possibly work.
|
|
226
|
+
// We could either emit it slices, or in parallel with the video.
|
|
227
|
+
// But in any case, it's fine for now.
|
|
149
228
|
const renderedAudio = await this.audioBufferPromise;
|
|
229
|
+
|
|
150
230
|
const channelCount = renderedAudio.numberOfChannels;
|
|
231
|
+
|
|
151
232
|
const interleavedSamples = new Float32Array(
|
|
152
|
-
channelCount * renderedAudio.length
|
|
233
|
+
channelCount * renderedAudio.length,
|
|
153
234
|
);
|
|
235
|
+
|
|
154
236
|
for (let i = 0; i < renderedAudio.length; i++) {
|
|
155
237
|
for (let j = 0; j < channelCount; j++) {
|
|
156
238
|
interleavedSamples.set(
|
|
157
239
|
renderedAudio.getChannelData(j).slice(i, i + 1),
|
|
158
|
-
i * channelCount + j
|
|
240
|
+
i * channelCount + j,
|
|
159
241
|
);
|
|
160
242
|
}
|
|
161
243
|
}
|
|
244
|
+
|
|
162
245
|
if (this.BRIDGE) {
|
|
163
246
|
this.triggerCanvas.trigger();
|
|
164
247
|
this.BRIDGE.frameReady(
|
|
165
248
|
renderId,
|
|
166
249
|
frameNumber,
|
|
167
|
-
interleavedSamples.buffer
|
|
250
|
+
interleavedSamples.buffer,
|
|
168
251
|
);
|
|
169
252
|
} else {
|
|
170
253
|
const fileReader = new FileReader();
|
|
@@ -191,7 +274,5 @@ class EfFramegen {
|
|
|
191
274
|
}
|
|
192
275
|
}
|
|
193
276
|
}
|
|
277
|
+
|
|
194
278
|
window.EF_FRAMEGEN = new EfFramegen();
|
|
195
|
-
export {
|
|
196
|
-
EfFramegen
|
|
197
|
-
};
|
package/src/elements.css
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
@tailwind base;
|
|
2
|
+
@tailwind components;
|
|
3
|
+
@tailwind utilities;
|
|
4
|
+
|
|
5
|
+
html {
|
|
6
|
+
@apply h-full w-full;
|
|
7
|
+
}
|
|
8
|
+
body {
|
|
9
|
+
@apply h-full w-full bg-black;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
:root {
|
|
13
|
+
font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;
|
|
14
|
+
line-height: 1.5;
|
|
15
|
+
font-weight: 400;
|
|
16
|
+
|
|
17
|
+
font-synthesis: none;
|
|
18
|
+
text-rendering: optimizeLegibility;
|
|
19
|
+
-webkit-font-smoothing: antialiased;
|
|
20
|
+
-moz-osx-font-smoothing: grayscale;
|
|
21
|
+
-webkit-text-size-adjust: 100%;
|
|
22
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import "./elements.css";
|
|
2
|
+
|
|
3
|
+
import "./elements/EFTimegroup";
|
|
4
|
+
export { EFTimegroup } from "./elements/EFTimegroup";
|
|
5
|
+
|
|
6
|
+
import "./elements/EFImage";
|
|
7
|
+
export { EFImage } from "./elements/EFImage";
|
|
8
|
+
|
|
9
|
+
import "./elements/EFMedia";
|
|
10
|
+
export type { EFMedia } from "./elements/EFMedia";
|
|
11
|
+
|
|
12
|
+
import "./elements/EFAudio";
|
|
13
|
+
export { EFAudio } from "./elements/EFAudio";
|
|
14
|
+
|
|
15
|
+
import "./elements/EFVideo";
|
|
16
|
+
export { EFVideo } from "./elements/EFVideo";
|
|
17
|
+
|
|
18
|
+
import "./elements/EFCaptions";
|
|
19
|
+
export { EFCaptions, EFCaptionsActiveWord } from "./elements/EFCaptions";
|
|
20
|
+
|
|
21
|
+
import "./elements/EFWaveform";
|
|
22
|
+
export { EFWaveform } from "./elements/EFWaveform";
|
|
23
|
+
|
|
24
|
+
import "./gui/EFWorkbench";
|
|
25
|
+
export { EFWorkbench } from "./gui/EFWorkbench";
|
|
26
|
+
|
|
27
|
+
import "./gui/EFFilmstrip";
|
|
28
|
+
export { EFFilmstrip } from "./gui/EFFilmstrip";
|
|
29
|
+
|
|
30
|
+
// @ts-expect-error
|
|
31
|
+
window.EF_REGISTERED = true;
|
|
32
|
+
|
|
33
|
+
import "./EF_FRAMEGEN";
|
package/tsconfig.json
ADDED