glass-easel 0.1.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 (237) hide show
  1. package/README.md +40 -0
  2. package/dist/glass_easel.all.d.ts +1 -0
  3. package/dist/glass_easel.all.js +2 -0
  4. package/dist/glass_easel.all.js.map +1 -0
  5. package/dist/glass_easel.domlike.global.d.ts +1 -0
  6. package/dist/glass_easel.domlike.global.js +2 -0
  7. package/dist/glass_easel.domlike.global.js.map +1 -0
  8. package/dist/index.d.ts +1 -0
  9. package/dist/index.js +1 -0
  10. package/dist/types/src/backend/backend_protocol.d.ts +119 -0
  11. package/dist/types/src/backend/backend_protocol.d.ts.map +1 -0
  12. package/dist/types/src/backend/composed_backend_protocol.d.ts +90 -0
  13. package/dist/types/src/backend/composed_backend_protocol.d.ts.map +1 -0
  14. package/dist/types/src/backend/domlike_backend_protocol.d.ts +76 -0
  15. package/dist/types/src/backend/domlike_backend_protocol.d.ts.map +1 -0
  16. package/dist/types/src/backend/mode.d.ts +46 -0
  17. package/dist/types/src/backend/mode.d.ts.map +1 -0
  18. package/dist/types/src/backend/suggested_backend_protocol.d.ts +30 -0
  19. package/dist/types/src/backend/suggested_backend_protocol.d.ts.map +1 -0
  20. package/dist/types/src/behavior.d.ts +428 -0
  21. package/dist/types/src/behavior.d.ts.map +1 -0
  22. package/dist/types/src/class_list.d.ts +79 -0
  23. package/dist/types/src/class_list.d.ts.map +1 -0
  24. package/dist/types/src/component.d.ts +291 -0
  25. package/dist/types/src/component.d.ts.map +1 -0
  26. package/dist/types/src/component_params.d.ts +239 -0
  27. package/dist/types/src/component_params.d.ts.map +1 -0
  28. package/dist/types/src/component_space.d.ts +164 -0
  29. package/dist/types/src/component_space.d.ts.map +1 -0
  30. package/dist/types/src/data_path.d.ts +5 -0
  31. package/dist/types/src/data_path.d.ts.map +1 -0
  32. package/dist/types/src/data_proxy.d.ts +107 -0
  33. package/dist/types/src/data_proxy.d.ts.map +1 -0
  34. package/dist/types/src/data_utils.d.ts +3 -0
  35. package/dist/types/src/data_utils.d.ts.map +1 -0
  36. package/dist/types/src/element.d.ts +275 -0
  37. package/dist/types/src/element.d.ts.map +1 -0
  38. package/dist/types/src/element_iterator.d.ts +43 -0
  39. package/dist/types/src/element_iterator.d.ts.map +1 -0
  40. package/dist/types/src/event.d.ts +104 -0
  41. package/dist/types/src/event.d.ts.map +1 -0
  42. package/dist/types/src/external_shadow_tree.d.ts +20 -0
  43. package/dist/types/src/external_shadow_tree.d.ts.map +1 -0
  44. package/dist/types/src/func_arr.d.ts +39 -0
  45. package/dist/types/src/func_arr.d.ts.map +1 -0
  46. package/dist/types/src/global_options.d.ts +111 -0
  47. package/dist/types/src/global_options.d.ts.map +1 -0
  48. package/dist/types/src/index.d.ts +43 -0
  49. package/dist/types/src/index.d.ts.map +1 -0
  50. package/dist/types/src/mutation_observer.d.ts +79 -0
  51. package/dist/types/src/mutation_observer.d.ts.map +1 -0
  52. package/dist/types/src/native_node.d.ts +8 -0
  53. package/dist/types/src/native_node.d.ts.map +1 -0
  54. package/dist/types/src/node.d.ts +49 -0
  55. package/dist/types/src/node.d.ts.map +1 -0
  56. package/dist/types/src/relation.d.ts +47 -0
  57. package/dist/types/src/relation.d.ts.map +1 -0
  58. package/dist/types/src/render.d.ts +3 -0
  59. package/dist/types/src/render.d.ts.map +1 -0
  60. package/dist/types/src/selector.d.ts +32 -0
  61. package/dist/types/src/selector.d.ts.map +1 -0
  62. package/dist/types/src/shadow_root.d.ts +136 -0
  63. package/dist/types/src/shadow_root.d.ts.map +1 -0
  64. package/dist/types/src/template_engine.d.ts +18 -0
  65. package/dist/types/src/template_engine.d.ts.map +1 -0
  66. package/dist/types/src/text_node.d.ts +32 -0
  67. package/dist/types/src/text_node.d.ts.map +1 -0
  68. package/dist/types/src/tmpl/index.d.ts +18 -0
  69. package/dist/types/src/tmpl/index.d.ts.map +1 -0
  70. package/dist/types/src/tmpl/native_rendering.d.ts +45 -0
  71. package/dist/types/src/tmpl/native_rendering.d.ts.map +1 -0
  72. package/dist/types/src/tmpl/proc_gen_wrapper.d.ts +80 -0
  73. package/dist/types/src/tmpl/proc_gen_wrapper.d.ts.map +1 -0
  74. package/dist/types/src/tmpl/proc_gen_wrapper_dom.d.ts +50 -0
  75. package/dist/types/src/tmpl/proc_gen_wrapper_dom.d.ts.map +1 -0
  76. package/dist/types/src/tmpl/range_list_diff.d.ts +19 -0
  77. package/dist/types/src/tmpl/range_list_diff.d.ts.map +1 -0
  78. package/dist/types/src/trait_behaviors.d.ts +38 -0
  79. package/dist/types/src/trait_behaviors.d.ts.map +1 -0
  80. package/dist/types/src/virtual_node.d.ts +10 -0
  81. package/dist/types/src/virtual_node.d.ts.map +1 -0
  82. package/dist/types/tests/backend/domlike.test.d.ts +2 -0
  83. package/dist/types/tests/backend/domlike.test.d.ts.map +1 -0
  84. package/dist/types/tests/base/env.d.ts +29 -0
  85. package/dist/types/tests/base/env.d.ts.map +1 -0
  86. package/dist/types/tests/base/match.d.ts +9 -0
  87. package/dist/types/tests/base/match.d.ts.map +1 -0
  88. package/dist/types/tests/core/backend.test.d.ts +2 -0
  89. package/dist/types/tests/core/backend.test.d.ts.map +1 -0
  90. package/dist/types/tests/core/behavior.test.d.ts +2 -0
  91. package/dist/types/tests/core/behavior.test.d.ts.map +1 -0
  92. package/dist/types/tests/core/component_space.test.d.ts +2 -0
  93. package/dist/types/tests/core/component_space.test.d.ts.map +1 -0
  94. package/dist/types/tests/core/data_update.test.d.ts +2 -0
  95. package/dist/types/tests/core/data_update.test.d.ts.map +1 -0
  96. package/dist/types/tests/core/misc.test.d.ts +2 -0
  97. package/dist/types/tests/core/misc.test.d.ts.map +1 -0
  98. package/dist/types/tests/core/placeholder.test.d.ts +2 -0
  99. package/dist/types/tests/core/placeholder.test.d.ts.map +1 -0
  100. package/dist/types/tests/core/slot.test.d.ts +2 -0
  101. package/dist/types/tests/core/slot.test.d.ts.map +1 -0
  102. package/dist/types/tests/core/trait_behaviors.test.d.ts +2 -0
  103. package/dist/types/tests/core/trait_behaviors.test.d.ts.map +1 -0
  104. package/dist/types/tests/tmpl/binding_map.test.d.ts +2 -0
  105. package/dist/types/tests/tmpl/binding_map.test.d.ts.map +1 -0
  106. package/dist/types/tests/tmpl/event.test.d.ts +2 -0
  107. package/dist/types/tests/tmpl/event.test.d.ts.map +1 -0
  108. package/dist/types/tests/tmpl/expression.test.d.ts +2 -0
  109. package/dist/types/tests/tmpl/expression.test.d.ts.map +1 -0
  110. package/dist/types/tests/tmpl/lvalue.test.d.ts +2 -0
  111. package/dist/types/tests/tmpl/lvalue.test.d.ts.map +1 -0
  112. package/dist/types/tests/tmpl/native_rendering.test.d.ts +2 -0
  113. package/dist/types/tests/tmpl/native_rendering.test.d.ts.map +1 -0
  114. package/dist/types/tests/tmpl/structure.test.d.ts +2 -0
  115. package/dist/types/tests/tmpl/structure.test.d.ts.map +1 -0
  116. package/dist/types/tests/types/chaining.test.d.ts +2 -0
  117. package/dist/types/tests/types/chaining.test.d.ts.map +1 -0
  118. package/dist/types/tests/types/createElement.test.d.ts +2 -0
  119. package/dist/types/tests/types/createElement.test.d.ts.map +1 -0
  120. package/dist/types/tests/types/definition.test.d.ts +2 -0
  121. package/dist/types/tests/types/definition.test.d.ts.map +1 -0
  122. package/guide/zh_CN/advanced/binding_map_update.md +32 -0
  123. package/guide/zh_CN/advanced/build_args.md +28 -0
  124. package/guide/zh_CN/advanced/component_filter.md +70 -0
  125. package/guide/zh_CN/advanced/component_space.md +124 -0
  126. package/guide/zh_CN/advanced/custom_backend.md +53 -0
  127. package/guide/zh_CN/advanced/error_listener.md +32 -0
  128. package/guide/zh_CN/advanced/external_component.md +73 -0
  129. package/guide/zh_CN/advanced/template_engine.md +61 -0
  130. package/guide/zh_CN/appendix/backend_protocol.md +501 -0
  131. package/guide/zh_CN/appendix/list_diff_algorithm.md +406 -0
  132. package/guide/zh_CN/basic/beginning.md +94 -0
  133. package/guide/zh_CN/basic/component.md +156 -0
  134. package/guide/zh_CN/basic/event.md +169 -0
  135. package/guide/zh_CN/basic/lifetime.md +66 -0
  136. package/guide/zh_CN/basic/method.md +62 -0
  137. package/guide/zh_CN/basic/template.md +135 -0
  138. package/guide/zh_CN/data_management/advanced_update.md +170 -0
  139. package/guide/zh_CN/data_management/data_deep_copy.md +157 -0
  140. package/guide/zh_CN/data_management/data_observer.md +154 -0
  141. package/guide/zh_CN/data_management/property_early_init.md +31 -0
  142. package/guide/zh_CN/data_management/pure_data_pattern.md +21 -0
  143. package/guide/zh_CN/index.md +93 -0
  144. package/guide/zh_CN/interaction/behavior.md +52 -0
  145. package/guide/zh_CN/interaction/component_path.md +37 -0
  146. package/guide/zh_CN/interaction/generic.md +73 -0
  147. package/guide/zh_CN/interaction/placeholder.md +40 -0
  148. package/guide/zh_CN/interaction/relation.md +151 -0
  149. package/guide/zh_CN/interaction/slot.md +137 -0
  150. package/guide/zh_CN/interaction/template_import.md +94 -0
  151. package/guide/zh_CN/interaction/trait_behavior.md +117 -0
  152. package/guide/zh_CN/styling/external_class.md +46 -0
  153. package/guide/zh_CN/styling/style_isolation.md +54 -0
  154. package/guide/zh_CN/styling/virtual_host.md +52 -0
  155. package/guide/zh_CN/tree/element_iterator.md +54 -0
  156. package/guide/zh_CN/tree/mutation_observer.md +52 -0
  157. package/guide/zh_CN/tree/node_tree.md +142 -0
  158. package/guide/zh_CN/tree/node_tree_modification.md +78 -0
  159. package/guide/zh_CN/tree/selector.md +66 -0
  160. package/jest.config.js +6 -0
  161. package/jest.dts.config.js +9 -0
  162. package/jest.unit.config.js +14 -0
  163. package/package.json +28 -0
  164. package/src/backend/backend_protocol.ts +313 -0
  165. package/src/backend/composed_backend_protocol.ts +252 -0
  166. package/src/backend/domlike_backend_protocol.ts +370 -0
  167. package/src/backend/mode.ts +51 -0
  168. package/src/backend/suggested_backend_protocol.ts +83 -0
  169. package/src/behavior.ts +1655 -0
  170. package/src/bootstrap_dom_dev.js +22 -0
  171. package/src/class_list.ts +376 -0
  172. package/src/component.ts +1309 -0
  173. package/src/component_params.ts +461 -0
  174. package/src/component_space.ts +547 -0
  175. package/src/data_path.ts +225 -0
  176. package/src/data_proxy.ts +670 -0
  177. package/src/data_utils.ts +50 -0
  178. package/src/element.ts +1966 -0
  179. package/src/element_iterator.ts +158 -0
  180. package/src/event.ts +401 -0
  181. package/src/external_shadow_tree.ts +27 -0
  182. package/src/func_arr.ts +198 -0
  183. package/src/global_options.ts +242 -0
  184. package/src/index.ts +187 -0
  185. package/src/mutation_observer.ts +252 -0
  186. package/src/native_node.ts +74 -0
  187. package/src/node.ts +174 -0
  188. package/src/relation.ts +380 -0
  189. package/src/render.ts +25 -0
  190. package/src/selector.ts +218 -0
  191. package/src/shadow_root.ts +766 -0
  192. package/src/template_engine.ts +45 -0
  193. package/src/text_node.ts +149 -0
  194. package/src/tmpl/index.ts +199 -0
  195. package/src/tmpl/native_rendering.ts +175 -0
  196. package/src/tmpl/proc_gen_wrapper.ts +954 -0
  197. package/src/tmpl/proc_gen_wrapper_dom.ts +230 -0
  198. package/src/tmpl/range_list_diff.ts +443 -0
  199. package/src/trait_behaviors.ts +51 -0
  200. package/src/virtual_node.ts +51 -0
  201. package/tests/backend/domlike.test.ts +254 -0
  202. package/tests/base/env.ts +78 -0
  203. package/tests/base/match.ts +185 -0
  204. package/tests/core/backend.test.ts +144 -0
  205. package/tests/core/behavior.test.ts +546 -0
  206. package/tests/core/component_space.test.ts +212 -0
  207. package/tests/core/data_update.test.ts +461 -0
  208. package/tests/core/misc.test.ts +339 -0
  209. package/tests/core/placeholder.test.ts +180 -0
  210. package/tests/core/slot.test.ts +1495 -0
  211. package/tests/core/trait_behaviors.test.ts +153 -0
  212. package/tests/legacy/README.md +3 -0
  213. package/tests/legacy/behavior.test.js +293 -0
  214. package/tests/legacy/component.test.js +1247 -0
  215. package/tests/legacy/data_path.test.js +149 -0
  216. package/tests/legacy/data_proxy.test.js +759 -0
  217. package/tests/legacy/element_iterator.test.js +148 -0
  218. package/tests/legacy/event.test.js +849 -0
  219. package/tests/legacy/external.test.js +510 -0
  220. package/tests/legacy/extra_info.test.js +109 -0
  221. package/tests/legacy/generics.test.js +176 -0
  222. package/tests/legacy/mutation_observer.test.js +210 -0
  223. package/tests/legacy/relation.test.js +517 -0
  224. package/tests/legacy/selector.test.js +263 -0
  225. package/tests/legacy/slot.test.js +915 -0
  226. package/tests/legacy/virtual.test.js +394 -0
  227. package/tests/tmpl/binding_map.test.ts +208 -0
  228. package/tests/tmpl/event.test.ts +206 -0
  229. package/tests/tmpl/expression.test.ts +429 -0
  230. package/tests/tmpl/lvalue.test.ts +160 -0
  231. package/tests/tmpl/native_rendering.test.ts +155 -0
  232. package/tests/tmpl/structure.test.ts +998 -0
  233. package/tests/types/chaining.test.ts +614 -0
  234. package/tests/types/createElement.test.ts +82 -0
  235. package/tests/types/definition.test.ts +442 -0
  236. package/tsconfig.json +11 -0
  237. package/webpack.config.js +270 -0
@@ -0,0 +1,461 @@
1
+ import {
2
+ GeneralBehavior,
3
+ Component,
4
+ GeneralComponentDefinition,
5
+ ComponentOptions,
6
+ GeneralComponent,
7
+ GeneralBehaviorBuilder,
8
+ } from '.'
9
+ import { TraitBehavior } from './trait_behaviors'
10
+
11
+ export type Empty = Record<never, never>;
12
+
13
+ export type NewField<TObject, TField extends string, TValueType> = Extract<
14
+ keyof TObject,
15
+ TField
16
+ > extends never
17
+ ? TValueType
18
+ : never;
19
+
20
+ export type NewFieldList<TObject, TNewObject> = Extract<
21
+ keyof TObject,
22
+ keyof TNewObject
23
+ > extends never
24
+ ? TNewObject
25
+ : never;
26
+
27
+ export type Equal<X, Y> = (<T>() => T extends X ? 1 : 2) extends <
28
+ T
29
+ >() => T extends Y ? 1 : 2
30
+ ? true
31
+ : false;
32
+
33
+ /**
34
+ * UnionToIntersection<'foo' | 42 | true> = 'foo' & 42 & true
35
+ * UnionToIntersection<(() => 'foo') | ((i: 42) => true)> = (() => 'foo') & ((i: 42) => true)
36
+ */
37
+ export type UnionToIntersection<T> = (
38
+ T extends unknown ? (arg: T) => void : never
39
+ ) extends (args: infer Arg) => void
40
+ ? Arg
41
+ : never;
42
+
43
+ /**
44
+ * Merge<{ foo: string }, { bar: number }> = { foo: string, bar: number }
45
+ */
46
+ export type Merge<U> = U extends infer T ? { [K in keyof T]: T[K] } : never;
47
+
48
+ /**
49
+ * IsAny<any> = true
50
+ * IsAny<{}> = false
51
+ */
52
+ export type IsAny<T> = (<S>(S: S) => S extends T ? 1 : 2) extends <R>(
53
+ R: R
54
+ ) => R extends any ? 1 : 2
55
+ ? true
56
+ : false;
57
+
58
+ /**
59
+ * IsNever<never> = true
60
+ * IsNever<unknown> = false
61
+ * IsNever<any> = false
62
+ */
63
+ export type IsNever<T> = [T] extends [never] ? true : false;
64
+
65
+ type SetDataStringPath<K extends string | number, Prefix extends string> = [
66
+ Prefix
67
+ ] extends [never]
68
+ ? `${K}`
69
+ : K extends number
70
+ ? `${Prefix}[${K}]`
71
+ : `${Prefix}.${K}`;
72
+
73
+ /**
74
+ * SetDataSetter<{ name: string; foo: { bar: number } }> = {
75
+ * name: string,
76
+ * foo: { bar: number },
77
+ * 'foo.bar': number,
78
+ * }
79
+ * setDataSetter<{ list: number[], foo: { bar: number }[]}> = {
80
+ * list: number[],
81
+ * `list[${number}]`: number,
82
+ * foo: { bar: number }[],
83
+ * `foo[${number}]`: { bar: number }[],
84
+ * `foo[${number}].bar`: number,
85
+ * }
86
+ */
87
+ export type SetDataSetter<
88
+ T,
89
+ Prefix extends string = never
90
+ > = IsAny<T> extends true
91
+ ? Record<SetDataStringPath<any, Prefix>, T>
92
+ : UnionToIntersection<
93
+ T extends any[]
94
+ ? {
95
+ [P in keyof T & number]: SetDataSetter<
96
+ T[P],
97
+ SetDataStringPath<P, Prefix>
98
+ > &
99
+ Record<SetDataStringPath<P, Prefix>, T[P]>;
100
+ }[keyof T & number]
101
+ : T extends Record<string | number, any>
102
+ ? {
103
+ [P in keyof T & (string | number)]: SetDataSetter<
104
+ T[P],
105
+ SetDataStringPath<P, Prefix>
106
+ > &
107
+ Record<SetDataStringPath<P, Prefix>, T[P]>;
108
+ }[keyof T & (string | number)]
109
+ : never
110
+ >;
111
+
112
+ /**
113
+ * DeepReadonly<{ foo: { bar: number } }> = {
114
+ * readonly foo: {
115
+ * readonly bar: number
116
+ * }
117
+ * }
118
+ */
119
+ export type DeepReadonly<T> = T extends Record<any, any>
120
+ ? T extends (...args: any[]) => any
121
+ ? T
122
+ : { readonly [P in keyof T]: DeepReadonly<T[P]> }
123
+ : T;
124
+
125
+ export type PublicFields<T> = {
126
+ [K in keyof T as K extends `_$${any}` ? never : K]: T[K];
127
+ };
128
+
129
+ /**
130
+ * ObjectKeyPaths<{ name: string; age: number }> = 'name' | 'age'
131
+ * ObjectKeyPaths<{
132
+ * refCount: number;
133
+ * person: { name: string; age: number };
134
+ * }> = 'refCount' | 'person' | 'person.name' | 'person.age'
135
+ * ObjectKeyPaths<{ books: [{ name: string; price: number }] }> =
136
+ * 'books' | `books[${number}]` | `books[${number}].name` | `books[${number}].price`
137
+ */
138
+ export type ObjectDataPathStrings<
139
+ T,
140
+ Prefix extends string = never
141
+ > = IsAny<T> extends true
142
+ ? SetDataStringPath<any, Prefix>
143
+ : T extends any[]
144
+ ? {
145
+ [P in keyof T & number]:
146
+ | SetDataStringPath<P, Prefix>
147
+ | ObjectDataPathStrings<T[P], SetDataStringPath<P, Prefix>>;
148
+ }[keyof T & number]
149
+ : T extends Record<string | number, any>
150
+ ? {
151
+ [P in keyof T & (string | number)]:
152
+ | SetDataStringPath<P, Prefix>
153
+ | ObjectDataPathStrings<T[P], SetDataStringPath<P, Prefix>>;
154
+ }[keyof T & (string | number)]
155
+ : Prefix;
156
+
157
+ export type ObserverDataPathStrings<
158
+ T,
159
+ S extends string = ObjectDataPathStrings<T>
160
+ > = '**' | S | `${S}.**`;
161
+
162
+ /**
163
+ * GetFromDataPathString<{ name: string; age: number }, 'name'> = string
164
+ * GetFromDataPathString<{ person: { name: string; age: number } }, 'person.name'> = string
165
+ * GetFromDataPathString<{ books: [{ name: string; price: number }] }, 'books[0].name'> = string
166
+ */
167
+ export type GetFromDataPathString<T, P extends string> = P extends keyof T
168
+ ? T[P]
169
+ : P extends ''
170
+ ? T
171
+ : P extends `[${infer K extends keyof T & number}].${infer R}`
172
+ ? GetFromDataPathString<T[K], R>
173
+ : P extends `[${infer K extends keyof T & number}]${infer R}`
174
+ ? GetFromDataPathString<T[K], R>
175
+ : P extends `${infer K extends keyof T & string}[${infer R}`
176
+ ? GetFromDataPathString<T[K], `[${R}`>
177
+ : P extends `${infer K extends keyof T & string}.${infer R}`
178
+ ? GetFromDataPathString<T[K], R>
179
+ : never;
180
+
181
+ export type GetFromObserverPathString<T, P extends string> = P extends '**'
182
+ ? GetFromDataPathString<T, ''>
183
+ : P extends `${infer K}.**`
184
+ ? GetFromDataPathString<T, K>
185
+ : GetFromDataPathString<T, P>;
186
+
187
+ /**
188
+ * GetFromDataPath<{ foo: { bar: number } }, ['foo', 'bar']> = number
189
+ * GetFromDataPath<{ list: { bar: number }[] }, ['list', 0, 'bar']> = number
190
+ * GetFromDataPath<{ list: number }, ['nonExists']> = never
191
+ */
192
+ export type GetFromDataPath<
193
+ T,
194
+ K extends readonly (string | number)[]
195
+ > = K extends [infer F, ...infer R extends (string | number)[]]
196
+ ? F extends keyof T
197
+ ? GetFromDataPath<T[F], R>
198
+ : never
199
+ : T;
200
+
201
+ declare const TaggedSymbol: unique symbol
202
+ type Tagged = typeof TaggedSymbol;
203
+
204
+ type IfNeverOrAny<T, Replacement> = [T] extends [never]
205
+ ? Replacement
206
+ : 1 extends T & 0
207
+ ? Replacement
208
+ : T;
209
+
210
+ type GetTags<B> = B extends {
211
+ readonly [Tag in Tagged]: infer Tags extends symbol[];
212
+ }
213
+ ? Tags
214
+ : [];
215
+
216
+ type GetTagsWithout<B, T extends symbol, Tags = GetTags<B>> = Tags extends [
217
+ infer F,
218
+ ...infer R
219
+ ]
220
+ ? Equal<T, F> extends true
221
+ ? GetTagsWithout<B, T, R>
222
+ : [F, ...GetTagsWithout<B, T, R>]
223
+ : [];
224
+
225
+ type UnTagAll<B> = Tagged extends keyof IfNeverOrAny<B, unknown>
226
+ ? B extends infer Origin & { readonly [Tag in Tagged]: GetTags<B> }
227
+ ? Origin
228
+ : B
229
+ : B;
230
+
231
+ export type Tag<B, T extends symbol> = [IfNeverOrAny<B, unknown>] extends [
232
+ null | undefined
233
+ ]
234
+ ? B
235
+ : UnTagAll<B> & { readonly [Tag in Tagged]: [...GetTags<B>, T] };
236
+
237
+ export type UnTag<
238
+ B,
239
+ T extends symbol,
240
+ Tags = GetTagsWithout<B, T>
241
+ > = Tagged extends keyof IfNeverOrAny<B, unknown>
242
+ ? Tags extends []
243
+ ? UnTagAll<B>
244
+ : UnTagAll<B> & { readonly [Tag in Tagged]: Tags }
245
+ : B;
246
+
247
+ export type HasTag<B, T extends symbol> = T extends GetTags<B>[number]
248
+ ? true
249
+ : false;
250
+
251
+ export type DataList = Record<string, unknown>;
252
+ export type PropertyList = Record<string, PropertyListItem<any, unknown>>;
253
+
254
+ export type PropertyType =
255
+ | null
256
+ | StringConstructor
257
+ | NumberConstructor
258
+ | BooleanConstructor
259
+ | ArrayConstructor
260
+ | ObjectConstructor
261
+ | FunctionConstructor;
262
+
263
+ /**
264
+ * PropertyTypeToValueType<null> = any
265
+ * PropertyTypeToValueType<typeof String> = string
266
+ * PropertyTypeToValueType<typeof Number> = number
267
+ */
268
+ export type PropertyTypeToValueType<T extends PropertyType> = T extends null
269
+ ? any
270
+ : T extends StringConstructor
271
+ ? string
272
+ : T extends NumberConstructor
273
+ ? number
274
+ : T extends BooleanConstructor
275
+ ? boolean
276
+ : T extends ArrayConstructor
277
+ ? any[]
278
+ : T extends ObjectConstructor
279
+ ? Record<string, any> | null
280
+ : T extends FunctionConstructor
281
+ ? (...args: any[]) => any
282
+ : never;
283
+
284
+ type Satisfy<T, V> = V extends T ? V : T;
285
+
286
+ /**
287
+ * PropertyTypeToSimpleValueType<typeof String, 'foo'> = 'foo'
288
+ * PropertyTypeToSimpleValueType<typeof String, 123> = string
289
+ */
290
+ type PropertyTypeToSimpleValueType<
291
+ T extends PropertyType,
292
+ V
293
+ > = T extends StringConstructor
294
+ ? Satisfy<string, V>
295
+ : T extends NumberConstructor
296
+ ? Satisfy<number, V>
297
+ : T extends BooleanConstructor
298
+ ? Satisfy<boolean, V>
299
+ : T extends ArrayConstructor
300
+ ? Satisfy<any[], V>
301
+ : T extends ObjectConstructor
302
+ ? Satisfy<Record<string, any> | null, V>
303
+ : T extends FunctionConstructor
304
+ ? Satisfy<(...args: any[]) => any, V>
305
+ : never;
306
+
307
+ /**
308
+ * PropertyValueType<null> = any
309
+ * PropertyValueType<typeof String> = string
310
+ * PropertyValueType<typeof String | typeof Number> = string | number
311
+ * PropertyValueType<{ type: typeof String }> = string
312
+ * PropertyValueType<{ type: typeof String, optionalTypes: [typeof Number] }> = string | number
313
+ * PropertyValueType<{ type: typeof String, value: 'foo' }> = 'foo'
314
+ * PropertyValueType<{ type: typeof String, value: 123 }> = never
315
+ * PropertyValueType<{ type: typeof String, optionalTypes: [typeof Number], value: 123 }> =
316
+ * string | 123
317
+ */
318
+ type PropertyValueType<P extends PropertyListItem<PropertyType, any>> =
319
+ P extends PropertyListItem<infer T, infer V>
320
+ ? unknown extends V
321
+ ? PropertyTypeToValueType<T>
322
+ : ((a: T) => void) extends (a: PropertyType) => void
323
+ ? V
324
+ : V extends PropertyTypeToValueType<T>
325
+ ? PropertyTypeToSimpleValueType<T, V>
326
+ : never
327
+ : never;
328
+
329
+ export type PropertyOption<T extends PropertyType, V> = {
330
+ type?: T
331
+ optionalTypes?: T[]
332
+ value?: V
333
+ default?: () => V
334
+ observer?:
335
+ | ((newValue: DeepReadonly<V>, oldValue: DeepReadonly<V>) => void)
336
+ | string
337
+ reflectIdPrefix?: boolean
338
+ };
339
+
340
+ export type PropertyListItem<T extends PropertyType, V> =
341
+ | T
342
+ | PropertyOption<T, V>
343
+
344
+ export type PropertyValues<P extends PropertyList> = {
345
+ [key in keyof P]: PropertyValueType<P[key]>
346
+ }
347
+
348
+ export type DataWithPropertyValues<
349
+ TData extends DataList,
350
+ TProperty extends PropertyList
351
+ > = TData & PropertyValues<TProperty>
352
+
353
+ export type ComponentMethod = (...args: any[]) => any
354
+
355
+ export type MethodList = Record<string, ComponentMethod>
356
+
357
+ export const METHOD_TAG = Symbol('method')
358
+
359
+ export type TaggedMethod<Fn extends ComponentMethod> = Tag<
360
+ Fn,
361
+ typeof METHOD_TAG
362
+ >;
363
+
364
+ export type UnTaggedMethod<M extends TaggedMethod<any>> = UnTag<
365
+ M,
366
+ typeof METHOD_TAG
367
+ >;
368
+
369
+ export type RelationParams = {
370
+ target?: string | GeneralComponentDefinition | GeneralBehavior | TraitBehavior<any>;
371
+ type:
372
+ | 'ancestor'
373
+ | 'descendant'
374
+ | 'parent'
375
+ | 'child'
376
+ | 'parent-common-node'
377
+ | 'child-common-node';
378
+ linked?: (target: GeneralComponent) => void;
379
+ linkChanged?: (target: GeneralComponent) => void;
380
+ unlinked?: (target: GeneralComponent) => void;
381
+ linkFailed?: (target: GeneralComponent) => void;
382
+ };
383
+
384
+ export type RelationParamsWithKey = {
385
+ [name: string]: RelationParams;
386
+ };
387
+
388
+ export type TraitRelationParams<TOut extends { [key: string]: any }> = {
389
+ target: TraitBehavior<any, TOut>;
390
+ type:
391
+ | 'ancestor'
392
+ | 'descendant'
393
+ | 'parent'
394
+ | 'child'
395
+ | 'parent-common-node'
396
+ | 'child-common-node';
397
+ linked?: (target: GeneralComponent) => void;
398
+ linkChanged?: (target: GeneralComponent) => void;
399
+ unlinked?: (target: GeneralComponent) => void;
400
+ linkFailed?: (target: GeneralComponent) => void;
401
+ };
402
+
403
+ export type ChainingFilterFunc<
404
+ TAddedFields extends { [key: string]: any },
405
+ TRemovedFields extends string = never
406
+ > = (chain: GeneralBehaviorBuilder) => Omit<GeneralBehaviorBuilder, TRemovedFields> & TAddedFields
407
+
408
+ export type ChainingFilterType = {
409
+ add: { [key: string]: any },
410
+ remove: string
411
+ }
412
+
413
+ export type ComponentInstance<
414
+ TData extends DataList,
415
+ TProperty extends PropertyList,
416
+ TMethod extends MethodList
417
+ > = Component<TData, TProperty, TMethod> & {
418
+ data: DeepReadonly<DataWithPropertyValues<TData, TProperty>>;
419
+ properties: DeepReadonly<DataWithPropertyValues<TData, TProperty>>;
420
+ } & TMethod;
421
+
422
+ export type ComponentParams<
423
+ TData extends DataList,
424
+ TProperty extends PropertyList,
425
+ TMethod extends MethodList
426
+ > = {
427
+ is?: string;
428
+ behaviors?: (string | GeneralBehavior)[];
429
+ using?: { [name: string]: string | GeneralComponentDefinition };
430
+ generics?: {
431
+ [name: string]: { default: string | GeneralComponentDefinition } | true;
432
+ };
433
+ placeholders?: { [name: string]: string };
434
+ template?: { [key: string]: any } | null;
435
+ externalClasses?: string[];
436
+ data?: TData | (() => TData);
437
+ properties?: TProperty;
438
+ methods?: TMethod;
439
+ listeners?: { [name: string]: ComponentMethod | string };
440
+ relations?: RelationParamsWithKey;
441
+ lifetimes?: { [name: string]: ComponentMethod };
442
+ created?: () => any;
443
+ attached?: ComponentMethod;
444
+ moved?: ComponentMethod;
445
+ detached?: ComponentMethod;
446
+ ready?: ComponentMethod;
447
+ pageLifetimes?: { [name: string]: ComponentMethod };
448
+ observers?:
449
+ | {
450
+ fields?: string;
451
+ observer: ComponentMethod | string;
452
+ }[]
453
+ | { [fields: string]: ComponentMethod | string };
454
+ options?: ComponentOptions;
455
+ };
456
+
457
+ export type GeneralComponentInstance = ComponentInstance<
458
+ Record<string, any>,
459
+ Record<string, any>,
460
+ Record<string, any>
461
+ >;