glass-easel-devtools-panel 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/.eslintignore +2 -0
  2. package/dist/app.d.ts +0 -0
  3. package/dist/bootstrap.d.ts +5 -0
  4. package/dist/bootstrap.js +3 -0
  5. package/dist/bootstrap.js.LICENSE.txt +1 -0
  6. package/dist/events.d.ts +41 -0
  7. package/dist/global_components/image/image.d.ts +1 -0
  8. package/dist/global_components/index.d.ts +2 -0
  9. package/dist/global_components/view/view.d.ts +1 -0
  10. package/dist/index.css +17 -0
  11. package/dist/message_channel.d.ts +11 -0
  12. package/dist/pages/detail/detail.d.ts +1 -0
  13. package/dist/pages/detail/section.d.ts +0 -0
  14. package/dist/pages/detail/value.d.ts +1 -0
  15. package/dist/pages/index/index.d.ts +1 -0
  16. package/dist/pages/store.d.ts +9 -0
  17. package/dist/pages/tree/element.d.ts +1 -0
  18. package/dist/resources/logo_256.png +0 -0
  19. package/dist/utils.d.ts +4 -0
  20. package/package.json +21 -0
  21. package/src/app.ts +1 -0
  22. package/src/app.wxss +1 -0
  23. package/src/bootstrap.ts +80 -0
  24. package/src/events.ts +97 -0
  25. package/src/global_components/image/image.json +3 -0
  26. package/src/global_components/image/image.ts +1 -0
  27. package/src/global_components/image/image.wxml +1 -0
  28. package/src/global_components/image/image.wxss +3 -0
  29. package/src/global_components/index.ts +12 -0
  30. package/src/global_components/view/view.json +3 -0
  31. package/src/global_components/view/view.ts +40 -0
  32. package/src/global_components/view/view.wxml +14 -0
  33. package/src/global_components/view/view.wxss +0 -0
  34. package/src/message_channel.ts +70 -0
  35. package/src/pages/common.wxss +12 -0
  36. package/src/pages/detail/detail.json +7 -0
  37. package/src/pages/detail/detail.ts +190 -0
  38. package/src/pages/detail/detail.wxml +179 -0
  39. package/src/pages/detail/detail.wxss +84 -0
  40. package/src/pages/detail/section.json +3 -0
  41. package/src/pages/detail/section.ts +17 -0
  42. package/src/pages/detail/section.wxml +8 -0
  43. package/src/pages/detail/section.wxss +47 -0
  44. package/src/pages/detail/value.json +3 -0
  45. package/src/pages/detail/value.ts +107 -0
  46. package/src/pages/detail/value.wxml +7 -0
  47. package/src/pages/detail/value.wxss +44 -0
  48. package/src/pages/index/index.json +6 -0
  49. package/src/pages/index/index.ts +121 -0
  50. package/src/pages/index/index.wxml +29 -0
  51. package/src/pages/index/index.wxss +75 -0
  52. package/src/pages/store.ts +33 -0
  53. package/src/pages/tree/element.json +6 -0
  54. package/src/pages/tree/element.ts +295 -0
  55. package/src/pages/tree/element.wxml +47 -0
  56. package/src/pages/tree/element.wxss +113 -0
  57. package/src/resources/logo_256.png +0 -0
  58. package/src/utils.ts +16 -0
  59. package/src.d.ts +10 -0
  60. package/tsconfig.json +11 -0
  61. package/typings/miniprogram.d.ts +6 -0
  62. package/webpack.config.js +79 -0
  63. package/webpack.dev.config.js +12 -0
@@ -0,0 +1 @@
1
+ /*! For license information please see index.js.LICENSE.txt */
@@ -0,0 +1,41 @@
1
+ import { type builder } from 'glass-easel-miniprogram-adapter/dist/glass_easel_miniprogram_adapter';
2
+ import { type protocol } from './message_channel';
3
+ export declare class EventDispatcher<N extends string, K extends string | number, T extends {
4
+ [k in N]: K;
5
+ }> {
6
+ private keyName;
7
+ private listeners;
8
+ constructor(keyName: N);
9
+ addListener(key: K, func: (args: T) => void): void;
10
+ removeListener(key: K, func: (args: T) => void): void;
11
+ bindComponentLifetimes(ctx: builder.BuilderContext<any, any, any>, getKey: () => K, func: (args: T) => void): void;
12
+ dispatch(args: T): void;
13
+ }
14
+ export declare const childNodeCountUpdated: EventDispatcher<"nodeId", number, {
15
+ nodeId: protocol.NodeId;
16
+ childNodeCount: number;
17
+ }>;
18
+ export declare const setChildNodes: EventDispatcher<"parentId", number, {
19
+ parentId: protocol.NodeId;
20
+ nodes: protocol.dom.Node[];
21
+ }>;
22
+ export declare const childNodeInserted: EventDispatcher<"parentNodeId", number, {
23
+ parentNodeId: protocol.NodeId;
24
+ previousNodeId: protocol.NodeId;
25
+ node: protocol.dom.Node;
26
+ }>;
27
+ export declare const childNodeRemoved: EventDispatcher<"parentNodeId", number, {
28
+ parentNodeId: protocol.NodeId;
29
+ nodeId: protocol.NodeId;
30
+ }>;
31
+ export declare const characterDataModified: EventDispatcher<"nodeId", number, {
32
+ nodeId: protocol.NodeId;
33
+ characterData: string;
34
+ }>;
35
+ export declare const attributeModified: EventDispatcher<"nodeId", number, {
36
+ nodeId: protocol.NodeId;
37
+ name: string;
38
+ value: string;
39
+ detail: protocol.GlassEaselVar;
40
+ nameType: "basic" | "attribute" | "component-property" | "slot-value" | "dataset" | "mark" | "external-class";
41
+ }>;
@@ -0,0 +1 @@
1
+ export declare const componentDefinition: {};
@@ -0,0 +1,2 @@
1
+ import { type CodeSpace } from 'glass-easel-miniprogram-adapter';
2
+ export declare const loadGlobalComponents: (codeSpace: CodeSpace) => void;
@@ -0,0 +1 @@
1
+ export declare const componentDefinition: {};
package/dist/index.css ADDED
@@ -0,0 +1,17 @@
1
+ [wx-host="A"]{display:block;}
2
+
3
+ [wx-host="C"]{display:block;}
4
+
5
+ [wx-host="E"]{display:block;}
6
+
7
+ [wx-host="G"]{display:block;}
8
+
9
+ @keyframes update-ani{from{background:#dd8;}to{background:transparent;}}.A--updated{background:#dd8;animation-duration:1s;animation-fill-mode:both;animation-name:update-ani;animation-timing-function:ease;}.A--tag{color:#888;white-space:nowrap;}.A--fold-arrow{display:inline-block;width:1em;height:1em;line-height:1em;color:#444;text-align:center;}.A--fold-arrow-icon{width:1em;transition:transform 200ms ease;}.A--fold-arrow-icon_open{transform:rotate(90deg);}.A--tag-body{display:inline-block;}.A--tag-body_hover{background:#ace;}.A--tag-body_selected{background:#add;}.A--tag-body_highlight{background-color:rgba(0,128,192,0.25);}.A--tag-text{display:inline;}.A--tag-name{display:inline-block;color:#408;}.A--tag-var-name-wrapper{display:inline;}.A--tag-var-name{display:inline-block;margin-left:0.25em;height:1em;line-height:1em;min-width:1em;text-align:center;font-size:0.8em;font-style:italic;color:#222;}.A--tag-var-name_hover{background:#ace;}.A--attribute{display:inline-block;margin-left:0.5em;}.A--attribute-name{display:inline-block;color:#084;}.A--attribute-name_property{color:#06a;}.A--attribute-value{display:inline-block;color:#840;}.A--children{margin-left:1em;}.A--virtual-tag-name{display:inline-block;font-style:italic;}.A--virtual-tag-name_hover{background:#add;}.A--text-content{color:#222;padding:1px 0;}
10
+ body{margin:0;height:100vh;}.wrapper{font-family:monospace;font-size:12px;background:#eee;height:100%;cursor:default;user-select:none;}.empty{color:#888;font-style:italic;padding:5px;}.main{height:100%;}.tree-detail{display:flex;height:100%;overflow:hidden;}.tree-detail-split{width:2px;background-color:#888;cursor:w-resize;}.left{flex:1 1 0;display:flex;flex-direction:column;overflow-x:hidden;}.toolbar{flex:none;background:#ccc;color:#222;border-bottom:2px solid#888;display:flex;}.tool-space{flex:auto;}.tool{flex:none;display:inline-block;padding:5px 10px;}.tool_hover{background:#ace;}.tool_active{background:#add;}.tree{flex:auto;margin:5px;overflow:auto;user-select:text;}.detail{flex:none;box-sizing:border-box;overflow:auto;}
11
+ .C--title{padding:0 5px;background:#ccc;color:#222;line-height:1.5;white-space:nowrap;}.C--title-text{display:inline-block;}.C--title-refresh{display:inline-block;font-size:1.5em;width:1em;height:1em;line-height:1;text-align:center;margin-left:0.5em;}.C--title-refresh_hover{background-color:#ace;}.C--arrow{display:inline-block;width:1em;height:1.5em;text-align:center;transition:transform 200ms ease;margin-right:0.25em;}.C--arrow_open{transform:rotate(90deg);}.C--body{padding:0 5px;overflow:hidden;}.C--body_collapsed{height:0;}
12
+ @keyframes value-update-ani{from{background:#dd8;}to{background:transparent;}}.D--updated{background:#dd8;animation-duration:1s;animation-fill-mode:both;animation-name:value-update-ani;animation-timing-function:ease;}.D--wrapper{display:inline-block;}.D--slice{display:inline;color:#888;}.D--slice_dynamic{color:#840;}.D--var-name{display:inline-block;margin-left:0.25em;height:1em;line-height:1em;min-width:1em;text-align:center;font-size:0.8em;font-style:italic;color:#222;}.D--var-name_hover{background:#ace;}
13
+ .E--section{margin-bottom:5px;color:#888;}.E--section-item{white-space:nowrap;user-select:text;}.E--section-key{display:inline;color:#06a;}.E--section-key-core{display:inline;color:#084;}.E--section-value{display:inline;color:#840;}.E--section-value-extra{color:#222;}.E--section-empty{text-align:center;font-style:italic;}.E--box-model{margin:0 auto;}.E--box-model-text{flex:none;text-align:center;white-space:nowrap;color:#222;margin:1px;}.E--box-model-content{display:flex;border:1px solid#888;padding:1px;}.E--box-model-padding{border:1px solid#888;padding:1px;background:#eee;}.E--box-model-border{border:1px solid#888;padding:1px;background:#ccc;}.E--box-model-margin{padding:1px;}.E--box-model-line{display:flex;justify-content:center;align-items:center;}.E--style-rule{padding-left:1em;margin:5px 0;}.E--style-rule_inactive{text-decoration:line-through#222;}.E--style-rule-prefix{margin-left:-1em;font-style:italic;}.E--style-rule-title{margin-left:-1em;color:#222;}
14
+
15
+
16
+
17
+ /*# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUhGLENBTUEsZUFDRSxpQkFDQSxhQUZGLENBSUEsd0JBQ0UsaUNBREYsQ0FHQSxzQkFDRSxpQkFDQSxrQkFGRixDQUlBLHFCQUNFLGlCQUNBLFdBRkYsQyIsInNvdXJjZXMiOlsid2VicGFjazovL2dsYXNzLWVhc2VsLWRldnRvb2xzLXBhbmVsLy4vc3JjL19fZ2xhc3NfZWFzZWxfaG9zdF9zdHlsZXNfXy53eHNzIiwid2VicGFjazovL2dsYXNzLWVhc2VsLWRldnRvb2xzLXBhbmVsLy4vc3JjL3BhZ2VzL3RyZWUvZWxlbWVudC53eHNzIiwid2VicGFjazovL2dsYXNzLWVhc2VsLWRldnRvb2xzLXBhbmVsLy4vc3JjL3BhZ2VzL2luZGV4L2luZGV4Lnd4c3MiLCJ3ZWJwYWNrOi8vZ2xhc3MtZWFzZWwtZGV2dG9vbHMtcGFuZWwvLi9zcmMvcGFnZXMvZGV0YWlsL3NlY3Rpb24ud3hzcyIsIndlYnBhY2s6Ly9nbGFzcy1lYXNlbC1kZXZ0b29scy1wYW5lbC8uL3NyYy9wYWdlcy9kZXRhaWwvdmFsdWUud3hzcyIsIndlYnBhY2s6Ly9nbGFzcy1lYXNlbC1kZXZ0b29scy1wYW5lbC8uL3NyYy9wYWdlcy9kZXRhaWwvZGV0YWlsLnd4c3MiXSwic291cmNlc0NvbnRlbnQiOlsiW3d4LWhvc3Q9XCJBXCJde2Rpc3BsYXk6YmxvY2s7fVxuXG5bd3gtaG9zdD1cIkNcIl17ZGlzcGxheTpibG9jazt9XG5cblt3eC1ob3N0PVwiRVwiXXtkaXNwbGF5OmJsb2NrO31cblxuW3d4LWhvc3Q9XCJHXCJde2Rpc3BsYXk6YmxvY2s7fSIsIkBpbXBvcnQgdXJsKCcuLi9jb21tb24ud3hzcycpO1xuXG5Aa2V5ZnJhbWVzIHVwZGF0ZS1hbmkge1xuICBmcm9tIHtcbiAgICBiYWNrZ3JvdW5kOiBAdXBkYXRlLWJnO1xuICB9XG4gIHRvIHtcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgfVxufVxuLnVwZGF0ZWQge1xuICBiYWNrZ3JvdW5kOiBAdXBkYXRlLWJnO1xuICBhbmltYXRpb24tZHVyYXRpb246IDFzO1xuICBhbmltYXRpb24tZmlsbC1tb2RlOiBib3RoO1xuICBhbmltYXRpb24tbmFtZTogdXBkYXRlLWFuaTtcbiAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZTtcbn1cblxuOmhvc3Qge1xuICBkaXNwbGF5OiBibG9jaztcbn1cblxuLnRhZyB7XG4gIGNvbG9yOiBAY29tbW9uLXRleHQ7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG5cbi5mb2xkLWFycm93IHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB3aWR0aDogMWVtO1xuICBoZWlnaHQ6IDFlbTtcbiAgbGluZS1oZWlnaHQ6IDFlbTtcbiAgY29sb3I6ICM0NDQ7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cbi5mb2xkLWFycm93LWljb24ge1xuICB3aWR0aDogMWVtO1xuICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMjAwbXMgZWFzZTtcbn1cbi5mb2xkLWFycm93LWljb25fb3BlbiB7XG4gIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTtcbn1cblxuLnRhZy1ib2R5IHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuLnRhZy1ib2R5X2hvdmVyIHtcbiAgYmFja2dyb3VuZDogQGhvdmVyLWJnO1xufVxuLnRhZy1ib2R5X3NlbGVjdGVkIHtcbiAgYmFja2dyb3VuZDogQHNlbGVjdGVkLWJnO1xufVxuLnRhZy1ib2R5X2hpZ2hsaWdodCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMTI4LCAxOTIsIDAuMjUpO1xufVxuLnRhZy10ZXh0IHtcbiAgZGlzcGxheTogaW5saW5lO1xufVxuLnRhZy1uYW1lIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBjb2xvcjogQHRhZy1uYW1lO1xufVxuXG4udGFnLXZhci1uYW1lLXdyYXBwZXIge1xuICBkaXNwbGF5OiBpbmxpbmU7XG59XG4udGFnLXZhci1uYW1lIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBtYXJnaW4tbGVmdDogMC4yNWVtO1xuICBoZWlnaHQ6IDFlbTtcbiAgbGluZS1oZWlnaHQ6IDFlbTtcbiAgbWluLXdpZHRoOiAxZW07XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgZm9udC1zaXplOiAwLjhlbTtcbiAgZm9udC1zdHlsZTogaXRhbGljO1xuICBjb2xvcjogQGltcG9ydGFudC10ZXh0O1xufVxuLnRhZy12YXItbmFtZV9ob3ZlciB7XG4gIGJhY2tncm91bmQ6IEBob3Zlci1iZztcbn1cblxuLmF0dHJpYnV0ZSB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgbWFyZ2luLWxlZnQ6IDAuNWVtO1xufVxuLmF0dHJpYnV0ZS1uYW1lIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBjb2xvcjogQGNvcmUtYXR0cmlidXRlLW5hbWU7XG59XG4uYXR0cmlidXRlLW5hbWVfcHJvcGVydHkge1xuICBjb2xvcjogQHByb3BlcnR5LW5hbWU7XG59XG4uYXR0cmlidXRlLXZhbHVlIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBjb2xvcjogQGF0dHJpYnV0ZS12YWx1ZTtcbn1cblxuLmNoaWxkcmVuIHtcbiAgbWFyZ2luLWxlZnQ6IDFlbTtcbn1cblxuLnZpcnR1YWwtdGFnLW5hbWUge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcbn1cbi52aXJ0dWFsLXRhZy1uYW1lX2hvdmVyIHtcbiAgYmFja2dyb3VuZDogQHNlbGVjdGVkLWJnO1xufVxuXG4udGV4dC1jb250ZW50IHtcbiAgY29sb3I6IEBpbXBvcnRhbnQtdGV4dDtcbiAgcGFkZGluZzogMXB4IDA7XG59XG4iLCJAaW1wb3J0IHVybCgnLi4vY29tbW9uLnd4c3MnKTtcblxuYm9keSB7XG4gIG1hcmdpbjogMDtcbiAgaGVpZ2h0OiAxMDB2aDtcbn1cblxuLndyYXBwZXIge1xuICBmb250LWZhbWlseTogbW9ub3NwYWNlO1xuICBmb250LXNpemU6IDEycHg7XG4gIGJhY2tncm91bmQ6IEBwcmltYXJ5LWJnO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGN1cnNvcjogZGVmYXVsdDtcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XG59XG4uZW1wdHkge1xuICBjb2xvcjogQGNvbW1vbi10ZXh0O1xuICBmb250LXN0eWxlOiBpdGFsaWM7XG4gIHBhZGRpbmc6IDVweDtcbn1cblxuLm1haW4ge1xuICBoZWlnaHQ6IDEwMCU7XG59XG4udHJlZS1kZXRhaWwge1xuICBkaXNwbGF5OiBmbGV4O1xuICBoZWlnaHQ6IDEwMCU7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4udHJlZS1kZXRhaWwtc3BsaXQge1xuICB3aWR0aDogMnB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjODg4O1xuICBjdXJzb3I6IHctcmVzaXplO1xufVxuLmxlZnQge1xuICBmbGV4OiAxIDEgMDtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgb3ZlcmZsb3cteDogaGlkZGVuO1xufVxuXG4udG9vbGJhciB7XG4gIGZsZXg6IG5vbmU7XG4gIGJhY2tncm91bmQ6IEBzZWNvbmRhcnktYmc7XG4gIGNvbG9yOiBAaW1wb3J0YW50LXRleHQ7XG4gIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCAjODg4O1xuICBkaXNwbGF5OiBmbGV4O1xufVxuLnRvb2wtc3BhY2Uge1xuICBmbGV4OiBhdXRvO1xufVxuLnRvb2wge1xuICBmbGV4OiBub25lO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHBhZGRpbmc6IDVweCAxMHB4O1xufVxuLnRvb2xfaG92ZXIge1xuICBiYWNrZ3JvdW5kOiBAaG92ZXItYmc7XG59XG4udG9vbF9hY3RpdmUge1xuICBiYWNrZ3JvdW5kOiBAc2VsZWN0ZWQtYmc7XG59XG5cbi50cmVlIHtcbiAgZmxleDogYXV0bztcbiAgbWFyZ2luOiA1cHg7XG4gIG92ZXJmbG93OiBhdXRvO1xuICB1c2VyLXNlbGVjdDogdGV4dDtcbn1cblxuLmRldGFpbCB7XG4gIGZsZXg6IG5vbmU7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuIiwiQGltcG9ydCB1cmwoJy4uL2NvbW1vbi53eHNzJyk7XG5cbjpob3N0IHtcbiAgZGlzcGxheTogYmxvY2s7XG59XG5cbi50aXRsZSB7XG4gIHBhZGRpbmc6IDAgNXB4O1xuICBiYWNrZ3JvdW5kOiBAc2Vjb25kYXJ5LWJnO1xuICBjb2xvcjogQGltcG9ydGFudC10ZXh0O1xuICBsaW5lLWhlaWdodDogMS41O1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuLnRpdGxlLXRleHQge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG4udGl0bGUtcmVmcmVzaCB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgZm9udC1zaXplOiAxLjVlbTtcbiAgd2lkdGg6IDFlbTtcbiAgaGVpZ2h0OiAxZW07XG4gIGxpbmUtaGVpZ2h0OiAxO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIG1hcmdpbi1sZWZ0OiAwLjVlbTtcbn1cbi50aXRsZS1yZWZyZXNoX2hvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogQGhvdmVyLWJnO1xufVxuLmFycm93IHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB3aWR0aDogMWVtO1xuICBoZWlnaHQ6IDEuNWVtO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAyMDBtcyBlYXNlO1xuICBtYXJnaW4tcmlnaHQ6IDAuMjVlbTtcbn1cbi5hcnJvd19vcGVuIHtcbiAgdHJhbnNmb3JtOiByb3RhdGUoOTBkZWcpO1xufVxuXG4uYm9keSB7XG4gIHBhZGRpbmc6IDAgNXB4O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLmJvZHlfY29sbGFwc2VkIHtcbiAgaGVpZ2h0OiAwO1xufVxuIiwiQGltcG9ydCB1cmwoJy4uL2NvbW1vbi53eHNzJyk7XG5cbkBrZXlmcmFtZXMgdmFsdWUtdXBkYXRlLWFuaSB7XG4gIGZyb20ge1xuICAgIGJhY2tncm91bmQ6IEB1cGRhdGUtYmc7XG4gIH1cbiAgdG8ge1xuICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICB9XG59XG4udXBkYXRlZCB7XG4gIGJhY2tncm91bmQ6IEB1cGRhdGUtYmc7XG4gIGFuaW1hdGlvbi1kdXJhdGlvbjogMXM7XG4gIGFuaW1hdGlvbi1maWxsLW1vZGU6IGJvdGg7XG4gIGFuaW1hdGlvbi1uYW1lOiB2YWx1ZS11cGRhdGUtYW5pO1xuICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlO1xufVxuXG4ud3JhcHBlciB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbn1cblxuLnNsaWNlIHtcbiAgZGlzcGxheTogaW5saW5lO1xuICBjb2xvcjogQGNvbW1vbi10ZXh0O1xufVxuLnNsaWNlX2R5bmFtaWMge1xuICBjb2xvcjogQGF0dHJpYnV0ZS12YWx1ZTtcbn1cblxuLnZhci1uYW1lIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBtYXJnaW4tbGVmdDogMC4yNWVtO1xuICBoZWlnaHQ6IDFlbTtcbiAgbGluZS1oZWlnaHQ6IDFlbTtcbiAgbWluLXdpZHRoOiAxZW07XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgZm9udC1zaXplOiAwLjhlbTtcbiAgZm9udC1zdHlsZTogaXRhbGljO1xuICBjb2xvcjogQGltcG9ydGFudC10ZXh0O1xufVxuLnZhci1uYW1lX2hvdmVyIHtcbiAgYmFja2dyb3VuZDogQGhvdmVyLWJnO1xufVxuIiwiQGltcG9ydCB1cmwoJy4uL2NvbW1vbi53eHNzJyk7XG5cbjpob3N0IHtcbiAgZGlzcGxheTogYmxvY2s7XG59XG5cbi5zZWN0aW9uIHtcbiAgbWFyZ2luLWJvdHRvbTogNXB4O1xuICBjb2xvcjogQGNvbW1vbi10ZXh0O1xufVxuLnNlY3Rpb24taXRlbSB7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIHVzZXItc2VsZWN0OiB0ZXh0O1xufVxuLnNlY3Rpb24ta2V5IHtcbiAgZGlzcGxheTogaW5saW5lO1xuICBjb2xvcjogQHByb3BlcnR5LW5hbWU7XG59XG4uc2VjdGlvbi1rZXktY29yZSB7XG4gIGRpc3BsYXk6IGlubGluZTtcbiAgY29sb3I6IEBjb3JlLWF0dHJpYnV0ZS1uYW1lO1xufVxuLnNlY3Rpb24tdmFsdWUge1xuICBkaXNwbGF5OiBpbmxpbmU7XG4gIGNvbG9yOiBAYXR0cmlidXRlLXZhbHVlO1xufVxuLnNlY3Rpb24tdmFsdWUtZXh0cmEge1xuICBjb2xvcjogQGltcG9ydGFudC10ZXh0O1xufVxuXG4uc2VjdGlvbi1lbXB0eSB7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgZm9udC1zdHlsZTogaXRhbGljO1xufVxuXG4uYm94LW1vZGVsIHtcbiAgbWFyZ2luOiAwIGF1dG87XG59XG4uYm94LW1vZGVsLXRleHQge1xuICBmbGV4OiBub25lO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIGNvbG9yOiBAaW1wb3J0YW50LXRleHQ7XG4gIG1hcmdpbjogMXB4O1xufVxuLmJveC1tb2RlbC1jb250ZW50IHtcbiAgZGlzcGxheTogZmxleDtcbiAgYm9yZGVyOiAxcHggc29saWQgIzg4ODtcbiAgcGFkZGluZzogMXB4O1xufVxuLmJveC1tb2RlbC1wYWRkaW5nIHtcbiAgYm9yZGVyOiAxcHggc29saWQgIzg4ODtcbiAgcGFkZGluZzogMXB4O1xuICBiYWNrZ3JvdW5kOiBAcHJpbWFyeS1iZztcbn1cbi5ib3gtbW9kZWwtYm9yZGVyIHtcbiAgYm9yZGVyOiAxcHggc29saWQgIzg4ODtcbiAgcGFkZGluZzogMXB4O1xuICBiYWNrZ3JvdW5kOiBAc2Vjb25kYXJ5LWJnO1xufVxuLmJveC1tb2RlbC1tYXJnaW4ge1xuICBwYWRkaW5nOiAxcHg7XG59XG4uYm94LW1vZGVsLWxpbmUge1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbn1cblxuLnN0eWxlLXJ1bGUge1xuICBwYWRkaW5nLWxlZnQ6IDFlbTtcbiAgbWFyZ2luOiA1cHggMDtcbn1cbi5zdHlsZS1ydWxlX2luYWN0aXZlIHtcbiAgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2ggQGltcG9ydGFudC10ZXh0O1xufVxuLnN0eWxlLXJ1bGUtcHJlZml4IHtcbiAgbWFyZ2luLWxlZnQ6IC0xZW07XG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcbn1cbi5zdHlsZS1ydWxlLXRpdGxlIHtcbiAgbWFyZ2luLWxlZnQ6IC0xZW07XG4gIGNvbG9yOiBAaW1wb3J0YW50LXRleHQ7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=*/
@@ -0,0 +1,11 @@
1
+ import type { protocol } from 'glass-easel-devtools-agent';
2
+ export { protocol } from 'glass-easel-devtools-agent';
3
+ export type PanelRecvMessage = protocol.AgentSendMessage;
4
+ export type PanelSendMessage = protocol.AgentRecvMessage;
5
+ export interface MessageChannel {
6
+ send(data: PanelSendMessage): void;
7
+ recv(listener: (data: PanelRecvMessage) => void): void;
8
+ }
9
+ export declare const setMessageChannel: (mc: MessageChannel) => void;
10
+ export declare const setEventHandler: <T extends keyof protocol.AgentEventKind>(name: T, handler: (detail: protocol.AgentEventKind[T]["detail"]) => void) => void;
11
+ export declare const sendRequest: <T extends keyof protocol.AgentRequestKind>(name: T, detail: protocol.AgentRequestKind[T]["request"]) => Promise<protocol.AgentRequestKind[T]["response"]>;
@@ -0,0 +1 @@
1
+ export {};
File without changes
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export declare const componentDefinition: {};
@@ -0,0 +1,9 @@
1
+ import { type protocol } from 'glass-easel-devtools-agent';
2
+ export declare const store: {
3
+ selectedNodeId: protocol.NodeId;
4
+ highlightNodeId: protocol.NodeId;
5
+ sideBarShown: boolean;
6
+ selectNode(n: protocol.NodeId): void;
7
+ hideSideBar(): void;
8
+ setHighlightNode(n: protocol.NodeId): void;
9
+ };
@@ -0,0 +1 @@
1
+ export declare const compDef: {};
Binary file
@@ -0,0 +1,4 @@
1
+ export declare const DEV: boolean;
2
+ export declare const error: (msg: string, ...args: unknown[]) => void;
3
+ export declare const warn: (msg: string, ...args: unknown[]) => void;
4
+ export declare const debug: (msg: string, ...args: unknown[]) => void;
package/package.json ADDED
@@ -0,0 +1,21 @@
1
+ {
2
+ "name": "glass-easel-devtools-panel",
3
+ "version": "0.9.0",
4
+ "main": "dist/bootstrap.js",
5
+ "dependencies": {},
6
+ "devDependencies": {
7
+ "css-loader": "^7.1.2",
8
+ "glass-easel": "^0.9.0",
9
+ "glass-easel-miniprogram-adapter": "^0.9.0",
10
+ "glass-easel-miniprogram-webpack-plugin": "^0.9.0",
11
+ "less-loader": "^12.2.0",
12
+ "mini-css-extract-plugin": "^2.9.0",
13
+ "mobx-miniprogram": "^6.12.3",
14
+ "mobx-miniprogram-bindings": "^3.0.1",
15
+ "glass-easel-devtools-agent": "0.9.0"
16
+ },
17
+ "scripts": {
18
+ "build": "webpack --config webpack.config.js",
19
+ "dev": "webpack --config webpack.dev.config.js --watch"
20
+ }
21
+ }
package/src/app.ts ADDED
@@ -0,0 +1 @@
1
+ // this file is always executed on startup
package/src/app.wxss ADDED
@@ -0,0 +1 @@
1
+ /* this is the global stylesheet */
@@ -0,0 +1,80 @@
1
+ import { glassEasel, type Root } from 'glass-easel-miniprogram-adapter'
2
+ import { codeSpace, initWithBackend, registerGlobalEventListener } from '../src' // import the plugin-generated code
3
+ import { type MessageChannel, setMessageChannel } from './message_channel'
4
+ import { componentDefinition } from './pages/index'
5
+ import { warn } from './utils'
6
+ import { loadGlobalComponents } from './global_components'
7
+
8
+ export { MessageChannel, PanelRecvMessage, PanelSendMessage } from './message_channel'
9
+
10
+ let root: Root | null = null
11
+
12
+ const insertInto = (
13
+ backendContext: glassEasel.GeneralBackendContext,
14
+ backendElement: glassEasel.GeneralBackendElement,
15
+ ) => {
16
+ // create the backend context
17
+ registerGlobalEventListener(backendContext)
18
+ const ab = initWithBackend(backendContext)
19
+
20
+ // add global using components
21
+ loadGlobalComponents(codeSpace)
22
+
23
+ // create a mini-program page
24
+ root = ab.createRoot(
25
+ 'glass-easel-root', // the tag name of the mount point
26
+ codeSpace,
27
+ 'pages/index/index', // the mini-program page to load
28
+ )
29
+
30
+ // insert the page into backend
31
+ let placeholder: glassEasel.GeneralBackendElement
32
+ if (backendContext.mode === glassEasel.BackendMode.Composed) {
33
+ const ctx = backendContext
34
+ const parent = backendElement as glassEasel.composedBackend.Element
35
+ placeholder = ctx.createElement('glass-easel-devtools-panel', 'glass-easel-devtools-panel')
36
+ parent.appendChild(placeholder)
37
+ } else if (backendContext.mode === glassEasel.BackendMode.Domlike) {
38
+ const ctx = backendContext
39
+ const parent = backendElement as glassEasel.domlikeBackend.Element
40
+ placeholder = ctx.document.createElement('glass-easel-devtools-panel')
41
+ parent.appendChild(placeholder)
42
+ } else if (backendContext.mode === glassEasel.BackendMode.Shadow) {
43
+ const parent = backendElement as glassEasel.backend.Element
44
+ const sr = parent.getShadowRoot()
45
+ if (!sr) throw new Error('the host element should be inside of a shadow tree')
46
+ placeholder = sr.createElement('glass-easel-devtools-panel', 'glass-easel-devtools-panel')
47
+ parent.appendChild(placeholder)
48
+ } else {
49
+ throw new Error('unrecognized host backend mode')
50
+ }
51
+ root.attach(
52
+ backendElement as unknown as glassEasel.GeneralBackendElement,
53
+ placeholder as unknown as glassEasel.GeneralBackendElement,
54
+ )
55
+ if (
56
+ backendContext.mode === glassEasel.BackendMode.Composed ||
57
+ backendContext.mode === glassEasel.BackendMode.Shadow
58
+ ) {
59
+ const elem = placeholder as glassEasel.composedBackend.Element | glassEasel.backend.Element
60
+ elem.release()
61
+ }
62
+ }
63
+
64
+ export const startup = (
65
+ hostContext: glassEasel.GeneralBackendContext,
66
+ hostElement: glassEasel.GeneralBackendElement,
67
+ messageChannel: MessageChannel,
68
+ ) => {
69
+ setMessageChannel(messageChannel)
70
+ insertInto(hostContext, hostElement)
71
+ }
72
+
73
+ export const restart = () => {
74
+ if (!root) {
75
+ warn('cannot restart panel before startup')
76
+ return
77
+ }
78
+ const comp = root.get().asInstanceOf(componentDefinition)
79
+ comp?.restart()
80
+ }
package/src/events.ts ADDED
@@ -0,0 +1,97 @@
1
+ import { type builder } from 'glass-easel-miniprogram-adapter/dist/glass_easel_miniprogram_adapter'
2
+ import { type protocol, setEventHandler } from './message_channel'
3
+
4
+ export class EventDispatcher<
5
+ N extends string,
6
+ K extends string | number,
7
+ T extends { [k in N]: K },
8
+ > {
9
+ private keyName: N
10
+ private listeners = Object.create(null) as { [key: string | number]: ((args: T) => void)[] }
11
+
12
+ constructor(keyName: N) {
13
+ this.keyName = keyName
14
+ }
15
+
16
+ addListener(key: K, func: (args: T) => void) {
17
+ if (this.listeners[key]) this.listeners[key].push(func)
18
+ else this.listeners[key] = [func]
19
+ }
20
+
21
+ removeListener(key: K, func: (args: T) => void) {
22
+ if (this.listeners[key]) this.listeners[key] = this.listeners[key].filter((x) => x !== func)
23
+ }
24
+
25
+ bindComponentLifetimes(
26
+ ctx: builder.BuilderContext<any, any, any>,
27
+ getKey: () => K,
28
+ func: (args: T) => void,
29
+ ) {
30
+ const { lifetime } = ctx
31
+ lifetime('attached', () => {
32
+ this.addListener(getKey(), func)
33
+ })
34
+ lifetime('detached', () => {
35
+ this.removeListener(getKey(), func)
36
+ })
37
+ }
38
+
39
+ dispatch(args: T) {
40
+ const funcArr = this.listeners[args[this.keyName]]
41
+ funcArr?.forEach((f) => f(args))
42
+ }
43
+ }
44
+
45
+ export const childNodeCountUpdated = new EventDispatcher<
46
+ 'nodeId',
47
+ protocol.NodeId,
48
+ protocol.dom.ChildNodeCountUpdated['detail']
49
+ >('nodeId')
50
+ setEventHandler('DOM.childNodeCountUpdated', (args) => {
51
+ childNodeCountUpdated.dispatch(args)
52
+ })
53
+
54
+ export const setChildNodes = new EventDispatcher<
55
+ 'parentId',
56
+ protocol.NodeId,
57
+ protocol.dom.SetChildNodes['detail']
58
+ >('parentId')
59
+ setEventHandler('DOM.setChildNodes', (args) => {
60
+ setChildNodes.dispatch(args)
61
+ })
62
+
63
+ export const childNodeInserted = new EventDispatcher<
64
+ 'parentNodeId',
65
+ protocol.NodeId,
66
+ protocol.dom.ChildNodeInserted['detail']
67
+ >('parentNodeId')
68
+ setEventHandler('DOM.childNodeInserted', (args) => {
69
+ childNodeInserted.dispatch(args)
70
+ })
71
+
72
+ export const childNodeRemoved = new EventDispatcher<
73
+ 'parentNodeId',
74
+ protocol.NodeId,
75
+ protocol.dom.ChildNodeRemoved['detail']
76
+ >('parentNodeId')
77
+ setEventHandler('DOM.childNodeRemoved', (args) => {
78
+ childNodeRemoved.dispatch(args)
79
+ })
80
+
81
+ export const characterDataModified = new EventDispatcher<
82
+ 'nodeId',
83
+ protocol.NodeId,
84
+ protocol.dom.CharacterDataModified['detail']
85
+ >('nodeId')
86
+ setEventHandler('DOM.characterDataModified', (args) => {
87
+ characterDataModified.dispatch(args)
88
+ })
89
+
90
+ export const attributeModified = new EventDispatcher<
91
+ 'nodeId',
92
+ protocol.NodeId,
93
+ protocol.dom.AttributeModified['detail']
94
+ >('nodeId')
95
+ setEventHandler('DOM.attributeModified', (args) => {
96
+ attributeModified.dispatch(args)
97
+ })
@@ -0,0 +1,3 @@
1
+ {
2
+ "component": true
3
+ }
@@ -0,0 +1 @@
1
+ export const componentDefinition = Component().property('src', String).register()
@@ -0,0 +1 @@
1
+ <img src="{{ src }}" />
@@ -0,0 +1,3 @@
1
+ :host {
2
+ display: block;
3
+ }
@@ -0,0 +1,12 @@
1
+ import { type glassEasel, type CodeSpace } from 'glass-easel-miniprogram-adapter'
2
+ import * as view from './view/view'
3
+
4
+ const getCompDef = (def: unknown): glassEasel.GeneralComponentDefinition => {
5
+ const d = def as { _$: glassEasel.GeneralComponentDefinition }
6
+ return d._$
7
+ }
8
+
9
+ export const loadGlobalComponents = (codeSpace: CodeSpace) => {
10
+ const space = codeSpace.getComponentSpace()
11
+ space.setGlobalUsingComponent('view', getCompDef(view.componentDefinition))
12
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "component": true
3
+ }
@@ -0,0 +1,40 @@
1
+ export const componentDefinition = Component()
2
+ .options({
3
+ virtualHost: true,
4
+ })
5
+ .externalClasses(['class', 'hover-class'])
6
+ .property('style', String)
7
+ .property('hidden', Boolean)
8
+ .data(() => ({
9
+ hover: false,
10
+ }))
11
+ .init(({ self, setData, listener }) => {
12
+ const hoverStart = listener((ev) => {
13
+ setData({ hover: true })
14
+ self.triggerEvent('mouseenter', ev.detail, {})
15
+ })
16
+ const hoverEnd = listener((ev) => {
17
+ setData({ hover: false })
18
+ self.triggerEvent('mouseleave', ev.detail, {})
19
+ })
20
+ const mousedown = listener((ev) => {
21
+ self.triggerEvent('mousedown', ev.detail, {})
22
+ })
23
+ const mousemove = listener((ev) => {
24
+ self.triggerEvent('mousemove', ev.detail, {})
25
+ })
26
+ const mouseup = listener((ev) => {
27
+ self.triggerEvent('mouseup', ev.detail, {})
28
+ })
29
+ const touchstart = listener((ev) => {
30
+ self.triggerEvent('touchstart', ev.detail, {})
31
+ })
32
+ const touchmove = listener((ev) => {
33
+ self.triggerEvent('touchmove', ev.detail, {})
34
+ })
35
+ const touchend = listener((ev) => {
36
+ self.triggerEvent('touchend', ev.detail, {})
37
+ })
38
+ return { hoverStart, hoverEnd, mousedown, mousemove, mouseup, touchstart, touchmove, touchend }
39
+ })
40
+ .register()
@@ -0,0 +1,14 @@
1
+ <div
2
+ class="class {{ hover ? 'hover-class' : '' }}"
3
+ style="{{ hidden ? 'display: none;' : '' }}{{ style }}"
4
+ bind:mouseenter="hoverStart"
5
+ bind:mouseleave="hoverEnd"
6
+ bind:mousedown="mousedown"
7
+ bind:mousemove="mousemove"
8
+ bind:mouseup="mouseup"
9
+ bind:touchstart="touchstart"
10
+ bind:touchmove="touchmove"
11
+ bind:touchend="touchend"
12
+ >
13
+ <slot/>
14
+ </div>
File without changes
@@ -0,0 +1,70 @@
1
+ import type { protocol } from 'glass-easel-devtools-agent'
2
+ import { error, warn, debug } from './utils'
3
+
4
+ export { protocol } from 'glass-easel-devtools-agent'
5
+
6
+ export type PanelRecvMessage = protocol.AgentSendMessage
7
+ export type PanelSendMessage = protocol.AgentRecvMessage
8
+
9
+ export interface MessageChannel {
10
+ send(data: PanelSendMessage): void
11
+ recv(listener: (data: PanelRecvMessage) => void): void
12
+ }
13
+
14
+ let messageChannel: MessageChannel | null = null
15
+ const eventHandlers = Object.create(null) as Record<string, (data: any) => void>
16
+ const requestCallbacks = Object.create(null) as Record<number, (data: any) => void>
17
+ let requestIdInc = 1
18
+
19
+ export const setMessageChannel = (mc: MessageChannel) => {
20
+ messageChannel = mc
21
+ messageChannel.recv((data) => {
22
+ if (data.kind === 'event') {
23
+ const handler = eventHandlers[data.name]
24
+ if (!handler) {
25
+ warn(`missing event handler for ${data.name}`)
26
+ } else {
27
+ debug(`recv event`, data.name, data.detail)
28
+ handler(data.detail)
29
+ }
30
+ } else if (data.kind === 'response') {
31
+ const requestId = data.id
32
+ const callback = requestCallbacks[requestId]
33
+ if (!callback) {
34
+ warn(`illegal response for request ${requestId}`)
35
+ } else {
36
+ delete requestCallbacks[requestId]
37
+ debug(`recv response ${requestId}`, data.detail)
38
+ callback(data.detail)
39
+ }
40
+ } else if (data.kind === 'error') {
41
+ const requestId = data.id
42
+ const callback = requestCallbacks[requestId]
43
+ if (!callback) {
44
+ warn(`illegal error response for request ${requestId}`)
45
+ } else {
46
+ error(`request error for request ${requestId}: ${data.message || '(unknown)'}`, data.stack)
47
+ }
48
+ }
49
+ })
50
+ }
51
+
52
+ export const setEventHandler = <T extends keyof protocol.AgentEventKind>(
53
+ name: T,
54
+ handler: (detail: protocol.AgentEventKind[T]['detail']) => void,
55
+ ) => {
56
+ eventHandlers[name] = handler
57
+ }
58
+
59
+ export const sendRequest = <T extends keyof protocol.AgentRequestKind>(
60
+ name: T,
61
+ detail: protocol.AgentRequestKind[T]['request'],
62
+ ): Promise<protocol.AgentRequestKind[T]['response']> => {
63
+ const requestId = requestIdInc
64
+ requestIdInc += 1
65
+ return new Promise((resolve): void => {
66
+ requestCallbacks[requestId] = resolve
67
+ debug(`send request ${requestId}`, name, detail)
68
+ messageChannel?.send({ kind: 'request', id: requestId, name, detail })
69
+ })
70
+ }
@@ -0,0 +1,12 @@
1
+ @common-text: #888;
2
+ @important-text: #222;
3
+ @primary-bg: #eee;
4
+ @secondary-bg: #ccc;
5
+ @selected-bg: #add;
6
+ @hover-bg: #ace;
7
+ @update-bg: #dd8;
8
+
9
+ @tag-name: #408;
10
+ @core-attribute-name: #084;
11
+ @property-name: #06a;
12
+ @attribute-value: #840;
@@ -0,0 +1,7 @@
1
+ {
2
+ "component": true,
3
+ "usingComponents": {
4
+ "value": "./value",
5
+ "detail-section": "./section"
6
+ }
7
+ }