glass-easel 0.2.0 → 0.3.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 (197) hide show
  1. package/.eslintignore +4 -0
  2. package/dist/glass_easel.all.js +2 -2
  3. package/dist/glass_easel.all.js.map +1 -1
  4. package/dist/glass_easel.d.ts +2546 -0
  5. package/dist/glass_easel.domlike.global.js +2 -2
  6. package/dist/glass_easel.domlike.global.js.map +1 -1
  7. package/guide/zh_CN/appendix/backend_protocol.md +164 -74
  8. package/jest.unit.config.js +7 -4
  9. package/package.json +7 -5
  10. package/rollup.config.ts +101 -0
  11. package/src/backend/backend_protocol.ts +26 -345
  12. package/src/backend/composed_backend_protocol.ts +10 -264
  13. package/src/backend/current_window_backend_context.ts +478 -0
  14. package/src/backend/domlike_backend_protocol.ts +9 -498
  15. package/src/backend/empty_backend.ts +265 -0
  16. package/src/backend/empty_composed_backend.ts +245 -0
  17. package/src/backend/index.ts +18 -0
  18. package/src/backend/suggested_backend_protocol.ts +62 -11
  19. package/src/behavior.ts +131 -442
  20. package/src/class_list.ts +328 -222
  21. package/src/component.ts +349 -184
  22. package/src/component_params.ts +54 -25
  23. package/src/component_space.ts +36 -15
  24. package/src/data_path.ts +22 -34
  25. package/src/data_proxy.ts +334 -27
  26. package/src/devtool.ts +89 -0
  27. package/src/element.ts +667 -285
  28. package/src/element_iterator.ts +9 -4
  29. package/src/event.ts +39 -20
  30. package/src/external_shadow_tree.ts +2 -2
  31. package/src/func_arr.ts +55 -101
  32. package/src/global_options.ts +18 -42
  33. package/src/index.ts +72 -73
  34. package/src/mutation_observer.ts +10 -7
  35. package/src/native_node.ts +79 -35
  36. package/src/node.ts +23 -30
  37. package/src/relation.ts +101 -12
  38. package/src/render.ts +5 -3
  39. package/src/selector.ts +9 -7
  40. package/src/shadow_root.ts +96 -240
  41. package/src/template_engine.ts +10 -7
  42. package/src/text_node.ts +43 -19
  43. package/src/tmpl/index.ts +38 -30
  44. package/src/tmpl/native_rendering.ts +14 -21
  45. package/src/tmpl/proc_gen_wrapper.ts +189 -151
  46. package/src/tmpl/proc_gen_wrapper_dom.ts +10 -8
  47. package/src/tmpl/range_list_diff.ts +30 -9
  48. package/src/trait_behaviors.ts +1 -1
  49. package/src/type_symbol.ts +36 -0
  50. package/src/virtual_node.ts +26 -13
  51. package/src/warning.ts +119 -0
  52. package/tests/base/composed_backend.ts +143 -142
  53. package/tests/base/env.ts +76 -3
  54. package/tests/base/match.ts +24 -22
  55. package/tests/base/shadow_backend.ts +917 -0
  56. package/tests/core/backend.test.ts +53 -1
  57. package/tests/core/behavior.test.ts +1 -1
  58. package/tests/core/data_update.test.ts +135 -0
  59. package/tests/core/misc.test.ts +91 -21
  60. package/tests/core/placeholder.test.ts +66 -25
  61. package/tests/core/slot.test.ts +161 -23
  62. package/tests/legacy/component.test.js +152 -78
  63. package/tests/legacy/data_path.test.js +19 -19
  64. package/tests/legacy/data_proxy.test.js +14 -7
  65. package/tests/legacy/external.test.js +8 -8
  66. package/tests/legacy/mutation_observer.test.js +7 -5
  67. package/tests/legacy/slot.test.js +2 -3
  68. package/tests/legacy/virtual.test.js +258 -25
  69. package/tests/tmpl/binding_map.test.ts +201 -195
  70. package/tests/tmpl/event.test.ts +138 -23
  71. package/tests/tmpl/expression.test.ts +15 -15
  72. package/tests/tmpl/lvalue.test.ts +101 -0
  73. package/tests/tmpl/structure.test.ts +486 -43
  74. package/tests/types/chaining.test.ts +27 -30
  75. package/tests/types/createElement.test.ts +5 -4
  76. package/tests/types/definition.test.ts +11 -14
  77. package/tsconfig.json +1 -3
  78. package/dist/glass_easel.all.d.ts +0 -1
  79. package/dist/glass_easel.domlike.global.d.ts +0 -1
  80. package/dist/index.d.ts +0 -1
  81. package/dist/index.js +0 -1
  82. package/dist/types/src/backend/backend_protocol.d.ts +0 -141
  83. package/dist/types/src/backend/backend_protocol.d.ts.map +0 -1
  84. package/dist/types/src/backend/composed_backend_protocol.d.ts +0 -102
  85. package/dist/types/src/backend/composed_backend_protocol.d.ts.map +0 -1
  86. package/dist/types/src/backend/domlike_backend_protocol.d.ts +0 -100
  87. package/dist/types/src/backend/domlike_backend_protocol.d.ts.map +0 -1
  88. package/dist/types/src/backend/mode.d.ts +0 -65
  89. package/dist/types/src/backend/mode.d.ts.map +0 -1
  90. package/dist/types/src/backend/suggested_backend_protocol.d.ts +0 -30
  91. package/dist/types/src/backend/suggested_backend_protocol.d.ts.map +0 -1
  92. package/dist/types/src/behavior.d.ts +0 -434
  93. package/dist/types/src/behavior.d.ts.map +0 -1
  94. package/dist/types/src/class_list.d.ts +0 -83
  95. package/dist/types/src/class_list.d.ts.map +0 -1
  96. package/dist/types/src/component.d.ts +0 -325
  97. package/dist/types/src/component.d.ts.map +0 -1
  98. package/dist/types/src/component_params.d.ts +0 -236
  99. package/dist/types/src/component_params.d.ts.map +0 -1
  100. package/dist/types/src/component_space.d.ts +0 -211
  101. package/dist/types/src/component_space.d.ts.map +0 -1
  102. package/dist/types/src/data_path.d.ts +0 -5
  103. package/dist/types/src/data_path.d.ts.map +0 -1
  104. package/dist/types/src/data_proxy.d.ts +0 -107
  105. package/dist/types/src/data_proxy.d.ts.map +0 -1
  106. package/dist/types/src/data_utils.d.ts +0 -3
  107. package/dist/types/src/data_utils.d.ts.map +0 -1
  108. package/dist/types/src/element.d.ts +0 -365
  109. package/dist/types/src/element.d.ts.map +0 -1
  110. package/dist/types/src/element_iterator.d.ts +0 -43
  111. package/dist/types/src/element_iterator.d.ts.map +0 -1
  112. package/dist/types/src/event.d.ts +0 -105
  113. package/dist/types/src/event.d.ts.map +0 -1
  114. package/dist/types/src/external_shadow_tree.d.ts +0 -20
  115. package/dist/types/src/external_shadow_tree.d.ts.map +0 -1
  116. package/dist/types/src/func_arr.d.ts +0 -39
  117. package/dist/types/src/func_arr.d.ts.map +0 -1
  118. package/dist/types/src/global_options.d.ts +0 -120
  119. package/dist/types/src/global_options.d.ts.map +0 -1
  120. package/dist/types/src/index.d.ts +0 -43
  121. package/dist/types/src/index.d.ts.map +0 -1
  122. package/dist/types/src/mutation_observer.d.ts +0 -79
  123. package/dist/types/src/mutation_observer.d.ts.map +0 -1
  124. package/dist/types/src/native_node.d.ts +0 -11
  125. package/dist/types/src/native_node.d.ts.map +0 -1
  126. package/dist/types/src/node.d.ts +0 -48
  127. package/dist/types/src/node.d.ts.map +0 -1
  128. package/dist/types/src/relation.d.ts +0 -46
  129. package/dist/types/src/relation.d.ts.map +0 -1
  130. package/dist/types/src/render.d.ts +0 -3
  131. package/dist/types/src/render.d.ts.map +0 -1
  132. package/dist/types/src/selector.d.ts +0 -32
  133. package/dist/types/src/selector.d.ts.map +0 -1
  134. package/dist/types/src/shadow_root.d.ts +0 -174
  135. package/dist/types/src/shadow_root.d.ts.map +0 -1
  136. package/dist/types/src/template_engine.d.ts +0 -56
  137. package/dist/types/src/template_engine.d.ts.map +0 -1
  138. package/dist/types/src/text_node.d.ts +0 -44
  139. package/dist/types/src/text_node.d.ts.map +0 -1
  140. package/dist/types/src/tmpl/index.d.ts +0 -19
  141. package/dist/types/src/tmpl/index.d.ts.map +0 -1
  142. package/dist/types/src/tmpl/native_rendering.d.ts +0 -45
  143. package/dist/types/src/tmpl/native_rendering.d.ts.map +0 -1
  144. package/dist/types/src/tmpl/proc_gen_wrapper.d.ts +0 -89
  145. package/dist/types/src/tmpl/proc_gen_wrapper.d.ts.map +0 -1
  146. package/dist/types/src/tmpl/proc_gen_wrapper_dom.d.ts +0 -50
  147. package/dist/types/src/tmpl/proc_gen_wrapper_dom.d.ts.map +0 -1
  148. package/dist/types/src/tmpl/range_list_diff.d.ts +0 -19
  149. package/dist/types/src/tmpl/range_list_diff.d.ts.map +0 -1
  150. package/dist/types/src/trait_behaviors.d.ts +0 -38
  151. package/dist/types/src/trait_behaviors.d.ts.map +0 -1
  152. package/dist/types/src/virtual_node.d.ts +0 -10
  153. package/dist/types/src/virtual_node.d.ts.map +0 -1
  154. package/dist/types/tests/backend/domlike.test.d.ts +0 -2
  155. package/dist/types/tests/backend/domlike.test.d.ts.map +0 -1
  156. package/dist/types/tests/base/composed_backend.d.ts +0 -123
  157. package/dist/types/tests/base/composed_backend.d.ts.map +0 -1
  158. package/dist/types/tests/base/env.d.ts +0 -30
  159. package/dist/types/tests/base/env.d.ts.map +0 -1
  160. package/dist/types/tests/base/match.d.ts +0 -9
  161. package/dist/types/tests/base/match.d.ts.map +0 -1
  162. package/dist/types/tests/core/backend.test.d.ts +0 -2
  163. package/dist/types/tests/core/backend.test.d.ts.map +0 -1
  164. package/dist/types/tests/core/behavior.test.d.ts +0 -2
  165. package/dist/types/tests/core/behavior.test.d.ts.map +0 -1
  166. package/dist/types/tests/core/component_space.test.d.ts +0 -2
  167. package/dist/types/tests/core/component_space.test.d.ts.map +0 -1
  168. package/dist/types/tests/core/data_update.test.d.ts +0 -2
  169. package/dist/types/tests/core/data_update.test.d.ts.map +0 -1
  170. package/dist/types/tests/core/misc.test.d.ts +0 -2
  171. package/dist/types/tests/core/misc.test.d.ts.map +0 -1
  172. package/dist/types/tests/core/placeholder.test.d.ts +0 -2
  173. package/dist/types/tests/core/placeholder.test.d.ts.map +0 -1
  174. package/dist/types/tests/core/slot.test.d.ts +0 -2
  175. package/dist/types/tests/core/slot.test.d.ts.map +0 -1
  176. package/dist/types/tests/core/trait_behaviors.test.d.ts +0 -2
  177. package/dist/types/tests/core/trait_behaviors.test.d.ts.map +0 -1
  178. package/dist/types/tests/tmpl/binding_map.test.d.ts +0 -2
  179. package/dist/types/tests/tmpl/binding_map.test.d.ts.map +0 -1
  180. package/dist/types/tests/tmpl/event.test.d.ts +0 -2
  181. package/dist/types/tests/tmpl/event.test.d.ts.map +0 -1
  182. package/dist/types/tests/tmpl/expression.test.d.ts +0 -2
  183. package/dist/types/tests/tmpl/expression.test.d.ts.map +0 -1
  184. package/dist/types/tests/tmpl/lvalue.test.d.ts +0 -2
  185. package/dist/types/tests/tmpl/lvalue.test.d.ts.map +0 -1
  186. package/dist/types/tests/tmpl/native_rendering.test.d.ts +0 -2
  187. package/dist/types/tests/tmpl/native_rendering.test.d.ts.map +0 -1
  188. package/dist/types/tests/tmpl/structure.test.d.ts +0 -2
  189. package/dist/types/tests/tmpl/structure.test.d.ts.map +0 -1
  190. package/dist/types/tests/types/chaining.test.d.ts +0 -2
  191. package/dist/types/tests/types/chaining.test.d.ts.map +0 -1
  192. package/dist/types/tests/types/createElement.test.d.ts +0 -2
  193. package/dist/types/tests/types/createElement.test.d.ts.map +0 -1
  194. package/dist/types/tests/types/definition.test.d.ts +0 -2
  195. package/dist/types/tests/types/definition.test.d.ts.map +0 -1
  196. package/webpack.config.js +0 -275
  197. /package/src/backend/{mode.ts → shared.ts} +0 -0
@@ -1,39 +1,52 @@
1
+ import { BM, BackendMode, type GeneralBackendContext } from './backend'
2
+ import { performanceMeasureEnd, performanceMeasureStart } from './devtool'
1
3
  import { Element } from './element'
2
- import { ShadowRoot } from './shadow_root'
3
- import { BM, BackendMode } from './backend/mode'
4
- import { GeneralBackendContext, GeneralBackendElement } from './node'
5
- import * as backend from './backend/backend_protocol'
4
+ import { ENV } from './global_options'
5
+ import { type ShadowRoot } from './shadow_root'
6
+ import { VIRTUAL_NODE_SYMBOL, isVirtualNode } from './type_symbol'
6
7
 
7
8
  export class VirtualNode extends Element {
9
+ [VIRTUAL_NODE_SYMBOL]: true
8
10
  is: string
9
11
 
12
+ /* istanbul ignore next */
10
13
  constructor() {
11
14
  throw new Error('Element cannot be constructed directly')
12
15
  // eslint-disable-next-line no-unreachable
13
16
  super()
14
17
  }
15
18
 
19
+ /* @internal */
16
20
  protected _$initializeVirtual(
17
21
  virtualName: string,
18
22
  owner: ShadowRoot,
19
- nodeTreeContext: GeneralBackendContext,
20
- backendElement: GeneralBackendElement | null,
23
+ nodeTreeContext: GeneralBackendContext | null,
21
24
  ) {
22
25
  this.is = String(virtualName)
23
- if (BM.SHADOW || (BM.DYNAMIC && nodeTreeContext.mode === BackendMode.Shadow)) {
24
- const shadowRoot = owner._$backendShadowRoot
25
- const be =
26
- (backendElement as backend.Element) || shadowRoot?.createVirtualNode(virtualName) || null
26
+ if (
27
+ nodeTreeContext &&
28
+ (BM.SHADOW || (BM.DYNAMIC && nodeTreeContext.mode === BackendMode.Shadow))
29
+ ) {
30
+ const shadowRoot = owner._$backendShadowRoot!
31
+ if (ENV.DEV) performanceMeasureStart('backend.createVirtualNode')
32
+ const be = shadowRoot.createVirtualNode(virtualName)
33
+ if (ENV.DEV) performanceMeasureEnd()
27
34
  this._$initialize(true, be, owner, nodeTreeContext)
28
- be?.associateValue(this)
35
+ if (ENV.DEV) performanceMeasureStart('backend.associateValue')
36
+ be.associateValue(this)
37
+ if (ENV.DEV) performanceMeasureEnd()
29
38
  } else {
30
- this._$initialize(true, backendElement, owner, nodeTreeContext)
39
+ this._$initialize(true, null, owner, owner._$nodeTreeContext)
31
40
  }
32
41
  }
33
42
 
43
+ static isVirtualNode = isVirtualNode
44
+
34
45
  static create(virtualName: string, owner: ShadowRoot): VirtualNode {
35
46
  const node = Object.create(VirtualNode.prototype) as VirtualNode
36
- node._$initializeVirtual(virtualName, owner, owner._$nodeTreeContext, null)
47
+ node._$initializeVirtual(virtualName, owner, owner.getBackendContext())
37
48
  return node
38
49
  }
39
50
  }
51
+
52
+ VirtualNode.prototype[VIRTUAL_NODE_SYMBOL] = true
package/src/warning.ts ADDED
@@ -0,0 +1,119 @@
1
+ import { type AnyComponent, type GeneralComponent } from './component'
2
+ import { FuncArr, _setErrorDispatcher } from './func_arr'
3
+ import { globalOptions } from './global_options'
4
+ import { type Node, dumpSingleElementToString } from './node'
5
+ import { isComponent } from './type_symbol'
6
+
7
+ let insideErrorHandler = false
8
+
9
+ const errorFuncArr = new FuncArr<ErrorListener>('error')
10
+ const warningFuncArr = new FuncArr<WarningListener>('warning')
11
+
12
+ _setErrorDispatcher(dispatchError)
13
+
14
+ export type ErrorListener = (
15
+ error: unknown,
16
+ method?: string,
17
+ relatedComponent?: GeneralComponent | string,
18
+ element?: Node,
19
+ ) => boolean | void
20
+
21
+ export type WarningListener = (
22
+ message: string,
23
+ relatedComponent: GeneralComponent | string,
24
+ element?: Node,
25
+ ) => boolean | void
26
+
27
+ export function dispatchError(
28
+ err: unknown,
29
+ method?: string,
30
+ relatedComponent?: AnyComponent | string,
31
+ element?: Node,
32
+ ) {
33
+ if (!insideErrorHandler) {
34
+ insideErrorHandler = true
35
+ if (isComponent(relatedComponent)) {
36
+ relatedComponent.triggerLifetime('error', [err])
37
+ }
38
+ const shouldBreak =
39
+ errorFuncArr.call(err as any, [err, method, relatedComponent, element]) === false
40
+ insideErrorHandler = false
41
+ if (shouldBreak) return
42
+ }
43
+ if (globalOptions.throwGlobalError) {
44
+ throw err
45
+ } else {
46
+ // eslint-disable-next-line no-console
47
+ console.error(
48
+ [
49
+ err instanceof Error ? `${err.message}` : String(err),
50
+ element ? `\t@${dumpSingleElementToString(element)}` : undefined,
51
+ relatedComponent
52
+ ? `\t${method || ''}@${
53
+ typeof relatedComponent === 'string'
54
+ ? `<${relatedComponent}>`
55
+ : dumpSingleElementToString(relatedComponent || false)
56
+ }`
57
+ : undefined,
58
+ ]
59
+ .filter(Boolean)
60
+ .join('\n'),
61
+ )
62
+ }
63
+ }
64
+
65
+ export function triggerWarning(
66
+ msg: string,
67
+ relatedComponent?: AnyComponent | string,
68
+ element?: Node,
69
+ ) {
70
+ if (warningFuncArr.call(null, [msg, relatedComponent || '', element])) {
71
+ // eslint-disable-next-line no-console
72
+ console.warn(msg)
73
+ }
74
+ }
75
+
76
+ export class ThirdError extends Error {
77
+ constructor(
78
+ message: string,
79
+ public additionalStack?: string,
80
+ public relatedComponent?: AnyComponent | string,
81
+ public element?: Node,
82
+ ) {
83
+ super(message)
84
+ dispatchError(this, additionalStack, relatedComponent, element)
85
+ }
86
+ }
87
+
88
+ export function addGlobalErrorListener(func: ErrorListener) {
89
+ errorFuncArr.add(func)
90
+ }
91
+
92
+ export function removeGlobalErrorListener(func: ErrorListener) {
93
+ errorFuncArr.remove(func)
94
+ }
95
+
96
+ export function addGlobalWarningListener(func: WarningListener) {
97
+ warningFuncArr.add(func)
98
+ }
99
+
100
+ export function removeGlobalWarningListener(func: WarningListener) {
101
+ warningFuncArr.remove(func)
102
+ }
103
+
104
+ export function safeCallback<F extends (this: any, ...args: any[]) => any>(
105
+ this: void,
106
+ type: string,
107
+ method: F,
108
+ caller: ThisParameterType<F>,
109
+ args: Parameters<F>,
110
+ relatedComponent?: AnyComponent,
111
+ ): ReturnType<F> | undefined {
112
+ try {
113
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
114
+ return method.apply(caller, args)
115
+ } catch (e) {
116
+ dispatchError(e, `${type || 'Listener'} ${method.name || '(anonymous)'}`, relatedComponent)
117
+ return undefined
118
+ }
119
+ }