@swf2es/runtime 0.0.0-stage → 0.1.1

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 (459) hide show
  1. package/LICENSE +202 -0
  2. package/LICENSE.third-party +422 -0
  3. package/README.md +29 -2
  4. package/dist/avm1/activation.d.ts +108 -0
  5. package/dist/avm1/activation.d.ts.map +1 -0
  6. package/dist/avm1/activation.js +90 -0
  7. package/dist/avm1/activation.js.map +1 -0
  8. package/dist/avm1/case.d.ts +3 -0
  9. package/dist/avm1/case.d.ts.map +1 -0
  10. package/dist/avm1/case.js +250 -0
  11. package/dist/avm1/case.js.map +1 -0
  12. package/dist/avm1/clips.d.ts +68 -0
  13. package/dist/avm1/clips.d.ts.map +1 -0
  14. package/dist/avm1/clips.js +335 -0
  15. package/dist/avm1/clips.js.map +1 -0
  16. package/dist/avm1/control.d.ts +54 -0
  17. package/dist/avm1/control.d.ts.map +1 -0
  18. package/dist/avm1/control.js +281 -0
  19. package/dist/avm1/control.js.map +1 -0
  20. package/dist/avm1/errors.d.ts +49 -0
  21. package/dist/avm1/errors.d.ts.map +1 -0
  22. package/dist/avm1/errors.js +51 -0
  23. package/dist/avm1/errors.js.map +1 -0
  24. package/dist/avm1/functions.d.ts +94 -0
  25. package/dist/avm1/functions.d.ts.map +1 -0
  26. package/dist/avm1/functions.js +250 -0
  27. package/dist/avm1/functions.js.map +1 -0
  28. package/dist/avm1/globals/array.d.ts +8 -0
  29. package/dist/avm1/globals/array.d.ts.map +1 -0
  30. package/dist/avm1/globals/array.js +550 -0
  31. package/dist/avm1/globals/array.js.map +1 -0
  32. package/dist/avm1/globals/broadcaster.d.ts +22 -0
  33. package/dist/avm1/globals/broadcaster.d.ts.map +1 -0
  34. package/dist/avm1/globals/broadcaster.js +132 -0
  35. package/dist/avm1/globals/broadcaster.js.map +1 -0
  36. package/dist/avm1/globals/date.d.ts +10 -0
  37. package/dist/avm1/globals/date.d.ts.map +1 -0
  38. package/dist/avm1/globals/date.js +437 -0
  39. package/dist/avm1/globals/date.js.map +1 -0
  40. package/dist/avm1/globals/global.d.ts +23 -0
  41. package/dist/avm1/globals/global.d.ts.map +1 -0
  42. package/dist/avm1/globals/global.js +345 -0
  43. package/dist/avm1/globals/global.js.map +1 -0
  44. package/dist/avm1/globals/math.d.ts +7 -0
  45. package/dist/avm1/globals/math.d.ts.map +1 -0
  46. package/dist/avm1/globals/math.js +140 -0
  47. package/dist/avm1/globals/math.js.map +1 -0
  48. package/dist/avm1/globals/number.d.ts +11 -0
  49. package/dist/avm1/globals/number.d.ts.map +1 -0
  50. package/dist/avm1/globals/number.js +94 -0
  51. package/dist/avm1/globals/number.js.map +1 -0
  52. package/dist/avm1/globals/string.d.ts +8 -0
  53. package/dist/avm1/globals/string.d.ts.map +1 -0
  54. package/dist/avm1/globals/string.js +202 -0
  55. package/dist/avm1/globals/string.js.map +1 -0
  56. package/dist/avm1/globals/timers.d.ts +49 -0
  57. package/dist/avm1/globals/timers.d.ts.map +1 -0
  58. package/dist/avm1/globals/timers.js +130 -0
  59. package/dist/avm1/globals/timers.js.map +1 -0
  60. package/dist/avm1/host.d.ts +146 -0
  61. package/dist/avm1/host.d.ts.map +1 -0
  62. package/dist/avm1/host.js +6 -0
  63. package/dist/avm1/host.js.map +1 -0
  64. package/dist/avm1/index.d.ts +15 -0
  65. package/dist/avm1/index.d.ts.map +1 -0
  66. package/dist/avm1/index.js +15 -0
  67. package/dist/avm1/index.js.map +1 -0
  68. package/dist/avm1/inheritance.d.ts +25 -0
  69. package/dist/avm1/inheritance.d.ts.map +1 -0
  70. package/dist/avm1/inheritance.js +133 -0
  71. package/dist/avm1/inheritance.js.map +1 -0
  72. package/dist/avm1/numbers.d.ts +21 -0
  73. package/dist/avm1/numbers.d.ts.map +1 -0
  74. package/dist/avm1/numbers.js +299 -0
  75. package/dist/avm1/numbers.js.map +1 -0
  76. package/dist/avm1/objects.d.ts +245 -0
  77. package/dist/avm1/objects.d.ts.map +1 -0
  78. package/dist/avm1/objects.js +897 -0
  79. package/dist/avm1/objects.js.map +1 -0
  80. package/dist/avm1/operators.d.ts +45 -0
  81. package/dist/avm1/operators.d.ts.map +1 -0
  82. package/dist/avm1/operators.js +171 -0
  83. package/dist/avm1/operators.js.map +1 -0
  84. package/dist/avm1/realm.d.ts +126 -0
  85. package/dist/avm1/realm.d.ts.map +1 -0
  86. package/dist/avm1/realm.js +530 -0
  87. package/dist/avm1/realm.js.map +1 -0
  88. package/dist/avm1/runtime.d.ts +294 -0
  89. package/dist/avm1/runtime.d.ts.map +1 -0
  90. package/dist/avm1/runtime.js +883 -0
  91. package/dist/avm1/runtime.js.map +1 -0
  92. package/dist/avm1/scope.d.ts +77 -0
  93. package/dist/avm1/scope.d.ts.map +1 -0
  94. package/dist/avm1/scope.js +386 -0
  95. package/dist/avm1/scope.js.map +1 -0
  96. package/dist/avm1/urls.d.ts +25 -0
  97. package/dist/avm1/urls.d.ts.map +1 -0
  98. package/dist/avm1/urls.js +181 -0
  99. package/dist/avm1/urls.js.map +1 -0
  100. package/dist/avm1/values.d.ts +52 -0
  101. package/dist/avm1/values.d.ts.map +1 -0
  102. package/dist/avm1/values.js +98 -0
  103. package/dist/avm1/values.js.map +1 -0
  104. package/dist/avm2/amf-classes.d.ts +28 -0
  105. package/dist/avm2/amf-classes.d.ts.map +1 -0
  106. package/dist/avm2/amf-classes.js +67 -0
  107. package/dist/avm2/amf-classes.js.map +1 -0
  108. package/dist/avm2/amf.d.ts +96 -0
  109. package/dist/avm2/amf.d.ts.map +1 -0
  110. package/dist/avm2/amf.js +802 -0
  111. package/dist/avm2/amf.js.map +1 -0
  112. package/dist/avm2/array-conversion.d.ts +31 -0
  113. package/dist/avm2/array-conversion.d.ts.map +1 -0
  114. package/dist/avm2/array-conversion.js +101 -0
  115. package/dist/avm2/array-conversion.js.map +1 -0
  116. package/dist/avm2/builtin-library.d.ts +2 -0
  117. package/dist/avm2/builtin-library.d.ts.map +1 -0
  118. package/dist/avm2/builtin-library.js +22 -0
  119. package/dist/avm2/builtin-library.js.map +1 -0
  120. package/dist/avm2/cache-fill.d.ts +14 -0
  121. package/dist/avm2/cache-fill.d.ts.map +1 -0
  122. package/dist/avm2/cache-fill.js +87 -0
  123. package/dist/avm2/cache-fill.js.map +1 -0
  124. package/dist/avm2/classes.d.ts +17 -0
  125. package/dist/avm2/classes.d.ts.map +1 -0
  126. package/dist/avm2/classes.js +212 -0
  127. package/dist/avm2/classes.js.map +1 -0
  128. package/dist/avm2/definitions.d.ts +28 -0
  129. package/dist/avm2/definitions.d.ts.map +1 -0
  130. package/dist/avm2/definitions.js +70 -0
  131. package/dist/avm2/definitions.js.map +1 -0
  132. package/dist/avm2/descriptors.d.ts +118 -0
  133. package/dist/avm2/descriptors.d.ts.map +1 -0
  134. package/dist/avm2/descriptors.js +6 -0
  135. package/dist/avm2/descriptors.js.map +1 -0
  136. package/dist/avm2/dictionary-keys.d.ts +73 -0
  137. package/dist/avm2/dictionary-keys.d.ts.map +1 -0
  138. package/dist/avm2/dictionary-keys.js +296 -0
  139. package/dist/avm2/dictionary-keys.js.map +1 -0
  140. package/dist/avm2/domain-memory.d.ts +23 -0
  141. package/dist/avm2/domain-memory.d.ts.map +1 -0
  142. package/dist/avm2/domain-memory.js +76 -0
  143. package/dist/avm2/domain-memory.js.map +1 -0
  144. package/dist/avm2/domain.d.ts +108 -0
  145. package/dist/avm2/domain.d.ts.map +1 -0
  146. package/dist/avm2/domain.js +281 -0
  147. package/dist/avm2/domain.js.map +1 -0
  148. package/dist/avm2/dynamic-properties.d.ts +62 -0
  149. package/dist/avm2/dynamic-properties.d.ts.map +1 -0
  150. package/dist/avm2/dynamic-properties.js +183 -0
  151. package/dist/avm2/dynamic-properties.js.map +1 -0
  152. package/dist/avm2/enumeration.d.ts +75 -0
  153. package/dist/avm2/enumeration.d.ts.map +1 -0
  154. package/dist/avm2/enumeration.js +394 -0
  155. package/dist/avm2/enumeration.js.map +1 -0
  156. package/dist/avm2/errors.d.ts +20 -0
  157. package/dist/avm2/errors.d.ts.map +1 -0
  158. package/dist/avm2/errors.js +46 -0
  159. package/dist/avm2/errors.js.map +1 -0
  160. package/dist/avm2/float-library.d.ts +2 -0
  161. package/dist/avm2/float-library.d.ts.map +1 -0
  162. package/dist/avm2/float-library.js +67 -0
  163. package/dist/avm2/float-library.js.map +1 -0
  164. package/dist/avm2/float.d.ts +9 -0
  165. package/dist/avm2/float.d.ts.map +1 -0
  166. package/dist/avm2/float.js +27 -0
  167. package/dist/avm2/float.js.map +1 -0
  168. package/dist/avm2/hooks.d.ts +77 -0
  169. package/dist/avm2/hooks.d.ts.map +1 -0
  170. package/dist/avm2/hooks.js +20 -0
  171. package/dist/avm2/hooks.js.map +1 -0
  172. package/dist/avm2/index.d.ts +32 -0
  173. package/dist/avm2/index.d.ts.map +1 -0
  174. package/dist/avm2/index.js +39 -0
  175. package/dist/avm2/index.js.map +1 -0
  176. package/dist/avm2/messages.d.ts +2 -0
  177. package/dist/avm2/messages.d.ts.map +1 -0
  178. package/dist/avm2/messages.js +178 -0
  179. package/dist/avm2/messages.js.map +1 -0
  180. package/dist/avm2/method-factories.d.ts +35 -0
  181. package/dist/avm2/method-factories.d.ts.map +1 -0
  182. package/dist/avm2/method-factories.js +96 -0
  183. package/dist/avm2/method-factories.js.map +1 -0
  184. package/dist/avm2/modules.d.ts +40 -0
  185. package/dist/avm2/modules.d.ts.map +1 -0
  186. package/dist/avm2/modules.js +106 -0
  187. package/dist/avm2/modules.js.map +1 -0
  188. package/dist/avm2/names.d.ts +143 -0
  189. package/dist/avm2/names.d.ts.map +1 -0
  190. package/dist/avm2/names.js +249 -0
  191. package/dist/avm2/names.js.map +1 -0
  192. package/dist/avm2/natives/aliases.d.ts +3 -0
  193. package/dist/avm2/natives/aliases.d.ts.map +1 -0
  194. package/dist/avm2/natives/aliases.js +48 -0
  195. package/dist/avm2/natives/aliases.js.map +1 -0
  196. package/dist/avm2/natives/array.d.ts +5 -0
  197. package/dist/avm2/natives/array.d.ts.map +1 -0
  198. package/dist/avm2/natives/array.js +391 -0
  199. package/dist/avm2/natives/array.js.map +1 -0
  200. package/dist/avm2/natives/bytearray.d.ts +180 -0
  201. package/dist/avm2/natives/bytearray.d.ts.map +1 -0
  202. package/dist/avm2/natives/bytearray.js +1228 -0
  203. package/dist/avm2/natives/bytearray.js.map +1 -0
  204. package/dist/avm2/natives/case.d.ts +5 -0
  205. package/dist/avm2/natives/case.d.ts.map +1 -0
  206. package/dist/avm2/natives/case.js +89 -0
  207. package/dist/avm2/natives/case.js.map +1 -0
  208. package/dist/avm2/natives/concurrent.d.ts +24 -0
  209. package/dist/avm2/natives/concurrent.d.ts.map +1 -0
  210. package/dist/avm2/natives/concurrent.js +200 -0
  211. package/dist/avm2/natives/concurrent.js.map +1 -0
  212. package/dist/avm2/natives/date.d.ts +5 -0
  213. package/dist/avm2/natives/date.d.ts.map +1 -0
  214. package/dist/avm2/natives/date.js +582 -0
  215. package/dist/avm2/natives/date.js.map +1 -0
  216. package/dist/avm2/natives/define.d.ts +58 -0
  217. package/dist/avm2/natives/define.d.ts.map +1 -0
  218. package/dist/avm2/natives/define.js +131 -0
  219. package/dist/avm2/natives/define.js.map +1 -0
  220. package/dist/avm2/natives/describe.d.ts +3 -0
  221. package/dist/avm2/natives/describe.d.ts.map +1 -0
  222. package/dist/avm2/natives/describe.js +352 -0
  223. package/dist/avm2/natives/describe.js.map +1 -0
  224. package/dist/avm2/natives/dictionary.d.ts +3 -0
  225. package/dist/avm2/natives/dictionary.d.ts.map +1 -0
  226. package/dist/avm2/natives/dictionary.js +13 -0
  227. package/dist/avm2/natives/dictionary.js.map +1 -0
  228. package/dist/avm2/natives/float-vector.d.ts +20 -0
  229. package/dist/avm2/natives/float-vector.d.ts.map +1 -0
  230. package/dist/avm2/natives/float-vector.js +82 -0
  231. package/dist/avm2/natives/float-vector.js.map +1 -0
  232. package/dist/avm2/natives/float.d.ts +5 -0
  233. package/dist/avm2/natives/float.d.ts.map +1 -0
  234. package/dist/avm2/natives/float.js +97 -0
  235. package/dist/avm2/natives/float.js.map +1 -0
  236. package/dist/avm2/natives/index.d.ts +7 -0
  237. package/dist/avm2/natives/index.d.ts.map +1 -0
  238. package/dist/avm2/natives/index.js +65 -0
  239. package/dist/avm2/natives/index.js.map +1 -0
  240. package/dist/avm2/natives/json.d.ts +3 -0
  241. package/dist/avm2/natives/json.d.ts.map +1 -0
  242. package/dist/avm2/natives/json.js +515 -0
  243. package/dist/avm2/natives/json.js.map +1 -0
  244. package/dist/avm2/natives/number.d.ts +15 -0
  245. package/dist/avm2/natives/number.d.ts.map +1 -0
  246. package/dist/avm2/natives/number.js +163 -0
  247. package/dist/avm2/natives/number.js.map +1 -0
  248. package/dist/avm2/natives/object.d.ts +8 -0
  249. package/dist/avm2/natives/object.d.ts.map +1 -0
  250. package/dist/avm2/natives/object.js +238 -0
  251. package/dist/avm2/natives/object.js.map +1 -0
  252. package/dist/avm2/natives/proxy.d.ts +5 -0
  253. package/dist/avm2/natives/proxy.d.ts.map +1 -0
  254. package/dist/avm2/natives/proxy.js +76 -0
  255. package/dist/avm2/natives/proxy.js.map +1 -0
  256. package/dist/avm2/natives/regexp.d.ts +21 -0
  257. package/dist/avm2/natives/regexp.d.ts.map +1 -0
  258. package/dist/avm2/natives/regexp.js +486 -0
  259. package/dist/avm2/natives/regexp.js.map +1 -0
  260. package/dist/avm2/natives/shell-workers.d.ts +140 -0
  261. package/dist/avm2/natives/shell-workers.d.ts.map +1 -0
  262. package/dist/avm2/natives/shell-workers.js +405 -0
  263. package/dist/avm2/natives/shell-workers.js.map +1 -0
  264. package/dist/avm2/natives/shell.d.ts +12 -0
  265. package/dist/avm2/natives/shell.d.ts.map +1 -0
  266. package/dist/avm2/natives/shell.js +558 -0
  267. package/dist/avm2/natives/shell.js.map +1 -0
  268. package/dist/avm2/natives/sort.d.ts +7 -0
  269. package/dist/avm2/natives/sort.d.ts.map +1 -0
  270. package/dist/avm2/natives/sort.js +378 -0
  271. package/dist/avm2/natives/sort.js.map +1 -0
  272. package/dist/avm2/natives/string.d.ts +5 -0
  273. package/dist/avm2/natives/string.d.ts.map +1 -0
  274. package/dist/avm2/natives/string.js +133 -0
  275. package/dist/avm2/natives/string.js.map +1 -0
  276. package/dist/avm2/natives/sync.d.ts +215 -0
  277. package/dist/avm2/natives/sync.d.ts.map +1 -0
  278. package/dist/avm2/natives/sync.js +822 -0
  279. package/dist/avm2/natives/sync.js.map +1 -0
  280. package/dist/avm2/natives/toplevel.d.ts +5 -0
  281. package/dist/avm2/natives/toplevel.d.ts.map +1 -0
  282. package/dist/avm2/natives/toplevel.js +140 -0
  283. package/dist/avm2/natives/toplevel.js.map +1 -0
  284. package/dist/avm2/natives/vector-elements.d.ts +10 -0
  285. package/dist/avm2/natives/vector-elements.d.ts.map +1 -0
  286. package/dist/avm2/natives/vector-elements.js +47 -0
  287. package/dist/avm2/natives/vector-elements.js.map +1 -0
  288. package/dist/avm2/natives/vector.d.ts +5 -0
  289. package/dist/avm2/natives/vector.d.ts.map +1 -0
  290. package/dist/avm2/natives/vector.js +407 -0
  291. package/dist/avm2/natives/vector.js.map +1 -0
  292. package/dist/avm2/natives/xml/access.d.ts +34 -0
  293. package/dist/avm2/natives/xml/access.d.ts.map +1 -0
  294. package/dist/avm2/natives/xml/access.js +634 -0
  295. package/dist/avm2/natives/xml/access.js.map +1 -0
  296. package/dist/avm2/natives/xml/build.d.ts +11 -0
  297. package/dist/avm2/natives/xml/build.d.ts.map +1 -0
  298. package/dist/avm2/natives/xml/build.js +292 -0
  299. package/dist/avm2/natives/xml/build.js.map +1 -0
  300. package/dist/avm2/natives/xml/chars.d.ts +9 -0
  301. package/dist/avm2/natives/xml/chars.d.ts.map +1 -0
  302. package/dist/avm2/natives/xml/chars.js +113 -0
  303. package/dist/avm2/natives/xml/chars.js.map +1 -0
  304. package/dist/avm2/natives/xml/escape.d.ts +5 -0
  305. package/dist/avm2/natives/xml/escape.d.ts.map +1 -0
  306. package/dist/avm2/natives/xml/escape.js +39 -0
  307. package/dist/avm2/natives/xml/escape.js.map +1 -0
  308. package/dist/avm2/natives/xml/names.d.ts +46 -0
  309. package/dist/avm2/natives/xml/names.d.ts.map +1 -0
  310. package/dist/avm2/natives/xml/names.js +205 -0
  311. package/dist/avm2/natives/xml/names.js.map +1 -0
  312. package/dist/avm2/natives/xml/node.d.ts +94 -0
  313. package/dist/avm2/natives/xml/node.d.ts.map +1 -0
  314. package/dist/avm2/natives/xml/node.js +273 -0
  315. package/dist/avm2/natives/xml/node.js.map +1 -0
  316. package/dist/avm2/natives/xml/operators.d.ts +7 -0
  317. package/dist/avm2/natives/xml/operators.d.ts.map +1 -0
  318. package/dist/avm2/natives/xml/operators.js +70 -0
  319. package/dist/avm2/natives/xml/operators.js.map +1 -0
  320. package/dist/avm2/natives/xml/parser.d.ts +51 -0
  321. package/dist/avm2/natives/xml/parser.d.ts.map +1 -0
  322. package/dist/avm2/natives/xml/parser.js +357 -0
  323. package/dist/avm2/natives/xml/parser.js.map +1 -0
  324. package/dist/avm2/natives/xml/strings.d.ts +10 -0
  325. package/dist/avm2/natives/xml/strings.d.ts.map +1 -0
  326. package/dist/avm2/natives/xml/strings.js +192 -0
  327. package/dist/avm2/natives/xml/strings.js.map +1 -0
  328. package/dist/avm2/natives/xml/values.d.ts +48 -0
  329. package/dist/avm2/natives/xml/values.d.ts.map +1 -0
  330. package/dist/avm2/natives/xml/values.js +123 -0
  331. package/dist/avm2/natives/xml/values.js.map +1 -0
  332. package/dist/avm2/natives/xml/xml.d.ts +5 -0
  333. package/dist/avm2/natives/xml/xml.d.ts.map +1 -0
  334. package/dist/avm2/natives/xml/xml.js +646 -0
  335. package/dist/avm2/natives/xml/xml.js.map +1 -0
  336. package/dist/avm2/number-strings.d.ts +28 -0
  337. package/dist/avm2/number-strings.d.ts.map +1 -0
  338. package/dist/avm2/number-strings.js +111 -0
  339. package/dist/avm2/number-strings.js.map +1 -0
  340. package/dist/avm2/numbers.d.ts +12 -0
  341. package/dist/avm2/numbers.d.ts.map +1 -0
  342. package/dist/avm2/numbers.js +559 -0
  343. package/dist/avm2/numbers.js.map +1 -0
  344. package/dist/avm2/options.d.ts +105 -0
  345. package/dist/avm2/options.d.ts.map +1 -0
  346. package/dist/avm2/options.js +17 -0
  347. package/dist/avm2/options.js.map +1 -0
  348. package/dist/avm2/player-messages.d.ts +3 -0
  349. package/dist/avm2/player-messages.d.ts.map +1 -0
  350. package/dist/avm2/player-messages.js +551 -0
  351. package/dist/avm2/player-messages.js.map +1 -0
  352. package/dist/avm2/property-cache.d.ts +61 -0
  353. package/dist/avm2/property-cache.d.ts.map +1 -0
  354. package/dist/avm2/property-cache.js +136 -0
  355. package/dist/avm2/property-cache.js.map +1 -0
  356. package/dist/avm2/runtime.d.ts +588 -0
  357. package/dist/avm2/runtime.d.ts.map +1 -0
  358. package/dist/avm2/runtime.js +2645 -0
  359. package/dist/avm2/runtime.js.map +1 -0
  360. package/dist/avm2/traits.d.ts +233 -0
  361. package/dist/avm2/traits.d.ts.map +1 -0
  362. package/dist/avm2/traits.js +510 -0
  363. package/dist/avm2/traits.js.map +1 -0
  364. package/dist/index.d.ts +8 -0
  365. package/dist/index.d.ts.map +1 -0
  366. package/dist/index.js +8 -0
  367. package/dist/index.js.map +1 -0
  368. package/package.json +43 -3
  369. package/src/avm1/activation.ts +114 -0
  370. package/src/avm1/case.ts +257 -0
  371. package/src/avm1/clips.ts +440 -0
  372. package/src/avm1/control.ts +339 -0
  373. package/src/avm1/errors.ts +60 -0
  374. package/src/avm1/functions.ts +271 -0
  375. package/src/avm1/globals/array.ts +676 -0
  376. package/src/avm1/globals/broadcaster.ts +185 -0
  377. package/src/avm1/globals/date.ts +548 -0
  378. package/src/avm1/globals/global.ts +420 -0
  379. package/src/avm1/globals/math.ts +152 -0
  380. package/src/avm1/globals/number.ts +122 -0
  381. package/src/avm1/globals/string.ts +254 -0
  382. package/src/avm1/globals/timers.ts +144 -0
  383. package/src/avm1/host.ts +155 -0
  384. package/src/avm1/index.ts +69 -0
  385. package/src/avm1/inheritance.ts +159 -0
  386. package/src/avm1/numbers.ts +348 -0
  387. package/src/avm1/objects.ts +1080 -0
  388. package/src/avm1/operators.ts +229 -0
  389. package/src/avm1/realm.ts +704 -0
  390. package/src/avm1/runtime.ts +1291 -0
  391. package/src/avm1/scope.ts +482 -0
  392. package/src/avm1/urls.ts +226 -0
  393. package/src/avm1/values.ts +145 -0
  394. package/src/avm2/amf-classes.ts +80 -0
  395. package/src/avm2/amf.ts +913 -0
  396. package/src/avm2/array-conversion.ts +117 -0
  397. package/src/avm2/builtin-library.ts +28 -0
  398. package/src/avm2/cache-fill.ts +124 -0
  399. package/src/avm2/classes.ts +235 -0
  400. package/src/avm2/definitions.ts +93 -0
  401. package/src/avm2/descriptors.ts +137 -0
  402. package/src/avm2/dictionary-keys.ts +345 -0
  403. package/src/avm2/domain-memory.ts +95 -0
  404. package/src/avm2/domain.ts +335 -0
  405. package/src/avm2/dynamic-properties.ts +209 -0
  406. package/src/avm2/enumeration.ts +506 -0
  407. package/src/avm2/errors.ts +54 -0
  408. package/src/avm2/float-library.ts +66 -0
  409. package/src/avm2/float.ts +31 -0
  410. package/src/avm2/hooks.ts +97 -0
  411. package/src/avm2/index.ts +84 -0
  412. package/src/avm2/messages.ts +178 -0
  413. package/src/avm2/method-factories.ts +130 -0
  414. package/src/avm2/modules.ts +120 -0
  415. package/src/avm2/names.ts +292 -0
  416. package/src/avm2/natives/aliases.ts +59 -0
  417. package/src/avm2/natives/array.ts +482 -0
  418. package/src/avm2/natives/bytearray.ts +1474 -0
  419. package/src/avm2/natives/case.ts +98 -0
  420. package/src/avm2/natives/concurrent.ts +268 -0
  421. package/src/avm2/natives/date.ts +678 -0
  422. package/src/avm2/natives/define.ts +176 -0
  423. package/src/avm2/natives/describe.ts +426 -0
  424. package/src/avm2/natives/dictionary.ts +18 -0
  425. package/src/avm2/natives/float-vector.ts +99 -0
  426. package/src/avm2/natives/float.ts +116 -0
  427. package/src/avm2/natives/index.ts +70 -0
  428. package/src/avm2/natives/json.ts +600 -0
  429. package/src/avm2/natives/number.ts +194 -0
  430. package/src/avm2/natives/object.ts +272 -0
  431. package/src/avm2/natives/proxy.ts +98 -0
  432. package/src/avm2/natives/regexp.ts +580 -0
  433. package/src/avm2/natives/shell-workers.ts +474 -0
  434. package/src/avm2/natives/shell.ts +707 -0
  435. package/src/avm2/natives/sort.ts +438 -0
  436. package/src/avm2/natives/string.ts +158 -0
  437. package/src/avm2/natives/sync.ts +964 -0
  438. package/src/avm2/natives/toplevel.ts +163 -0
  439. package/src/avm2/natives/vector-elements.ts +61 -0
  440. package/src/avm2/natives/vector.ts +511 -0
  441. package/src/avm2/natives/xml/access.ts +767 -0
  442. package/src/avm2/natives/xml/build.ts +381 -0
  443. package/src/avm2/natives/xml/chars.ts +127 -0
  444. package/src/avm2/natives/xml/escape.ts +46 -0
  445. package/src/avm2/natives/xml/names.ts +256 -0
  446. package/src/avm2/natives/xml/node.ts +339 -0
  447. package/src/avm2/natives/xml/operators.ts +90 -0
  448. package/src/avm2/natives/xml/parser.ts +414 -0
  449. package/src/avm2/natives/xml/strings.ts +241 -0
  450. package/src/avm2/natives/xml/values.ts +162 -0
  451. package/src/avm2/natives/xml/xml.ts +829 -0
  452. package/src/avm2/number-strings.ts +127 -0
  453. package/src/avm2/numbers.ts +605 -0
  454. package/src/avm2/options.ts +125 -0
  455. package/src/avm2/player-messages.ts +552 -0
  456. package/src/avm2/property-cache.ts +160 -0
  457. package/src/avm2/runtime.ts +3274 -0
  458. package/src/avm2/traits.ts +584 -0
  459. package/src/index.ts +8 -0
@@ -0,0 +1,767 @@
1
+ // E4X's internal methods, E4X 9.1.1 and 9.2.1: XML's and XMLList's get,
2
+ // put, delete, has and descendants, the tree changes they make, and the
3
+ // notifications those send.
4
+ //
5
+ // Translated from avmplus' core/XMLObject.cpp, XMLListObject.cpp and
6
+ // E4XNode.cpp, this file is subject to the Mozilla Public License, v. 2.0:
7
+ // http://mozilla.org/MPL/2.0/.
8
+
9
+ import type { AsObject, Value } from "../../descriptors.js";
10
+ import type { Runtime } from "../../runtime.js";
11
+ import { deepCopy, listDeepCopy, toXML } from "./build.js";
12
+ import { isXMLName } from "./chars.js";
13
+ import { coerce, indexOf, matchesChild, toXMLName } from "./names.js";
14
+ import {
15
+ ATTRIBUTE,
16
+ CDATA,
17
+ COMMENT,
18
+ ELEMENT,
19
+ matches,
20
+ PROCESSING_INSTRUCTION,
21
+ TEXT,
22
+ XMLNode,
23
+ type XName,
24
+ } from "./node.js";
25
+ import {
26
+ ASSIGNMENT_ONE_ITEM_LISTS,
27
+ ASSIGNMENT_TO_INDEXED_XML,
28
+ append,
29
+ appendNode,
30
+ fixTarget,
31
+ ILLEGAL_CYCLICAL_LOOP,
32
+ isList,
33
+ isXML,
34
+ newList,
35
+ xmlOf,
36
+ } from "./values.js";
37
+
38
+ // Notifications, as setNotification sets a function to call on changes.
39
+
40
+ export function notifyNeeded(node: XMLNode | null): boolean {
41
+ for (let n = node; n; n = n.parent) {
42
+ if (n.notification) {
43
+ return true;
44
+ }
45
+ }
46
+
47
+ return false;
48
+ }
49
+
50
+ function issueNotifications(
51
+ rt: Runtime,
52
+ initial: XMLNode,
53
+ target: AsObject,
54
+ type: string,
55
+ value: Value,
56
+ detail: Value,
57
+ ): void {
58
+ for (let n: XMLNode | null = initial; n; n = n.parent) {
59
+ if (n.notification) {
60
+ rt.callValue(n.notification, null, [xmlOf(rt, n), type, target, value, detail], null);
61
+ }
62
+ }
63
+ }
64
+
65
+ export function childChanges(
66
+ rt: Runtime,
67
+ node: XMLNode,
68
+ type: string,
69
+ value: Value,
70
+ prior: XMLNode | null = null,
71
+ ): void {
72
+ if (notifyNeeded(node) && (isXML(value) || isList(value))) {
73
+ const detail = prior ? xmlOf(rt, prior) : undefined;
74
+ issueNotifications(rt, node, xmlOf(rt, node), type, value, detail);
75
+ }
76
+ }
77
+
78
+ export function nonChildChanges(
79
+ rt: Runtime,
80
+ node: XMLNode,
81
+ type: string,
82
+ value: Value,
83
+ detail: Value = undefined,
84
+ ): void {
85
+ if (notifyNeeded(node)) {
86
+ issueNotifications(rt, node, xmlOf(rt, node), type, value, detail);
87
+ }
88
+ }
89
+
90
+ // The tree changed by values, as ElementE4XNode's _insert and _replace.
91
+
92
+ function checkCycle(rt: Runtime, x: XMLNode, node: XMLNode): void {
93
+ for (let n: XMLNode | null = x; n; n = n.parent) {
94
+ if (n === node) {
95
+ throw rt.error("TypeError", ILLEGAL_CYCLICAL_LOOP);
96
+ }
97
+ }
98
+ }
99
+
100
+ /** As _insert: `value` (an XMLList's nodes, else a node as _replace makes it) at `entry`. */
101
+ export function insertAt(rt: Runtime, x: XMLNode, entry: number, value: Value): void {
102
+ if (x.kind !== ELEMENT) {
103
+ return;
104
+ }
105
+
106
+ if (isList(value)) {
107
+ const nodes: XMLNode[] = value.$nodes;
108
+ for (let j = 0; j < nodes.length; j++) {
109
+ const child = nodes[j];
110
+ checkCycle(rt, x, child);
111
+ child.parent = x;
112
+ x.children.splice(entry + j, 0, child);
113
+ }
114
+
115
+ return;
116
+ }
117
+
118
+ if (isXML(value)) {
119
+ checkCycle(rt, x, value.$node);
120
+ }
121
+
122
+ x.children.splice(entry, 0, null as unknown as XMLNode);
123
+ replaceAt(rt, x, entry, value);
124
+ }
125
+
126
+ /**
127
+ * As _replace: child `i` (or a new last one) replaced by `v`: an XML
128
+ * node itself, an XMLList's nodes, or a text node of anything else's
129
+ * string. Gives the child it replaced.
130
+ */
131
+ export function replaceAt(
132
+ rt: Runtime,
133
+ x: XMLNode,
134
+ index: number,
135
+ v: Value,
136
+ pastValue: Value = undefined,
137
+ ): XMLNode | null {
138
+ if (x.kind !== ELEMENT) {
139
+ return null;
140
+ }
141
+
142
+ let i = index;
143
+ if (i >= x.children.length) {
144
+ i = x.children.length;
145
+ x.children.push(null as unknown as XMLNode);
146
+ }
147
+
148
+ const prior: XMLNode | null = x.children[i];
149
+ if (isXML(v) && v.$node.kind & (ELEMENT | COMMENT | PROCESSING_INSTRUCTION | TEXT | CDATA)) {
150
+ const node: XMLNode = v.$node;
151
+ if (node.kind === ELEMENT) {
152
+ checkCycle(rt, x, node);
153
+ }
154
+
155
+ node.parent = x;
156
+ if (prior) {
157
+ prior.parent = null;
158
+ }
159
+
160
+ x.children[i] = node;
161
+ } else if (isList(v)) {
162
+ x.deleteByIndex(i);
163
+ insertAt(rt, x, i, v);
164
+ } else {
165
+ const text = new XMLNode(TEXT, rt.toString(v));
166
+ text.parent = x;
167
+ if (prior) {
168
+ prior.parent = null;
169
+ }
170
+
171
+ x.children[i] = text;
172
+ if (notifyNeeded(text)) {
173
+ const detail = prior && prior.kind !== ELEMENT ? prior.value : pastValue;
174
+ nonChildChanges(rt, text, "textSet", text.value, detail);
175
+ }
176
+ }
177
+
178
+ return prior;
179
+ }
180
+
181
+ // XML's internal methods, E4X 9.1.1, on a node, with a name not yet coerced.
182
+
183
+ /** [[Get]]: the attributes or children the name names, or the node itself as index 0. */
184
+ export function getXML(rt: Runtime, o: AsObject, name: XName): Value {
185
+ const n = coerce(rt, name);
186
+ const index = indexOf(n);
187
+ if (index >= 0) {
188
+ return index === 0 ? o : undefined;
189
+ }
190
+
191
+ const node: XMLNode = o.$node;
192
+ const list = newList(rt, o, n);
193
+ if (n.attribute) {
194
+ for (const a of node.attributes) {
195
+ if (matches(n, a)) {
196
+ appendNode(list, a);
197
+ }
198
+ }
199
+ } else {
200
+ for (const child of node.children) {
201
+ if (matchesChild(n, child)) {
202
+ appendNode(list, child);
203
+ }
204
+ }
205
+ }
206
+
207
+ return list;
208
+ }
209
+
210
+ /** [[Put]]. */
211
+ export function setXML(rt: Runtime, o: AsObject, name: XName, value: Value): void {
212
+ const n = coerce(rt, name);
213
+ if (indexOf(n) >= 0) {
214
+ throw rt.error("TypeError", ASSIGNMENT_TO_INDEXED_XML);
215
+ }
216
+
217
+ const node: XMLNode = o.$node;
218
+ if (node.kind & (TEXT | CDATA | COMMENT | PROCESSING_INSTRUCTION | ATTRIBUTE)) {
219
+ return;
220
+ }
221
+
222
+ let c: Value;
223
+ if (isList(value)) {
224
+ const nodes: XMLNode[] = value.$nodes;
225
+ c =
226
+ nodes.length === 1 && nodes[0].kind & (TEXT | ATTRIBUTE)
227
+ ? rt.toString(value)
228
+ : listDeepCopy(rt, value);
229
+ } else if (isXML(value)) {
230
+ c =
231
+ value.$node.kind & (TEXT | ATTRIBUTE)
232
+ ? rt.toString(value)
233
+ : xmlOf(rt, deepCopy(rt, value.$node));
234
+ } else {
235
+ c = rt.toString(value);
236
+ }
237
+
238
+ if (n.attribute) {
239
+ let sc: string;
240
+ if (isList(c)) {
241
+ sc = (c.$nodes as XMLNode[]).map((x) => rt.toString(xmlOf(rt, x))).join(" ");
242
+ } else {
243
+ sc = rt.toString(c);
244
+ }
245
+
246
+ let a = -1;
247
+ for (let j = 0; j < node.attributes.length; j++) {
248
+ const x = node.attributes[j];
249
+ if (matches(n, x)) {
250
+ if (a === -1) {
251
+ a = j;
252
+ } else {
253
+ deleteXML(rt, o, x.xname() as XName);
254
+ }
255
+ }
256
+ }
257
+
258
+ if (a === -1) {
259
+ const e = new XMLNode(ATTRIBUTE, sc);
260
+ e.parent = node;
261
+ e.setName(n.local, n.namespaces?.length === 1 ? n.namespaces[0] : null);
262
+ node.attributes.push(e);
263
+ nonChildChanges(rt, node, "attributeAdded", n.local, sc);
264
+ } else {
265
+ const x = node.attributes[a];
266
+ const prior = x.value;
267
+ x.value = sc;
268
+ nonChildChanges(rt, node, "attributeChanged", n.local, prior);
269
+ }
270
+
271
+ return;
272
+ }
273
+
274
+ if (n.local !== null && !isXMLName(n.local)) {
275
+ return;
276
+ }
277
+
278
+ let i = -1;
279
+ const primitiveAssign = !isXML(c) && !isList(c) && n.local !== null;
280
+ const notify = notifyNeeded(node);
281
+ for (let k = node.children.length - 1; k >= 0; k--) {
282
+ if (matchesChild(n, node.children[k])) {
283
+ // All but the first of those it names are removed.
284
+ if (i !== -1) {
285
+ const was = node.children[i];
286
+ node.deleteByIndex(i);
287
+ if (notify && was.kind === ELEMENT) {
288
+ childChanges(rt, node, "nodeRemoved", xmlOf(rt, was));
289
+ }
290
+ }
291
+
292
+ i = k;
293
+ }
294
+ }
295
+
296
+ if (i === -1) {
297
+ i = node.children.length;
298
+ if (primitiveAssign) {
299
+ const e = new XMLNode(ELEMENT);
300
+ e.parent = node;
301
+ const ns =
302
+ n.namespaces === null
303
+ ? null
304
+ : n.namespaces.length === 1
305
+ ? n.namespaces[0]
306
+ : rt.defaultXmlNamespace;
307
+ e.setName(n.local, ns);
308
+ replaceAt(rt, node, i, xmlOf(rt, e));
309
+ e.addInScopeNamespace(ns);
310
+ }
311
+ }
312
+
313
+ if (primitiveAssign) {
314
+ const xi = node.children[i];
315
+ let prior: Value;
316
+ if (notifyNeeded(xi)) {
317
+ for (const child of xi.children) {
318
+ if (child.kind === ELEMENT) {
319
+ childChanges(rt, xi, "nodeRemoved", xmlOf(rt, child));
320
+ }
321
+ }
322
+
323
+ if (xi.children.length) {
324
+ prior = xmlOf(rt, xi.children[0]);
325
+ }
326
+ }
327
+
328
+ xi.children.length = 0;
329
+ const s = rt.toString(c);
330
+ if (s.length) {
331
+ replaceAt(rt, xi, 0, c, prior);
332
+ }
333
+ } else {
334
+ const prior = replaceAt(rt, node, i, c);
335
+ if (notifyNeeded(node) && node.children.length > i) {
336
+ childChanges(
337
+ rt,
338
+ node,
339
+ prior ? "nodeChanged" : "nodeAdded",
340
+ xmlOf(rt, node.children[i]),
341
+ prior,
342
+ );
343
+ }
344
+ }
345
+ }
346
+
347
+ /** [[Delete]]. */
348
+ export function deleteXML(rt: Runtime, o: AsObject, name: XName): boolean {
349
+ const n = coerce(rt, name);
350
+ if (indexOf(n) >= 0) {
351
+ return true;
352
+ }
353
+
354
+ const node: XMLNode = o.$node;
355
+ if (n.attribute) {
356
+ let j = 0;
357
+ while (j < node.attributes.length) {
358
+ const x = node.attributes[j];
359
+ if (matches(n, x)) {
360
+ x.parent = null;
361
+ node.attributes.splice(j, 1);
362
+ nonChildChanges(rt, node, "attributeRemoved", x.name ?? undefined, x.value);
363
+ } else {
364
+ j++;
365
+ }
366
+ }
367
+
368
+ return true;
369
+ }
370
+
371
+ const notify = notifyNeeded(node);
372
+ let q = 0;
373
+ while (q < node.children.length) {
374
+ const x = node.children[q];
375
+ if (matchesChild(n, x)) {
376
+ x.parent = null;
377
+ node.deleteByIndex(q);
378
+ if (notify && x.kind === ELEMENT) {
379
+ childChanges(rt, node, "nodeRemoved", xmlOf(rt, x));
380
+ }
381
+ } else {
382
+ q++;
383
+ }
384
+ }
385
+
386
+ return true;
387
+ }
388
+
389
+ /** [[HasProperty]]. */
390
+ export function hasXML(rt: Runtime, o: AsObject, name: XName): boolean {
391
+ const n = coerce(rt, name);
392
+ const index = indexOf(n);
393
+ if (index >= 0) {
394
+ return index === 0;
395
+ }
396
+
397
+ const node: XMLNode = o.$node;
398
+ if (n.attribute) {
399
+ return node.attributes.some((a) => matches(n, a));
400
+ }
401
+
402
+ return node.children.some((c) => matchesChild(n, c));
403
+ }
404
+
405
+ /** [[Descendants]]: the attributes or elements the name names, in each child, depth first. */
406
+ export function descendantsOf(rt: Runtime, node: XMLNode, name: XName): AsObject {
407
+ const n = coerce(rt, name);
408
+ const list = newList(rt);
409
+ if (n.attribute) {
410
+ for (const a of node.attributes) {
411
+ if (matches(n, a)) {
412
+ appendNode(list, a);
413
+ }
414
+ }
415
+ }
416
+
417
+ for (const child of node.children) {
418
+ if (!n.attribute && matchesChild(n, child)) {
419
+ appendNode(list, child);
420
+ }
421
+
422
+ const dq = descendantsOf(rt, child, n);
423
+ if (dq.$nodes.length) {
424
+ append(list, dq);
425
+ }
426
+ }
427
+
428
+ return list;
429
+ }
430
+
431
+ // XMLList's internal methods, E4X 9.2.1.
432
+
433
+ export function getList(rt: Runtime, o: AsObject, n: XName): Value {
434
+ const nodes: XMLNode[] = o.$nodes;
435
+ const index = indexOf(n);
436
+ if (index >= 0) {
437
+ return index < nodes.length ? xmlOf(rt, nodes[index]) : undefined;
438
+ }
439
+
440
+ const list = newList(rt, o, n);
441
+ for (const node of nodes) {
442
+ if (node.kind === ELEMENT) {
443
+ const gq = getXML(rt, xmlOf(rt, node), n);
444
+ if (gq.$nodes.length) {
445
+ append(list, gq);
446
+ }
447
+ }
448
+ }
449
+
450
+ return list;
451
+ }
452
+
453
+ export function setList(rt: Runtime, o: AsObject, n: XName, value: Value): void {
454
+ const index = indexOf(n);
455
+ if (index >= 0) {
456
+ setIndex(rt, o, index, value);
457
+ return;
458
+ }
459
+
460
+ const nodes: XMLNode[] = o.$nodes;
461
+ if (nodes.length > 1) {
462
+ throw rt.error("TypeError", ASSIGNMENT_ONE_ITEM_LISTS);
463
+ }
464
+
465
+ if (nodes.length === 0) {
466
+ const r = resolveValue(rt, o);
467
+ if (r === null) {
468
+ return;
469
+ }
470
+
471
+ // As avmplus: an XML value's own length is its children's.
472
+ if (isXML(r) && r.$node.children.length !== 1) {
473
+ return;
474
+ }
475
+
476
+ if (isList(r) && r.$nodes.length !== 1) {
477
+ return;
478
+ }
479
+
480
+ append(o, r);
481
+ }
482
+
483
+ setXML(rt, xmlOf(rt, nodes[0]), n, value);
484
+ }
485
+
486
+ export function deleteList(rt: Runtime, o: AsObject, n: XName): boolean {
487
+ const index = indexOf(n);
488
+ if (index >= 0) {
489
+ return deleteIndex(rt, o, index);
490
+ }
491
+
492
+ for (const node of o.$nodes as XMLNode[]) {
493
+ if (node.kind === ELEMENT) {
494
+ deleteXML(rt, xmlOf(rt, node), n);
495
+ }
496
+ }
497
+
498
+ return true;
499
+ }
500
+
501
+ export function hasList(rt: Runtime, o: AsObject, n: XName): boolean {
502
+ const nodes: XMLNode[] = o.$nodes;
503
+ const index = indexOf(n);
504
+ if (index >= 0) {
505
+ return index < nodes.length;
506
+ }
507
+
508
+ return nodes.some((node) => node.kind === ELEMENT && hasXML(rt, xmlOf(rt, node), n));
509
+ }
510
+
511
+ export function descendantsOfList(rt: Runtime, o: AsObject, n: XName): AsObject {
512
+ const list = newList(rt);
513
+ for (const node of o.$nodes as XMLNode[]) {
514
+ if (node.kind === ELEMENT) {
515
+ const dq = descendantsOf(rt, node, n);
516
+ if (dq.$nodes.length) {
517
+ append(list, dq);
518
+ }
519
+ }
520
+ }
521
+
522
+ return list;
523
+ }
524
+
525
+ /**
526
+ * As _resolveValue: a list with nodes; an empty one, the property of its
527
+ * target it was got from, which is made, empty, if there is none, so that
528
+ * assigning to x.a.b makes <a>.
529
+ */
530
+ function resolveValue(rt: Runtime, v: Value): Value {
531
+ if (isXML(v)) {
532
+ return v;
533
+ }
534
+
535
+ if (v.$nodes.length > 0) {
536
+ return v;
537
+ }
538
+
539
+ fixTarget(rt, v);
540
+ const property: XName = v.$targetProperty;
541
+ if (v.$target === null || property.attribute || property.local === null) {
542
+ return null;
543
+ }
544
+
545
+ const base = resolveValue(rt, v.$target);
546
+ if (base === null) {
547
+ return null;
548
+ }
549
+
550
+ const get = (b: Value) =>
551
+ isXML(b) ? getXML(rt, b, property) : getList(rt, b, coerce(rt, property));
552
+ const target = get(base);
553
+ if (!isList(target)) {
554
+ return null;
555
+ }
556
+
557
+ if (!target.$nodes.length) {
558
+ if (isList(base) && base.$nodes.length > 1) {
559
+ throw rt.error("TypeError", ASSIGNMENT_ONE_ITEM_LISTS);
560
+ }
561
+
562
+ if (isXML(base)) {
563
+ setXML(rt, base, property, "");
564
+ } else {
565
+ setList(rt, base, coerce(rt, property), "");
566
+ }
567
+
568
+ return get(base);
569
+ }
570
+
571
+ return target;
572
+ }
573
+
574
+ /** As XMLListObject::setUintProperty: item i, or a new last one, set to `value`. */
575
+ export function setIndex(rt: Runtime, o: AsObject, index: number, value: Value): void {
576
+ const nodes: XMLNode[] = o.$nodes;
577
+ let i = index;
578
+ let v = value;
579
+ let r: Value = null;
580
+ fixTarget(rt, o);
581
+ if (o.$target !== null) {
582
+ r = resolveValue(rt, o.$target);
583
+ if (r === null) {
584
+ return;
585
+ }
586
+ }
587
+
588
+ if (i >= nodes.length) {
589
+ if (isList(r)) {
590
+ if (r.$nodes.length !== 1) {
591
+ return;
592
+ }
593
+
594
+ r = xmlOf(rt, r.$nodes[0]);
595
+ }
596
+
597
+ const rx: XMLNode | null = isXML(r) ? r.$node : null;
598
+ if (rx && rx.kind !== ELEMENT) {
599
+ return;
600
+ }
601
+
602
+ const property: XName = o.$targetProperty;
603
+ let y: XMLNode;
604
+ if (property.attribute) {
605
+ if (!rx) {
606
+ return;
607
+ }
608
+
609
+ const exists = getXML(rt, r, property);
610
+ if (isList(exists) && exists.$nodes.length > 0) {
611
+ return;
612
+ }
613
+
614
+ y = new XMLNode(ATTRIBUTE);
615
+ y.parent = rx;
616
+ y.setName(property.local, property.namespaces?.[0] ?? null);
617
+ nonChildChanges(rt, rx, "attributeAdded", property.local);
618
+ } else if (
619
+ property.local === null ||
620
+ (isXML(v) && (v.$node.kind === ATTRIBUTE || v.$node.kind === TEXT))
621
+ ) {
622
+ y = new XMLNode(TEXT);
623
+ y.parent = rx;
624
+ } else {
625
+ y = new XMLNode(ELEMENT);
626
+ y.parent = rx;
627
+ y.setName(property.local, property.namespaces?.[0] ?? null);
628
+ }
629
+
630
+ i = nodes.length;
631
+ if (y.kind !== ATTRIBUTE) {
632
+ const parent = y.parent;
633
+ if (parent) {
634
+ // After the list's last node among the parent's children, else last.
635
+ let j: number;
636
+ if (i > 0) {
637
+ j = 0;
638
+ while (j < parent.children.length - 1 && parent.children[j] !== nodes[i - 1]) {
639
+ j++;
640
+ }
641
+
642
+ j++;
643
+ } else {
644
+ j = parent.children.length;
645
+ }
646
+
647
+ parent.children.splice(j, 0, y);
648
+ }
649
+
650
+ if (isXML(v)) {
651
+ const node: XMLNode = v.$node;
652
+ if (node.name !== null) {
653
+ y.setName(node.name, node.ns);
654
+ }
655
+ } else if (isList(v)) {
656
+ const p: XName = v.$targetProperty;
657
+ if (p.local !== null) {
658
+ y.setName(p.local, p.namespaces?.[0] ?? null);
659
+ }
660
+ }
661
+ }
662
+
663
+ appendNode(o, y);
664
+ }
665
+
666
+ if (isList(v)) {
667
+ const src: XMLNode[] = v.$nodes;
668
+ if (src.length === 1 && src[0].kind & (TEXT | ATTRIBUTE)) {
669
+ v = rt.toString(v);
670
+ }
671
+ } else if (isXML(v)) {
672
+ if (v.$node.kind & (TEXT | ATTRIBUTE)) {
673
+ v = rt.toString(v);
674
+ }
675
+ } else {
676
+ v = rt.toString(v);
677
+ }
678
+
679
+ const xi = nodes[i];
680
+ if (xi.kind === ATTRIBUTE) {
681
+ if (!xi.parent) {
682
+ return;
683
+ }
684
+
685
+ const parent = xmlOf(rt, xi.parent);
686
+ const name = xi.xname() as XName;
687
+ setXML(rt, parent, name, v);
688
+ const attr = getXML(rt, parent, name);
689
+ nodes[i] = attr.$nodes[0];
690
+ } else if (isList(v)) {
691
+ const c = newList(rt);
692
+ c.$nodes.push(...v.$nodes);
693
+ const parent = xi.parent;
694
+ if (parent) {
695
+ const q = parent.children.indexOf(xi);
696
+ if (q >= 0) {
697
+ replaceAt(rt, parent, q, c);
698
+ for (let j = 0; j < c.$nodes.length; j++) {
699
+ c.$nodes[j] = parent.children[q + j];
700
+ }
701
+ }
702
+ }
703
+
704
+ const notify = parent !== null && notifyNeeded(parent);
705
+ const prior = xi;
706
+ nodes.splice(i, 1, ...c.$nodes);
707
+ if (notify && parent) {
708
+ for (let i2 = 0; i2 < c.$nodes.length; i2++) {
709
+ const node: XMLNode = c.$nodes[i2];
710
+ if (parent === node.parent) {
711
+ if (i2 === 0) {
712
+ if (node !== prior) {
713
+ childChanges(rt, parent, "nodeChanged", xmlOf(rt, node), prior);
714
+ }
715
+ } else {
716
+ childChanges(rt, parent, "nodeAdded", xmlOf(rt, node));
717
+ }
718
+ }
719
+ }
720
+ }
721
+ } else if (isXML(v) || xi.kind & (TEXT | CDATA | COMMENT | PROCESSING_INSTRUCTION)) {
722
+ const parent = xi.parent;
723
+ if (parent) {
724
+ const q = parent.children.indexOf(xi);
725
+ if (q >= 0) {
726
+ replaceAt(rt, parent, q, v);
727
+ v = xmlOf(rt, parent.children[q]);
728
+ if (notifyNeeded(parent)) {
729
+ childChanges(rt, parent, "nodeAdded", v);
730
+ }
731
+ }
732
+ }
733
+
734
+ nodes[i] = (isXML(v) ? v : toXML(rt, v)).$node;
735
+ } else {
736
+ setXML(rt, xmlOf(rt, xi), toXMLName(rt, "*"), v);
737
+ }
738
+ }
739
+
740
+ /** As XMLListObject::delUintProperty: item `index` out of the list, and out of its parent. */
741
+ export function deleteIndex(rt: Runtime, o: AsObject, index: number): boolean {
742
+ const nodes: XMLNode[] = o.$nodes;
743
+ if (index >= nodes.length) {
744
+ return true;
745
+ }
746
+
747
+ const xi = nodes[index];
748
+ const px = xi.parent;
749
+ if (px) {
750
+ if (xi.kind === ATTRIBUTE) {
751
+ deleteXML(rt, xmlOf(rt, px), xi.xname() as XName);
752
+ } else {
753
+ const q = xi.childIndex();
754
+ const x = px.children[q];
755
+ px.deleteByIndex(q);
756
+ if (x && notifyNeeded(px) && x.kind === ELEMENT) {
757
+ childChanges(rt, px, "nodeRemoved", xmlOf(rt, x));
758
+ }
759
+ }
760
+ }
761
+
762
+ if (index < nodes.length) {
763
+ nodes.splice(index, 1);
764
+ }
765
+
766
+ return true;
767
+ }