piral-debug-utils 0.13.7 → 0.14.0-alpha.3154
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/esm/DebugTracker.d.ts +3 -1
- package/esm/DebugTracker.js +4 -4
- package/esm/DebugTracker.js.map +1 -1
- package/esm/ExtensionCatalogue.d.ts +2 -0
- package/esm/ExtensionCatalogue.js +11 -0
- package/esm/ExtensionCatalogue.js.map +1 -0
- package/esm/VisualizationWrapper.d.ts +5 -2
- package/esm/VisualizationWrapper.js +31 -27
- package/esm/VisualizationWrapper.js.map +1 -1
- package/esm/debug.js +175 -121
- package/esm/debug.js.map +1 -1
- package/esm/decycle.d.ts +1 -0
- package/esm/decycle.js +53 -0
- package/esm/decycle.js.map +1 -0
- package/esm/emulator.d.ts +2 -7
- package/esm/emulator.js +6 -3
- package/esm/emulator.js.map +1 -1
- package/esm/index.d.ts +1 -0
- package/esm/index.js +1 -0
- package/esm/index.js.map +1 -1
- package/esm/state.d.ts +26 -0
- package/esm/state.js +55 -0
- package/esm/state.js.map +1 -0
- package/esm/types.d.ts +52 -20
- package/lib/DebugTracker.d.ts +3 -1
- package/lib/DebugTracker.js +5 -5
- package/lib/DebugTracker.js.map +1 -1
- package/lib/ExtensionCatalogue.d.ts +2 -0
- package/lib/ExtensionCatalogue.js +15 -0
- package/lib/ExtensionCatalogue.js.map +1 -0
- package/lib/VisualizationWrapper.d.ts +5 -2
- package/lib/VisualizationWrapper.js +31 -27
- package/lib/VisualizationWrapper.js.map +1 -1
- package/lib/debug.js +175 -121
- package/lib/debug.js.map +1 -1
- package/lib/decycle.d.ts +1 -0
- package/lib/decycle.js +57 -0
- package/lib/decycle.js.map +1 -0
- package/lib/emulator.d.ts +2 -7
- package/lib/emulator.js +7 -4
- package/lib/emulator.js.map +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/lib/state.d.ts +26 -0
- package/lib/state.js +62 -0
- package/lib/state.js.map +1 -0
- package/lib/types.d.ts +52 -20
- package/package.json +6 -4
- package/src/DebugTracker.tsx +7 -5
- package/src/ExtensionCatalogue.tsx +18 -0
- package/src/VisualizationWrapper.tsx +34 -26
- package/src/debug.ts +208 -147
- package/src/decycle.ts +55 -0
- package/src/elements.d.ts +10 -0
- package/src/emulator.ts +10 -11
- package/src/index.ts +1 -0
- package/src/state.ts +79 -0
- package/src/types.ts +56 -17
package/src/debug.ts
CHANGED
|
@@ -1,35 +1,77 @@
|
|
|
1
|
-
import { isfunc } from 'piral-base';
|
|
2
1
|
import { DebugTracker } from './DebugTracker';
|
|
3
2
|
import { VisualizationWrapper } from './VisualizationWrapper';
|
|
4
|
-
import {
|
|
3
|
+
import { ExtensionCatalogue } from './ExtensionCatalogue';
|
|
4
|
+
import { decycle } from './decycle';
|
|
5
|
+
import { setState, initialSettings } from './state';
|
|
6
|
+
import { DebugCustomSetting, DebuggerOptions } from './types';
|
|
5
7
|
|
|
6
8
|
export function installPiralDebug(options: DebuggerOptions) {
|
|
7
|
-
const {
|
|
9
|
+
const {
|
|
10
|
+
injectPilet,
|
|
11
|
+
getGlobalState,
|
|
12
|
+
getExtensions,
|
|
13
|
+
getDependencies,
|
|
14
|
+
getRoutes,
|
|
15
|
+
getPilets,
|
|
16
|
+
setPilets,
|
|
17
|
+
fireEvent,
|
|
18
|
+
integrate,
|
|
19
|
+
createApi,
|
|
20
|
+
loadPilet,
|
|
21
|
+
customSettings = {},
|
|
22
|
+
} = options;
|
|
23
|
+
const events = [];
|
|
24
|
+
const legacyBrowser = !new Error().stack;
|
|
25
|
+
const excludedRoutes = [initialSettings.cataloguePath];
|
|
8
26
|
const selfSource = 'piral-debug-api';
|
|
9
27
|
const debugApiVersion = 'v1';
|
|
10
|
-
const settings = {
|
|
28
|
+
const settings: Record<string, DebugCustomSetting> = {
|
|
29
|
+
...customSettings,
|
|
11
30
|
viewState: {
|
|
12
|
-
value:
|
|
31
|
+
value: initialSettings.viewState,
|
|
13
32
|
type: 'boolean',
|
|
14
33
|
label: 'State container logging',
|
|
34
|
+
onChange(value) {
|
|
35
|
+
sessionStorage.setItem('dbg:view-state', value ? 'on' : 'off');
|
|
36
|
+
},
|
|
15
37
|
},
|
|
16
38
|
loadPilets: {
|
|
17
|
-
value:
|
|
39
|
+
value: initialSettings.loadPilets,
|
|
18
40
|
type: 'boolean',
|
|
19
41
|
label: 'Load available pilets',
|
|
42
|
+
onChange(value) {
|
|
43
|
+
sessionStorage.setItem('dbg:load-pilets', value ? 'on' : 'off');
|
|
44
|
+
},
|
|
20
45
|
},
|
|
21
46
|
hardRefresh: {
|
|
22
|
-
value:
|
|
47
|
+
value: initialSettings.hardRefresh,
|
|
23
48
|
type: 'boolean',
|
|
24
49
|
label: 'Full refresh on change',
|
|
50
|
+
onChange(value) {
|
|
51
|
+
sessionStorage.setItem('dbg:hard-refresh', value ? 'on' : 'off');
|
|
52
|
+
},
|
|
25
53
|
},
|
|
26
54
|
viewOrigins: {
|
|
27
|
-
value:
|
|
55
|
+
value: initialSettings.viewOrigins,
|
|
28
56
|
type: 'boolean',
|
|
29
57
|
label: 'Visualize component origins',
|
|
58
|
+
onChange(value, prev) {
|
|
59
|
+
sessionStorage.setItem('dbg:view-origins', value ? 'on' : 'off');
|
|
60
|
+
|
|
61
|
+
if (prev !== value) {
|
|
62
|
+
updateVisualize(value);
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
extensionCatalogue: {
|
|
67
|
+
value: initialSettings.extensionCatalogue,
|
|
68
|
+
type: 'boolean',
|
|
69
|
+
label: 'Enable extension catalogue',
|
|
70
|
+
onChange(value) {
|
|
71
|
+
sessionStorage.setItem('dbg:extension-catalogue', value ? 'on' : 'off');
|
|
72
|
+
},
|
|
30
73
|
},
|
|
31
74
|
};
|
|
32
|
-
const events = [];
|
|
33
75
|
|
|
34
76
|
const sendMessage = (content: any) => {
|
|
35
77
|
window.postMessage(
|
|
@@ -42,79 +84,84 @@ export function installPiralDebug(options: DebuggerOptions) {
|
|
|
42
84
|
);
|
|
43
85
|
};
|
|
44
86
|
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
const sendCurrentRoutes = (pages: Record<string, any>, routes: Record<string, any>) => {
|
|
64
|
-
const registeredRoutes = Object.keys(pages);
|
|
65
|
-
const componentRoutes = Object.keys(routes);
|
|
66
|
-
sendMessage({
|
|
67
|
-
type: 'routes',
|
|
68
|
-
routes: [...componentRoutes, ...registeredRoutes],
|
|
69
|
-
});
|
|
70
|
-
};
|
|
87
|
+
const getSettings = () => {
|
|
88
|
+
return Object.keys(settings).reduce((obj, key) => {
|
|
89
|
+
const setting = settings[key];
|
|
90
|
+
|
|
91
|
+
if (
|
|
92
|
+
setting &&
|
|
93
|
+
typeof setting === 'object' &&
|
|
94
|
+
typeof setting.label === 'string' &&
|
|
95
|
+
typeof setting.type === 'string' &&
|
|
96
|
+
['boolean', 'string', 'number'].includes(typeof setting.value)
|
|
97
|
+
) {
|
|
98
|
+
obj[key] = {
|
|
99
|
+
label: setting.label,
|
|
100
|
+
value: setting.value,
|
|
101
|
+
type: setting.type,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
71
104
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
sessionStorage.setItem(key, value ? 'on' : 'off');
|
|
105
|
+
return obj;
|
|
106
|
+
}, {});
|
|
75
107
|
};
|
|
76
108
|
|
|
77
109
|
const updateSettings = (values: Record<string, any>) => {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
110
|
+
Object.keys(values).forEach((key) => {
|
|
111
|
+
const setting = settings[key];
|
|
112
|
+
|
|
113
|
+
switch (setting.type) {
|
|
114
|
+
case 'boolean': {
|
|
115
|
+
const prev = setting.value;
|
|
116
|
+
const value = values[key];
|
|
117
|
+
setting.value = value;
|
|
118
|
+
setting.onChange(value, prev);
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
case 'number': {
|
|
122
|
+
const prev = setting.value;
|
|
123
|
+
const value = values[key];
|
|
124
|
+
setting.value = value;
|
|
125
|
+
setting.onChange(value, prev);
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
case 'string': {
|
|
129
|
+
const prev = setting.value;
|
|
130
|
+
const value = values[key];
|
|
131
|
+
setting.value = value;
|
|
132
|
+
setting.onChange(value, prev);
|
|
133
|
+
break;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
});
|
|
88
137
|
|
|
89
138
|
sendMessage({
|
|
90
|
-
settings,
|
|
139
|
+
settings: getSettings(),
|
|
91
140
|
type: 'settings',
|
|
92
141
|
});
|
|
93
142
|
};
|
|
94
143
|
|
|
95
144
|
const togglePilet = (name: string) => {
|
|
96
|
-
const pilet: any =
|
|
145
|
+
const pilet: any = getPilets().find((m) => m.name === name);
|
|
97
146
|
|
|
98
147
|
if (pilet.disabled) {
|
|
99
148
|
try {
|
|
100
149
|
const { createApi } = options;
|
|
101
150
|
const newApi = createApi(pilet);
|
|
102
|
-
|
|
151
|
+
injectPilet(pilet.original);
|
|
103
152
|
pilet.original.setup(newApi);
|
|
104
153
|
} catch (error) {
|
|
105
154
|
console.error(error);
|
|
106
155
|
}
|
|
107
156
|
} else {
|
|
108
|
-
|
|
157
|
+
injectPilet({ name, disabled: true, original: pilet } as any);
|
|
109
158
|
}
|
|
110
159
|
};
|
|
111
160
|
|
|
112
161
|
const removePilet = (name: string) => {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
modules: state.modules.filter((m) => m.name !== name),
|
|
117
|
-
}));
|
|
162
|
+
const pilets = getPilets().filter((m) => m.name !== name);
|
|
163
|
+
injectPilet({ name } as any);
|
|
164
|
+
setPilets(pilets);
|
|
118
165
|
};
|
|
119
166
|
|
|
120
167
|
const appendPilet = (meta: any) => {
|
|
@@ -122,7 +169,7 @@ export function installPiralDebug(options: DebuggerOptions) {
|
|
|
122
169
|
loadPilet(meta).then((pilet) => {
|
|
123
170
|
try {
|
|
124
171
|
const newApi = createApi(pilet);
|
|
125
|
-
|
|
172
|
+
injectPilet(pilet);
|
|
126
173
|
pilet.setup(newApi as any);
|
|
127
174
|
} catch (error) {
|
|
128
175
|
console.error(error);
|
|
@@ -131,37 +178,31 @@ export function installPiralDebug(options: DebuggerOptions) {
|
|
|
131
178
|
};
|
|
132
179
|
|
|
133
180
|
const toggleVisualize = () => {
|
|
134
|
-
|
|
181
|
+
setState((s) => ({
|
|
135
182
|
...s,
|
|
136
|
-
|
|
137
|
-
...s
|
|
138
|
-
|
|
139
|
-
...s.$debug.visualize,
|
|
140
|
-
force: !s.$debug.visualize.force,
|
|
141
|
-
},
|
|
183
|
+
visualize: {
|
|
184
|
+
...s.visualize,
|
|
185
|
+
force: !s.visualize.force,
|
|
142
186
|
},
|
|
143
187
|
}));
|
|
144
188
|
};
|
|
145
189
|
|
|
146
190
|
const updateVisualize = (active: boolean) => {
|
|
147
|
-
|
|
191
|
+
setState((s) => ({
|
|
148
192
|
...s,
|
|
149
|
-
|
|
150
|
-
...s
|
|
151
|
-
|
|
152
|
-
...s.$debug.visualize,
|
|
153
|
-
active,
|
|
154
|
-
},
|
|
193
|
+
visualize: {
|
|
194
|
+
...s.visualize,
|
|
195
|
+
active,
|
|
155
196
|
},
|
|
156
197
|
}));
|
|
157
198
|
};
|
|
158
199
|
|
|
159
|
-
const goToRoute = (
|
|
160
|
-
|
|
200
|
+
const goToRoute = (path: string, state?: any) => {
|
|
201
|
+
setState((s) => ({
|
|
161
202
|
...s,
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
203
|
+
route: {
|
|
204
|
+
path,
|
|
205
|
+
state,
|
|
165
206
|
},
|
|
166
207
|
}));
|
|
167
208
|
};
|
|
@@ -174,41 +215,45 @@ export function installPiralDebug(options: DebuggerOptions) {
|
|
|
174
215
|
name: process.env.BUILD_PCKG_NAME,
|
|
175
216
|
version: process.env.BUILD_PCKG_VERSION,
|
|
176
217
|
dependencies: process.env.SHARED_DEPENDENCIES,
|
|
177
|
-
context,
|
|
178
218
|
},
|
|
179
219
|
build: {
|
|
180
220
|
date: process.env.BUILD_TIME_FULL,
|
|
181
221
|
cli: process.env.PIRAL_CLI_VERSION,
|
|
182
222
|
compat: process.env.DEBUG_PIRAL,
|
|
183
223
|
},
|
|
184
|
-
pilets
|
|
224
|
+
pilets: {
|
|
225
|
+
loadPilet,
|
|
226
|
+
createApi,
|
|
227
|
+
},
|
|
185
228
|
};
|
|
186
229
|
|
|
187
230
|
const start = () => {
|
|
188
|
-
const
|
|
189
|
-
const
|
|
190
|
-
const
|
|
191
|
-
const
|
|
192
|
-
const
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
}));
|
|
231
|
+
const container = decycle(getGlobalState());
|
|
232
|
+
const routes = getRoutes().filter((r) => !excludedRoutes.includes(r));
|
|
233
|
+
const extensions = getExtensions();
|
|
234
|
+
const settings = getSettings();
|
|
235
|
+
const dependencies = getDependencies();
|
|
236
|
+
const pilets = getPilets().map((pilet: any) => ({
|
|
237
|
+
name: pilet.name,
|
|
238
|
+
version: pilet.version,
|
|
239
|
+
disabled: pilet.disabled,
|
|
240
|
+
}));
|
|
199
241
|
|
|
200
242
|
sendMessage({
|
|
201
243
|
type: 'available',
|
|
202
244
|
name: debugApi.instance.name,
|
|
203
245
|
version: debugApi.instance.version,
|
|
204
246
|
kind: debugApiVersion,
|
|
205
|
-
|
|
247
|
+
mode: process.env.NODE_ENV === 'production' ? 'production' : 'development',
|
|
248
|
+
capabilities: ['events', 'container', 'routes', 'pilets', 'settings', 'extensions', 'dependencies'],
|
|
206
249
|
state: {
|
|
207
250
|
routes,
|
|
208
251
|
pilets,
|
|
209
252
|
container,
|
|
210
253
|
settings,
|
|
211
254
|
events,
|
|
255
|
+
extensions,
|
|
256
|
+
dependencies,
|
|
212
257
|
},
|
|
213
258
|
});
|
|
214
259
|
};
|
|
@@ -218,7 +263,7 @@ export function installPiralDebug(options: DebuggerOptions) {
|
|
|
218
263
|
events.unshift({
|
|
219
264
|
id: events.length.toString(),
|
|
220
265
|
name: ev.type.replace('piral-', ''),
|
|
221
|
-
args: ev.detail.arg,
|
|
266
|
+
args: decycle(ev.detail.arg),
|
|
222
267
|
time: Date.now(),
|
|
223
268
|
});
|
|
224
269
|
|
|
@@ -231,36 +276,15 @@ export function installPiralDebug(options: DebuggerOptions) {
|
|
|
231
276
|
return eventDispatcher.call(this, ev);
|
|
232
277
|
};
|
|
233
278
|
|
|
234
|
-
context.dispatch((s) => ({
|
|
235
|
-
...s,
|
|
236
|
-
$debug: {
|
|
237
|
-
visualize: {
|
|
238
|
-
active: settings.viewOrigins.value,
|
|
239
|
-
force: false,
|
|
240
|
-
},
|
|
241
|
-
route: undefined,
|
|
242
|
-
},
|
|
243
|
-
components: {
|
|
244
|
-
...s.components,
|
|
245
|
-
Debug: DebugTracker,
|
|
246
|
-
},
|
|
247
|
-
registry: {
|
|
248
|
-
...s.registry,
|
|
249
|
-
wrappers: {
|
|
250
|
-
...s.registry.wrappers,
|
|
251
|
-
'*': VisualizationWrapper,
|
|
252
|
-
},
|
|
253
|
-
},
|
|
254
|
-
}));
|
|
255
|
-
|
|
256
279
|
window.addEventListener('storage', (event) => {
|
|
257
|
-
if (event.storageArea === sessionStorage) {
|
|
280
|
+
if (!legacyBrowser && event.storageArea === sessionStorage) {
|
|
258
281
|
// potentially unknowingly updated settings
|
|
259
282
|
updateSettings({
|
|
260
283
|
viewState: sessionStorage.getItem('dbg:view-state') !== 'off',
|
|
261
284
|
loadPilets: sessionStorage.getItem('dbg:load-pilets') === 'on',
|
|
262
285
|
hardRefresh: sessionStorage.getItem('dbg:hard-refresh') === 'on',
|
|
263
286
|
viewOrigins: sessionStorage.getItem('dbg:view-origins') === 'on',
|
|
287
|
+
extensionCatalogue: sessionStorage.getItem('dbg:extension-catalogue') !== 'off',
|
|
264
288
|
});
|
|
265
289
|
}
|
|
266
290
|
});
|
|
@@ -281,53 +305,90 @@ export function installPiralDebug(options: DebuggerOptions) {
|
|
|
281
305
|
case 'toggle-pilet':
|
|
282
306
|
return togglePilet(content.name);
|
|
283
307
|
case 'emit-event':
|
|
284
|
-
return
|
|
308
|
+
return fireEvent(content.name, content.args);
|
|
285
309
|
case 'goto-route':
|
|
286
|
-
return goToRoute(content.route);
|
|
310
|
+
return goToRoute(content.route, content.state);
|
|
287
311
|
case 'visualize-all':
|
|
288
312
|
return toggleVisualize();
|
|
289
313
|
}
|
|
290
314
|
}
|
|
291
315
|
});
|
|
292
316
|
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
);
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
317
|
+
integrate({
|
|
318
|
+
components: {
|
|
319
|
+
Debug: DebugTracker,
|
|
320
|
+
},
|
|
321
|
+
routes: {
|
|
322
|
+
[initialSettings.cataloguePath]: ExtensionCatalogue,
|
|
323
|
+
},
|
|
324
|
+
wrappers: {
|
|
325
|
+
'*': VisualizationWrapper,
|
|
326
|
+
},
|
|
327
|
+
onChange(previous, current, changed) {
|
|
328
|
+
if (changed.state) {
|
|
329
|
+
if (settings.viewState.value) {
|
|
330
|
+
if (!legacyBrowser) {
|
|
331
|
+
// Chrome, Firefox, ... (full capability)
|
|
332
|
+
const err = new Error();
|
|
333
|
+
const lastLine = err.stack.split('\n')[7];
|
|
334
|
+
|
|
335
|
+
if (lastLine) {
|
|
336
|
+
const action = lastLine.replace(/^\s+at\s+(Atom\.|Object\.)?/, '');
|
|
337
|
+
console.group(
|
|
338
|
+
`%c Piral State Change %c ${new Date().toLocaleTimeString()}`,
|
|
339
|
+
'color: gray; font-weight: lighter;',
|
|
340
|
+
'color: black; font-weight: bold;',
|
|
341
|
+
);
|
|
342
|
+
console.log('%c Previous', `color: #9E9E9E; font-weight: bold`, previous);
|
|
343
|
+
console.log('%c Action', `color: #03A9F4; font-weight: bold`, action);
|
|
344
|
+
console.log('%c Next', `color: #4CAF50; font-weight: bold`, current);
|
|
345
|
+
console.groupEnd();
|
|
346
|
+
}
|
|
347
|
+
} else {
|
|
348
|
+
// IE 11, ... (does not know colors etc.)
|
|
349
|
+
console.log('Changed state', previous, current);
|
|
313
350
|
}
|
|
314
|
-
} else {
|
|
315
|
-
// IE 11, ... (does not know colors etc.)
|
|
316
|
-
console.log('Changed state', previous, current);
|
|
317
351
|
}
|
|
352
|
+
|
|
353
|
+
sendMessage({
|
|
354
|
+
type: 'container',
|
|
355
|
+
container: decycle(getGlobalState()),
|
|
356
|
+
});
|
|
318
357
|
}
|
|
319
358
|
|
|
320
|
-
if (
|
|
321
|
-
|
|
359
|
+
if (changed.pilets) {
|
|
360
|
+
sendMessage({
|
|
361
|
+
type: 'pilets',
|
|
362
|
+
pilets: getPilets().map((pilet: any) => ({
|
|
363
|
+
name: pilet.name,
|
|
364
|
+
version: pilet.version,
|
|
365
|
+
disabled: !!pilet.disabled,
|
|
366
|
+
})),
|
|
367
|
+
});
|
|
322
368
|
}
|
|
323
369
|
|
|
324
|
-
if (
|
|
325
|
-
|
|
370
|
+
if (changed.pages) {
|
|
371
|
+
sendMessage({
|
|
372
|
+
type: 'routes',
|
|
373
|
+
routes: getRoutes().filter((r) => !excludedRoutes.includes(r)),
|
|
374
|
+
});
|
|
326
375
|
}
|
|
327
376
|
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
377
|
+
if (changed.extensions) {
|
|
378
|
+
sendMessage({
|
|
379
|
+
type: 'extensions',
|
|
380
|
+
extensions: getExtensions(),
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
if (changed.dependencies) {
|
|
385
|
+
sendMessage({
|
|
386
|
+
type: 'dependencies',
|
|
387
|
+
dependencies: getDependencies(),
|
|
388
|
+
});
|
|
389
|
+
}
|
|
390
|
+
},
|
|
391
|
+
});
|
|
331
392
|
|
|
332
393
|
window['dbg:piral'] = debugApi;
|
|
333
394
|
start();
|
package/src/decycle.ts
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export function decycle(obj: Record<string, any>) {
|
|
2
|
+
const objects = [];
|
|
3
|
+
const paths = [];
|
|
4
|
+
|
|
5
|
+
const derez = (value: Record<string, any>, path: string) => {
|
|
6
|
+
const _value = value && value.toJSON instanceof Function ? value.toJSON() : value;
|
|
7
|
+
|
|
8
|
+
if (_value === null || _value === undefined) {
|
|
9
|
+
return undefined;
|
|
10
|
+
} else if (typeof _value === 'function') {
|
|
11
|
+
return `<function>`;
|
|
12
|
+
} else if (_value instanceof Error) {
|
|
13
|
+
return `<error>`;
|
|
14
|
+
} else if (_value instanceof Node) {
|
|
15
|
+
return `<node>`;
|
|
16
|
+
} else if (typeof _value === 'object') {
|
|
17
|
+
for (let i = 0; i < objects.length; i++) {
|
|
18
|
+
if (objects[i] === _value) {
|
|
19
|
+
return { $ref: paths[i] };
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
objects.push(_value);
|
|
24
|
+
paths.push(path);
|
|
25
|
+
|
|
26
|
+
if (Array.isArray(_value)) {
|
|
27
|
+
const nu = [];
|
|
28
|
+
|
|
29
|
+
for (let i = 0; i < _value.length; i += 1) {
|
|
30
|
+
nu[i] = derez(_value[i], `${path}[${i}]`);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return nu;
|
|
34
|
+
} else {
|
|
35
|
+
const nu = {};
|
|
36
|
+
|
|
37
|
+
for (const name in _value) {
|
|
38
|
+
if (Object.prototype.hasOwnProperty.call(_value, name)) {
|
|
39
|
+
nu[name] = derez(_value[name], `${path}[${JSON.stringify(name)}]`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return nu;
|
|
44
|
+
}
|
|
45
|
+
} else if (typeof _value === 'symbol') {
|
|
46
|
+
return '<symbol>';
|
|
47
|
+
} else if (typeof _value === 'bigint') {
|
|
48
|
+
return '<bigint>';
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return _value;
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
return derez(obj, '$');
|
|
55
|
+
}
|
package/src/emulator.ts
CHANGED
|
@@ -1,14 +1,8 @@
|
|
|
1
|
-
import { isfunc,
|
|
2
|
-
|
|
3
|
-
export interface EmulatorConnectorOptions {
|
|
4
|
-
createApi: PiletApiCreator;
|
|
5
|
-
loadPilet: PiletLoader;
|
|
6
|
-
inject?(pilet: Pilet): void;
|
|
7
|
-
piletApiFallback?: string;
|
|
8
|
-
}
|
|
1
|
+
import { isfunc, PiletRequester, setupPilet } from 'piral-base';
|
|
2
|
+
import { EmulatorConnectorOptions } from './types';
|
|
9
3
|
|
|
10
4
|
export function withEmulatorPilets(requestPilets: PiletRequester, options: EmulatorConnectorOptions): PiletRequester {
|
|
11
|
-
const { loadPilet, createApi,
|
|
5
|
+
const { loadPilet, createApi, injectPilet, piletApiFallback = '/$pilet-api' } = options;
|
|
12
6
|
// check if pilets should be loaded
|
|
13
7
|
const loadPilets = sessionStorage.getItem('dbg:load-pilets') === 'on';
|
|
14
8
|
const noPilets: PiletRequester = () => Promise.resolve([]);
|
|
@@ -37,10 +31,15 @@ export function withEmulatorPilets(requestPilets: PiletRequester, options: Emula
|
|
|
37
31
|
if (!hardRefresh) {
|
|
38
32
|
// standard setting is to just perform an inject
|
|
39
33
|
const meta = JSON.parse(data);
|
|
34
|
+
|
|
35
|
+
// tear down pilet
|
|
36
|
+
injectPilet({ name: meta.name } as any);
|
|
37
|
+
|
|
38
|
+
// load and evaluate pilet
|
|
40
39
|
loadPilet(meta).then((pilet) => {
|
|
41
40
|
try {
|
|
42
|
-
if (isfunc(
|
|
43
|
-
|
|
41
|
+
if (isfunc(injectPilet)) {
|
|
42
|
+
injectPilet(pilet);
|
|
44
43
|
}
|
|
45
44
|
|
|
46
45
|
setupPilet(pilet, createApi);
|
package/src/index.ts
CHANGED