3dviewer-sdk 1.0.11 → 1.0.13
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/dist/index.d.mts +58 -15
- package/dist/index.d.ts +58 -15
- package/dist/index.js +189 -56
- package/dist/index.mjs +189 -56
- package/package.json +8 -3
- package/dist/contracts/events.d.ts +0 -97
- package/dist/contracts/events.js +0 -1
- package/dist/contracts/messages.d.ts +0 -159
- package/dist/contracts/messages.js +0 -50
- package/dist/core/emitter.d.ts +0 -7
- package/dist/core/emitter.js +0 -31
- package/dist/modules/camera.module.d.ts +0 -13
- package/dist/modules/camera.module.js +0 -18
- package/dist/modules/files.module.d.ts +0 -112
- package/dist/modules/files.module.js +0 -461
- package/dist/modules/interaction.module.d.ts +0 -28
- package/dist/modules/interaction.module.js +0 -63
- package/dist/modules/language.module.d.ts +0 -8
- package/dist/modules/language.module.js +0 -15
- package/dist/modules/markup.module.d.ts +0 -26
- package/dist/modules/markup.module.js +0 -96
- package/dist/modules/model-tree.module.d.ts +0 -12
- package/dist/modules/model-tree.module.js +0 -42
- package/dist/modules/node.module.d.ts +0 -11
- package/dist/modules/node.module.js +0 -6
- package/dist/modules/toolbar.module.d.ts +0 -93
- package/dist/modules/toolbar.module.js +0 -249
- package/dist/viewer.d.ts +0 -54
- package/dist/viewer.js +0 -290
package/dist/index.js
CHANGED
|
@@ -147,6 +147,8 @@ var NodeModule = class {
|
|
|
147
147
|
// src/modules/files.module.ts
|
|
148
148
|
var DEFAULT_API_BASE_URL = "https://dev.3dviewer.anybim.vn";
|
|
149
149
|
var DEFAULT_VIEWER_ORIGIN = "http://localhost:3000";
|
|
150
|
+
var SDK_VIEWER_PATH = "/mainviewer-sdk";
|
|
151
|
+
var LEGACY_VIEWER_PATH = "/mainviewer";
|
|
150
152
|
var FilesModule = class {
|
|
151
153
|
constructor(viewer) {
|
|
152
154
|
this.viewer = viewer;
|
|
@@ -296,7 +298,7 @@ var FilesModule = class {
|
|
|
296
298
|
const raw = this.config.baseUrl || this.viewer.getOptions().baseUrl || DEFAULT_API_BASE_URL;
|
|
297
299
|
return this.normalizeBaseUrl(raw);
|
|
298
300
|
}
|
|
299
|
-
// Resolve viewer route path
|
|
301
|
+
// Resolve viewer route path for all SDK flows.
|
|
300
302
|
resolveViewerPath() {
|
|
301
303
|
const configuredPath = this.config.viewerPath || this.viewer.getOptions().viewerPath;
|
|
302
304
|
if (!configuredPath) {
|
|
@@ -304,28 +306,32 @@ var FilesModule = class {
|
|
|
304
306
|
if (viewerUrl) {
|
|
305
307
|
try {
|
|
306
308
|
const pathname = new URL(viewerUrl, window.location.href).pathname;
|
|
307
|
-
if (pathname && pathname !== "/") return pathname;
|
|
309
|
+
if (pathname && pathname !== "/") return this.normalizeSdkViewerPath(pathname);
|
|
308
310
|
} catch {
|
|
309
311
|
}
|
|
310
312
|
}
|
|
311
313
|
}
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
314
|
+
return this.normalizeSdkViewerPath(configuredPath || SDK_VIEWER_PATH);
|
|
315
|
+
}
|
|
316
|
+
normalizeSdkViewerPath(path) {
|
|
317
|
+
const p = path.trim();
|
|
318
|
+
if (!p || p === LEGACY_VIEWER_PATH) return SDK_VIEWER_PATH;
|
|
319
|
+
const normalized = p.startsWith("/") ? p : `/${p}`;
|
|
320
|
+
return normalized === LEGACY_VIEWER_PATH ? SDK_VIEWER_PATH : normalized;
|
|
315
321
|
}
|
|
316
322
|
// Viewer host used to open iframe after conversion completes.
|
|
317
323
|
resolveViewerOrigin() {
|
|
318
|
-
const
|
|
319
|
-
if (
|
|
324
|
+
const viewerUrl = this.viewer.getOptions().url;
|
|
325
|
+
if (viewerUrl) {
|
|
320
326
|
try {
|
|
321
|
-
return this.normalizeBaseUrl(new URL(
|
|
327
|
+
return this.normalizeBaseUrl(new URL(viewerUrl, window.location.href).origin);
|
|
322
328
|
} catch {
|
|
323
329
|
}
|
|
324
330
|
}
|
|
325
|
-
const
|
|
326
|
-
if (
|
|
331
|
+
const configuredBaseUrl = this.config.baseUrl || this.viewer.getOptions().baseUrl;
|
|
332
|
+
if (configuredBaseUrl) {
|
|
327
333
|
try {
|
|
328
|
-
return this.normalizeBaseUrl(new URL(
|
|
334
|
+
return this.normalizeBaseUrl(new URL(configuredBaseUrl, window.location.href).origin);
|
|
329
335
|
} catch {
|
|
330
336
|
}
|
|
331
337
|
}
|
|
@@ -334,6 +340,11 @@ var FilesModule = class {
|
|
|
334
340
|
// Build conversion service root from API base URL.
|
|
335
341
|
resolveHostConversion() {
|
|
336
342
|
const baseUrl = this.resolveBaseUrl();
|
|
343
|
+
try {
|
|
344
|
+
const parsed = new URL(baseUrl, window.location.href);
|
|
345
|
+
if (parsed.hostname.includes("conversion")) return baseUrl;
|
|
346
|
+
} catch {
|
|
347
|
+
}
|
|
337
348
|
return baseUrl.endsWith("/service/conversion") ? baseUrl : `${baseUrl}/service/conversion`;
|
|
338
349
|
}
|
|
339
350
|
// Resolve upload path sent to conversion APIs.
|
|
@@ -486,16 +497,16 @@ var FilesModule = class {
|
|
|
486
497
|
}
|
|
487
498
|
// Submit conversion request to the newer downloadUrl-based endpoint.
|
|
488
499
|
async cacheFileV2(options) {
|
|
500
|
+
var _a;
|
|
489
501
|
const hostConversion = await this.resolveHostConversion();
|
|
490
502
|
const params = new URLSearchParams();
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
}
|
|
503
|
+
params.set("overwrite", String((_a = options.overwrite) != null ? _a : true));
|
|
504
|
+
params.set("ignore_line_weight", "1");
|
|
494
505
|
if (options.project) {
|
|
495
506
|
params.set("project", options.project);
|
|
496
507
|
}
|
|
497
508
|
const query = params.toString();
|
|
498
|
-
const url = `${hostConversion}/api/StreamFile
|
|
509
|
+
const url = `${hostConversion}/api/StreamFile${query ? `?${query}` : ""}`;
|
|
499
510
|
const payload = this.buildConvertV2Payload(options);
|
|
500
511
|
const response = await fetch(url, {
|
|
501
512
|
method: "POST",
|
|
@@ -583,8 +594,8 @@ var FilesModule = class {
|
|
|
583
594
|
};
|
|
584
595
|
|
|
585
596
|
// src/modules/toolbar.module.ts
|
|
586
|
-
function createRequestId() {
|
|
587
|
-
return
|
|
597
|
+
function createRequestId(prefix) {
|
|
598
|
+
return `${prefix}_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;
|
|
588
599
|
}
|
|
589
600
|
var ALL_3D_TOOLBAR_OPERATORS = [
|
|
590
601
|
"home",
|
|
@@ -670,90 +681,78 @@ var ToolbarModule = class {
|
|
|
670
681
|
enableAllPdf() {
|
|
671
682
|
this.clearDisabledPdf();
|
|
672
683
|
}
|
|
673
|
-
|
|
674
|
-
this.
|
|
675
|
-
}
|
|
676
|
-
showToolbar() {
|
|
677
|
-
this.setToolbarVisible(true);
|
|
678
|
-
}
|
|
679
|
-
setToolbarVisible(visible, target = "all") {
|
|
680
|
-
this.postToolbarVisibility({ visible, target });
|
|
681
|
-
}
|
|
682
|
-
hideLeftToolbar() {
|
|
683
|
-
this.setToolbarVisible(false, "left");
|
|
684
|
-
}
|
|
685
|
-
showLeftToolbar() {
|
|
686
|
-
this.setToolbarVisible(true, "left");
|
|
684
|
+
useToolbar(target = "all") {
|
|
685
|
+
this.postToolbarUse({ target });
|
|
687
686
|
}
|
|
688
|
-
|
|
689
|
-
this.
|
|
687
|
+
useLeftToolbar() {
|
|
688
|
+
this.useToolbar("left");
|
|
690
689
|
}
|
|
691
|
-
|
|
692
|
-
this.
|
|
690
|
+
useCenterToolbar() {
|
|
691
|
+
this.useToolbar("center");
|
|
693
692
|
}
|
|
694
|
-
|
|
695
|
-
this.
|
|
693
|
+
useRightToolbar() {
|
|
694
|
+
this.useToolbar("right");
|
|
696
695
|
}
|
|
697
|
-
|
|
698
|
-
this.
|
|
696
|
+
usePanel(panel, format) {
|
|
697
|
+
this.postPanelOpen({ panel, format });
|
|
699
698
|
}
|
|
700
699
|
openClippingPlanes() {
|
|
701
|
-
this.
|
|
700
|
+
this.usePanel("clipping-commands", "3d");
|
|
702
701
|
}
|
|
703
702
|
closeClippingPlanes() {
|
|
704
703
|
this.postPanelClose({ panel: "clipping-commands", format: "3d" });
|
|
705
704
|
}
|
|
706
705
|
openSetting() {
|
|
707
|
-
this.
|
|
706
|
+
this.usePanel("setting");
|
|
708
707
|
}
|
|
709
708
|
closeSetting() {
|
|
710
709
|
this.postPanelClose({ panel: "setting" });
|
|
711
710
|
}
|
|
712
711
|
openSetting3D() {
|
|
713
|
-
this.
|
|
712
|
+
this.usePanel("setting", "3d");
|
|
714
713
|
}
|
|
715
714
|
closeSetting3D() {
|
|
716
715
|
this.postPanelClose({ panel: "setting", format: "3d" });
|
|
717
716
|
}
|
|
718
717
|
openSettingPdf() {
|
|
719
|
-
this.
|
|
718
|
+
this.usePanel("setting", "pdf");
|
|
720
719
|
}
|
|
721
720
|
closeSettingPdf() {
|
|
722
721
|
this.postPanelClose({ panel: "setting", format: "pdf" });
|
|
723
722
|
}
|
|
724
723
|
openStatesObjects() {
|
|
725
|
-
this.
|
|
724
|
+
this.usePanel("statesObjects", "3d");
|
|
726
725
|
}
|
|
727
726
|
closeStatesObjects() {
|
|
728
727
|
this.postPanelClose({ panel: "statesObjects", format: "3d" });
|
|
729
728
|
}
|
|
730
729
|
openLinkedObjects() {
|
|
731
|
-
this.
|
|
730
|
+
this.usePanel("linkedObjects", "3d");
|
|
732
731
|
}
|
|
733
732
|
closeLinkedObjects() {
|
|
734
733
|
this.postPanelClose({ panel: "linkedObjects", format: "3d" });
|
|
735
734
|
}
|
|
736
735
|
openModelTree() {
|
|
737
|
-
this.
|
|
736
|
+
this.usePanel("model-tree", "3d");
|
|
738
737
|
}
|
|
739
738
|
closeModelTree() {
|
|
740
739
|
this.postPanelClose({ panel: "model-tree", format: "3d" });
|
|
741
740
|
}
|
|
742
741
|
openObjectProperties() {
|
|
743
|
-
this.
|
|
742
|
+
this.usePanel("object-properties", "3d");
|
|
744
743
|
}
|
|
745
744
|
closeObjectProperties() {
|
|
746
745
|
this.postPanelClose({ panel: "object-properties", format: "3d" });
|
|
747
746
|
}
|
|
748
747
|
openSheets() {
|
|
749
|
-
this.
|
|
748
|
+
this.usePanel("sheets", "3d");
|
|
750
749
|
}
|
|
751
750
|
closeSheets() {
|
|
752
751
|
this.postPanelClose({ panel: "sheets", format: "3d" });
|
|
753
752
|
}
|
|
754
753
|
getSheets(options) {
|
|
755
754
|
var _a;
|
|
756
|
-
const requestId = createRequestId();
|
|
755
|
+
const requestId = createRequestId("sheets");
|
|
757
756
|
const timeoutMs = Math.max(1e3, (_a = options == null ? void 0 : options.timeoutMs) != null ? _a : 1e4);
|
|
758
757
|
return new Promise((resolve, reject) => {
|
|
759
758
|
const timer = setTimeout(() => {
|
|
@@ -769,6 +768,60 @@ var ToolbarModule = class {
|
|
|
769
768
|
this.postSheetsGetList({ requestId });
|
|
770
769
|
});
|
|
771
770
|
}
|
|
771
|
+
getObjectProperties(options) {
|
|
772
|
+
var _a;
|
|
773
|
+
const requestId = createRequestId("object_properties");
|
|
774
|
+
const timeoutMs = Math.max(1e3, (_a = options == null ? void 0 : options.timeoutMs) != null ? _a : 1e4);
|
|
775
|
+
return new Promise((resolve, reject) => {
|
|
776
|
+
const timer = setTimeout(() => {
|
|
777
|
+
off();
|
|
778
|
+
reject(new Error("Timeout while getting object properties list from viewer"));
|
|
779
|
+
}, timeoutMs);
|
|
780
|
+
const off = this.viewer._on("object-properties:list", (payload) => {
|
|
781
|
+
if (payload.requestId !== requestId) return;
|
|
782
|
+
clearTimeout(timer);
|
|
783
|
+
off();
|
|
784
|
+
resolve(payload.properties);
|
|
785
|
+
});
|
|
786
|
+
this.postObjectPropertiesGetList({ requestId });
|
|
787
|
+
});
|
|
788
|
+
}
|
|
789
|
+
getLinkedObjects(options) {
|
|
790
|
+
var _a;
|
|
791
|
+
const requestId = createRequestId("linked_objects");
|
|
792
|
+
const timeoutMs = Math.max(1e3, (_a = options == null ? void 0 : options.timeoutMs) != null ? _a : 1e4);
|
|
793
|
+
return new Promise((resolve, reject) => {
|
|
794
|
+
const timer = setTimeout(() => {
|
|
795
|
+
off();
|
|
796
|
+
reject(new Error("Timeout while getting linked objects list from viewer"));
|
|
797
|
+
}, timeoutMs);
|
|
798
|
+
const off = this.viewer._on("linked-objects:list", (payload) => {
|
|
799
|
+
if (payload.requestId !== requestId) return;
|
|
800
|
+
clearTimeout(timer);
|
|
801
|
+
off();
|
|
802
|
+
resolve(payload.linkedObjects);
|
|
803
|
+
});
|
|
804
|
+
this.postLinkedObjectsGetList({ requestId });
|
|
805
|
+
});
|
|
806
|
+
}
|
|
807
|
+
getStatesObjects(options) {
|
|
808
|
+
var _a;
|
|
809
|
+
const requestId = createRequestId("states_objects");
|
|
810
|
+
const timeoutMs = Math.max(1e3, (_a = options == null ? void 0 : options.timeoutMs) != null ? _a : 1e4);
|
|
811
|
+
return new Promise((resolve, reject) => {
|
|
812
|
+
const timer = setTimeout(() => {
|
|
813
|
+
off();
|
|
814
|
+
reject(new Error("Timeout while getting states objects list from viewer"));
|
|
815
|
+
}, timeoutMs);
|
|
816
|
+
const off = this.viewer._on("states-objects:list", (payload) => {
|
|
817
|
+
if (payload.requestId !== requestId) return;
|
|
818
|
+
clearTimeout(timer);
|
|
819
|
+
off();
|
|
820
|
+
resolve(payload.statesObjects);
|
|
821
|
+
});
|
|
822
|
+
this.postStatesObjectsGetList({ requestId });
|
|
823
|
+
});
|
|
824
|
+
}
|
|
772
825
|
applySheet(sheetId) {
|
|
773
826
|
this.postSheetsApply({ sheetId });
|
|
774
827
|
}
|
|
@@ -811,8 +864,8 @@ var ToolbarModule = class {
|
|
|
811
864
|
postConfig(payload) {
|
|
812
865
|
this.viewer.postToViewer("viewer-toolbar-config" /* TOOLBAR_CONFIG */, payload);
|
|
813
866
|
}
|
|
814
|
-
|
|
815
|
-
this.viewer.postToViewer("viewer-toolbar-
|
|
867
|
+
postToolbarUse(payload) {
|
|
868
|
+
this.viewer.postToViewer("viewer-toolbar-use" /* TOOLBAR_USE */, payload);
|
|
816
869
|
}
|
|
817
870
|
postPanelOpen(payload) {
|
|
818
871
|
this.viewer.postToViewer("viewer-panel-open" /* PANEL_OPEN */, payload);
|
|
@@ -829,6 +882,15 @@ var ToolbarModule = class {
|
|
|
829
882
|
postSheetsApply(payload) {
|
|
830
883
|
this.viewer.postToViewer("viewer-sheets-apply" /* SHEETS_APPLY */, payload);
|
|
831
884
|
}
|
|
885
|
+
postObjectPropertiesGetList(payload) {
|
|
886
|
+
this.viewer.postToViewer("viewer-object-properties-get-list" /* OBJECT_PROPERTIES_GET_LIST */, payload);
|
|
887
|
+
}
|
|
888
|
+
postLinkedObjectsGetList(payload) {
|
|
889
|
+
this.viewer.postToViewer("viewer-linked-objects-get-list" /* LINKED_OBJECTS_GET_LIST */, payload);
|
|
890
|
+
}
|
|
891
|
+
postStatesObjectsGetList(payload) {
|
|
892
|
+
this.viewer.postToViewer("viewer-states-objects-get-list" /* STATES_OBJECTS_GET_LIST */, payload);
|
|
893
|
+
}
|
|
832
894
|
};
|
|
833
895
|
|
|
834
896
|
// src/modules/model-tree.module.ts
|
|
@@ -985,6 +1047,8 @@ var LanguageModule = class {
|
|
|
985
1047
|
};
|
|
986
1048
|
|
|
987
1049
|
// src/viewer.ts
|
|
1050
|
+
var SDK_VIEWER_PATH2 = "/mainviewer-sdk";
|
|
1051
|
+
var LEGACY_VIEWER_PATH2 = "/mainviewer";
|
|
988
1052
|
var Viewer3D = class {
|
|
989
1053
|
constructor(options) {
|
|
990
1054
|
this.options = options;
|
|
@@ -1089,6 +1153,54 @@ var Viewer3D = class {
|
|
|
1089
1153
|
});
|
|
1090
1154
|
break;
|
|
1091
1155
|
}
|
|
1156
|
+
case "viewer-object-properties-list" /* OBJECT_PROPERTIES_LIST */: {
|
|
1157
|
+
const payload = data.payload;
|
|
1158
|
+
if (!payload || !payload.requestId || !Array.isArray(payload.properties)) break;
|
|
1159
|
+
this._emit("object-properties:list", {
|
|
1160
|
+
requestId: String(payload.requestId),
|
|
1161
|
+
properties: payload.properties.filter((item) => item && typeof item === "object").map((item) => ({ ...item })),
|
|
1162
|
+
timestamp: Number(payload.timestamp) || Date.now()
|
|
1163
|
+
});
|
|
1164
|
+
break;
|
|
1165
|
+
}
|
|
1166
|
+
case "viewer-linked-objects-list" /* LINKED_OBJECTS_LIST */: {
|
|
1167
|
+
const payload = data.payload;
|
|
1168
|
+
if (!payload || !payload.requestId || !Array.isArray(payload.linkedObjects)) break;
|
|
1169
|
+
this._emit("linked-objects:list", {
|
|
1170
|
+
requestId: String(payload.requestId),
|
|
1171
|
+
linkedObjects: payload.linkedObjects.filter((item) => item && typeof item === "object").map((item) => ({ ...item })),
|
|
1172
|
+
timestamp: Number(payload.timestamp) || Date.now()
|
|
1173
|
+
});
|
|
1174
|
+
break;
|
|
1175
|
+
}
|
|
1176
|
+
case "viewer-states-objects-list" /* STATES_OBJECTS_LIST */: {
|
|
1177
|
+
const payload = data.payload;
|
|
1178
|
+
if (!payload || !payload.requestId || !Array.isArray(payload.statesObjects)) break;
|
|
1179
|
+
this._emit("states-objects:list", {
|
|
1180
|
+
requestId: String(payload.requestId),
|
|
1181
|
+
statesObjects: payload.statesObjects.map((item) => {
|
|
1182
|
+
var _a2, _b2, _c2, _d2, _e, _f, _g;
|
|
1183
|
+
return {
|
|
1184
|
+
id: String((_a2 = item.id) != null ? _a2 : ""),
|
|
1185
|
+
name: String((_b2 = item.name) != null ? _b2 : ""),
|
|
1186
|
+
char: String((_c2 = item.char) != null ? _c2 : ""),
|
|
1187
|
+
object: Array.isArray(item.object) ? item.object.map((objectItem) => {
|
|
1188
|
+
var _a3;
|
|
1189
|
+
return {
|
|
1190
|
+
name: String((_a3 = objectItem == null ? void 0 : objectItem.name) != null ? _a3 : ""),
|
|
1191
|
+
id: Number(objectItem == null ? void 0 : objectItem.id) || 0
|
|
1192
|
+
};
|
|
1193
|
+
}) : [],
|
|
1194
|
+
states: {
|
|
1195
|
+
color: String((_e = (_d2 = item.states) == null ? void 0 : _d2.color) != null ? _e : ""),
|
|
1196
|
+
type: String((_g = (_f = item.states) == null ? void 0 : _f.type) != null ? _g : "")
|
|
1197
|
+
}
|
|
1198
|
+
};
|
|
1199
|
+
}),
|
|
1200
|
+
timestamp: Number(payload.timestamp) || Date.now()
|
|
1201
|
+
});
|
|
1202
|
+
break;
|
|
1203
|
+
}
|
|
1092
1204
|
case "viewer-markup-list" /* MARKUP_LIST */: {
|
|
1093
1205
|
const payload = data.payload;
|
|
1094
1206
|
if (!payload || !payload.requestId || !Array.isArray(payload.markups)) break;
|
|
@@ -1208,18 +1320,39 @@ var Viewer3D = class {
|
|
|
1208
1320
|
if (!this.initialized) throw new Error("Call viewer.init() before using viewer");
|
|
1209
1321
|
}
|
|
1210
1322
|
withInitialOptions(url) {
|
|
1211
|
-
if (!this.options.initialToolbarVisibility) return url;
|
|
1212
1323
|
try {
|
|
1213
1324
|
const parsedUrl = new URL(url, window.location.href);
|
|
1214
|
-
parsedUrl.
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
);
|
|
1325
|
+
if (parsedUrl.pathname === LEGACY_VIEWER_PATH2) {
|
|
1326
|
+
parsedUrl.pathname = SDK_VIEWER_PATH2;
|
|
1327
|
+
}
|
|
1328
|
+
const initialToolbar = this.normalizeInitialToolbar();
|
|
1329
|
+
if (initialToolbar) {
|
|
1330
|
+
parsedUrl.searchParams.set("useToolbar", JSON.stringify(initialToolbar));
|
|
1331
|
+
}
|
|
1218
1332
|
return parsedUrl.toString();
|
|
1219
1333
|
} catch {
|
|
1220
1334
|
return url;
|
|
1221
1335
|
}
|
|
1222
1336
|
}
|
|
1337
|
+
normalizeInitialToolbar() {
|
|
1338
|
+
const initialToolbar = this.options.initialToolbar;
|
|
1339
|
+
if (!initialToolbar) return null;
|
|
1340
|
+
if (typeof initialToolbar === "string") {
|
|
1341
|
+
return { [initialToolbar]: true };
|
|
1342
|
+
}
|
|
1343
|
+
if (Array.isArray(initialToolbar)) {
|
|
1344
|
+
return initialToolbar.reduce((result, target) => {
|
|
1345
|
+
result[target] = true;
|
|
1346
|
+
return result;
|
|
1347
|
+
}, {});
|
|
1348
|
+
}
|
|
1349
|
+
const entries = Object.entries(initialToolbar).filter(([, enabled]) => enabled === true);
|
|
1350
|
+
if (entries.length === 0) return null;
|
|
1351
|
+
return entries.reduce((result, [target]) => {
|
|
1352
|
+
result[target] = true;
|
|
1353
|
+
return result;
|
|
1354
|
+
}, {});
|
|
1355
|
+
}
|
|
1223
1356
|
// ===== typed internal events used by modules =====
|
|
1224
1357
|
_on(event, cb) {
|
|
1225
1358
|
return this.emitter.on(event, cb);
|