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,225 @@
1
+ import {
2
+ triggerWarning,
3
+ } from './func_arr'
4
+
5
+ export type DataPath = Array<string | number>
6
+
7
+ export type MultiPaths = DataPath[]
8
+
9
+ type ParseState = {
10
+ str: string
11
+ cur: number
12
+ }
13
+
14
+ const skipWhiteSpace = (state: ParseState): boolean => {
15
+ const str = state.str
16
+ while (state.cur < str.length) {
17
+ const next = str[state.cur]
18
+ if (next === ' ' || next === '\n' || next === '\r' || next === '\t' || next === '\f') {
19
+ state.cur += 1
20
+ } else {
21
+ break
22
+ }
23
+ }
24
+ return state.cur < str.length
25
+ }
26
+
27
+ const parseInteger = (state: ParseState): number => {
28
+ const str = state.str
29
+ let ret = ''
30
+ while (state.cur < str.length) {
31
+ const next = str[state.cur]!
32
+ if (next >= '0' && next <= '9') {
33
+ ret += next
34
+ } else {
35
+ break
36
+ }
37
+ state.cur += 1
38
+ }
39
+ if (!ret) {
40
+ throw new Error(`data path descriptor "${str}" is illegal at char ${state.cur} (illegal index)`)
41
+ }
42
+ return parseInt(ret, 10)
43
+ }
44
+
45
+ const parseFieldName = (state: ParseState): string => {
46
+ const str = state.str
47
+ let ret = ''
48
+ while (state.cur < str.length) {
49
+ const next = str[state.cur]!
50
+ if (next === '\\') {
51
+ // in this mode, `\\` always translate the next char to field name
52
+ if (state.cur + 1 === str.length) {
53
+ // empty
54
+ } else {
55
+ const next2 = str[state.cur + 1]
56
+ ret += next2
57
+ state.cur += 1
58
+ }
59
+ } else if (/^[_a-zA-Z]$/.test(next)) {
60
+ ret += next
61
+ } else if (next >= '0' && next <= '9') {
62
+ if (ret === '') {
63
+ throw new Error(`data path descriptor "${str}" is illegal at char ${state.cur} (field name cannot start with digits)`)
64
+ }
65
+ ret += next
66
+ } else {
67
+ break
68
+ }
69
+ state.cur += 1
70
+ }
71
+ return ret
72
+ }
73
+
74
+ const parseFieldNameWithSpecialChars = (state: ParseState): string => {
75
+ const str = state.str
76
+ let ret = ''
77
+ while (state.cur < str.length) {
78
+ const next = str[state.cur]
79
+ if (next === '\\') {
80
+ // in this mode, `\\` only escape recognized special chars. It is `\\` itself otherwise
81
+ if (state.cur + 1 === str.length) {
82
+ ret += '\\'
83
+ state.cur += 1
84
+ } else {
85
+ const next2 = str[state.cur + 1]
86
+ if (next2 === '.' || next2 === '[' || next2 === ']' || next2 === '\\') {
87
+ ret += next2
88
+ state.cur += 2
89
+ } else {
90
+ ret += '\\'
91
+ state.cur += 1
92
+ }
93
+ }
94
+ } else if (next === '.' || next === '[') {
95
+ break
96
+ } else {
97
+ ret += next
98
+ state.cur += 1
99
+ }
100
+ }
101
+ return ret
102
+ }
103
+
104
+ const parsePath = (state: ParseState): DataPath => {
105
+ const str = state.str
106
+ skipWhiteSpace(state)
107
+ if (str[state.cur] === '*' && str[state.cur + 1] === '*') {
108
+ state.cur += 2
109
+ return ['**']
110
+ }
111
+ const seg = parseFieldName(state)
112
+ if (!seg) {
113
+ throw new Error(`data path descriptor "${str}" is illegal at char ${state.cur} (first field name illegal)`)
114
+ }
115
+ const ret: DataPath = [seg]
116
+ while (state.cur < str.length) {
117
+ if (!skipWhiteSpace(state)) break
118
+ const next = str[state.cur]
119
+ if (next === '.') {
120
+ state.cur += 1
121
+ skipWhiteSpace(state)
122
+ if (str[state.cur] === '*' && str[state.cur + 1] === '*') {
123
+ ret.push('**')
124
+ state.cur += 2
125
+ break
126
+ }
127
+ const seg = parseFieldName(state)
128
+ if (!seg) {
129
+ throw new Error(`data path descriptor "${str}" is illegal at char ${state.cur} (field name illegal)`)
130
+ }
131
+ ret.push(seg)
132
+ } else if (next === '[') {
133
+ state.cur += 1
134
+ skipWhiteSpace(state)
135
+ const index = parseInteger(state)
136
+ skipWhiteSpace(state)
137
+ const next2 = str[state.cur]
138
+ if (next2 !== ']') {
139
+ throw new Error(`data path descriptor "${str}" is illegal at char ${state.cur} (illegal index)`)
140
+ }
141
+ state.cur += 1
142
+ ret.push(index)
143
+ } else {
144
+ break
145
+ }
146
+ }
147
+ return ret
148
+ }
149
+
150
+ const parsePathWithSpecialChars = (state: ParseState): DataPath => {
151
+ const str = state.str
152
+ const ret: DataPath = []
153
+ while (state.cur < str.length) {
154
+ const next = str[state.cur]
155
+ if (next === '.') {
156
+ state.cur += 1
157
+ const seg = parseFieldNameWithSpecialChars(state)
158
+ if (seg !== '') ret.push(seg)
159
+ } else if (next === '[') {
160
+ state.cur += 1
161
+ const index = parseInteger(state)
162
+ const next2 = str[state.cur]
163
+ if (next2 !== ']' && state.cur < str.length) {
164
+ throw new Error(`data path descriptor "${str}" is illegal at char ${state.cur} (illegal index)`)
165
+ }
166
+ state.cur += 1
167
+ ret.push(index)
168
+ } else {
169
+ const seg = parseFieldNameWithSpecialChars(state)
170
+ ret.push(seg)
171
+ }
172
+ }
173
+ if (ret.length === 0) ret.push('')
174
+ return ret
175
+ }
176
+
177
+ const parseCommaSepPaths = (state: ParseState): MultiPaths => {
178
+ const ret: DataPath[] = []
179
+ ret.push(parsePath(state))
180
+ skipWhiteSpace(state)
181
+ while (state.str[state.cur] === ',') {
182
+ state.cur += 1
183
+ ret.push(parsePath(state))
184
+ skipWhiteSpace(state)
185
+ }
186
+ return ret
187
+ }
188
+
189
+ export const parseSinglePath = (str: string): DataPath | null => {
190
+ try {
191
+ const parseState: ParseState = {
192
+ str,
193
+ cur: 0,
194
+ }
195
+ const ret = parsePathWithSpecialChars(parseState)
196
+ // NOTE currently the end check is not required here, because prev calls always eats all chars
197
+ // if (parseState.cur !== str.length) {
198
+ // throw new Error(`data path descriptor "${str}" is illegal at char ${parseState.cur}`)
199
+ // }
200
+ return ret
201
+ } catch (err) {
202
+ triggerWarning((err as Error).message)
203
+ return null
204
+ }
205
+ }
206
+
207
+ export const parseMultiPaths = (str: string | string[]): MultiPaths => {
208
+ try {
209
+ if (Array.isArray(str)) {
210
+ return str.map((str) => parsePath({ str, cur: 0 }))
211
+ }
212
+ const parseState: ParseState = {
213
+ str,
214
+ cur: 0,
215
+ }
216
+ const ret = parseCommaSepPaths(parseState)
217
+ if (parseState.cur !== str.length) {
218
+ throw new Error(`data path descriptor "${str}" is illegal at char ${parseState.cur}`)
219
+ }
220
+ return ret
221
+ } catch (err) {
222
+ triggerWarning((err as Error).message)
223
+ return []
224
+ }
225
+ }