@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,414 @@
1
+ // XML text into tags, as avmplus' XMLParser: a tokenizer, not a validating
2
+ // parser, whose leniency and errors are avmplus', which E4X's are. The tree
3
+ // is made from its tags in build.ts.
4
+ //
5
+ // Translated from avmplus' core/XMLParser16.cpp, this file is subject to the
6
+ // Mozilla Public License, v. 2.0: http://mozilla.org/MPL/2.0/.
7
+ import { isSpace } from "./chars.js";
8
+
9
+ // The tags, as XMLTag's node types.
10
+ export const TAG_ELEMENT = 1;
11
+ export const TAG_TEXT = 3;
12
+ export const TAG_CDATA = 4;
13
+ export const TAG_PROCESSING_INSTRUCTION = 7;
14
+ export const TAG_COMMENT = 8;
15
+ export const TAG_DOCTYPE = 10;
16
+ export const TAG_XML_DECLARATION = 13;
17
+
18
+ // What getNext gives, as XMLParser's status codes: a tag, the end, or the
19
+ // error E4X throws for each (see PARSE_ERRORS in values.ts).
20
+ export const OK = 0;
21
+ export const END = -1;
22
+ export const UNTERMINATED_CDATA = -2;
23
+ export const UNTERMINATED_XML_DECLARATION = -3;
24
+ export const UNTERMINATED_DOCTYPE = -4;
25
+ export const UNTERMINATED_COMMENT = -5;
26
+ export const MALFORMED_ELEMENT = -6;
27
+ export const UNTERMINATED_ATTRIBUTE_VALUE = -8;
28
+ export const UNTERMINATED_PROCESSING_INSTRUCTION = -10;
29
+
30
+ export class XMLTag {
31
+ type = 0;
32
+ /** An element's name (with "/" first for an end tag), or the text of any other tag. */
33
+ text = "";
34
+ /** Whether an element closed itself, as <a/>. */
35
+ empty = false;
36
+ /** An element's attributes, name then value. */
37
+ attributes: string[] = [];
38
+
39
+ reset(): void {
40
+ this.type = 0;
41
+ this.text = "";
42
+ this.empty = false;
43
+ this.attributes = [];
44
+ }
45
+ }
46
+
47
+ /** The entities XMLParser knows: the XML ones, and nbsp. */
48
+ const ENTITIES: Record<string, string> = {
49
+ amp: "&",
50
+ quot: '"',
51
+ apos: "'",
52
+ lt: "<",
53
+ gt: ">",
54
+ nbsp: "\u00a0",
55
+ };
56
+
57
+ export class XMLParser {
58
+ private pos = 0;
59
+ private ignoreWhite = false;
60
+ private condenseWhite = false;
61
+ private readonly text: string;
62
+
63
+ constructor(text: string) {
64
+ this.text = text;
65
+ }
66
+
67
+ /** As XMLParser::parse: from the start, whitespace-only text left out if `ignoreWhite`. */
68
+ parse(ignoreWhite: boolean): void {
69
+ this.pos = 0;
70
+ this.ignoreWhite = ignoreWhite;
71
+ }
72
+
73
+ setCondenseWhite(condense: boolean): void {
74
+ this.condenseWhite = condense;
75
+ }
76
+
77
+ private atEnd(): boolean {
78
+ return this.pos >= this.text.length;
79
+ }
80
+
81
+ /** Past whitespace: false at the end. */
82
+ private skipWhiteSpace(): boolean {
83
+ while (!this.atEnd() && isSpace(this.text.charCodeAt(this.pos))) {
84
+ this.pos++;
85
+ }
86
+
87
+ return !this.atEnd();
88
+ }
89
+
90
+ /** Whether the text at `at` starts with `s`, ignoring ASCII case, as matchesLatin1_caseless. */
91
+ private matchesCaseless(s: string, at: number): boolean {
92
+ return this.text.slice(at, at + s.length).toLowerCase() === s.toLowerCase();
93
+ }
94
+
95
+ /** The next tag into `tag`: OK, END, or an error. */
96
+ getNext(tag: XMLTag): number {
97
+ const str = this.text;
98
+ tag.reset();
99
+ if (this.atEnd()) {
100
+ return END;
101
+ }
102
+
103
+ // With ignoreWhite, no text nodes of whitespace alone.
104
+ if (this.ignoreWhite && !this.skipWhiteSpace()) {
105
+ return END;
106
+ }
107
+
108
+ let start = this.pos;
109
+ if (str[this.pos] !== "<") {
110
+ // Text, up to the next < or the end.
111
+ let next = str.indexOf("<", this.pos + 1);
112
+ if (next < 0) {
113
+ next = str.length;
114
+ }
115
+
116
+ this.pos = next;
117
+ tag.text = this.unescape(start, next);
118
+ if (this.ignoreWhite && this.condenseWhite) {
119
+ tag.text = trimWhitespace(tag.text);
120
+ }
121
+
122
+ tag.type = TAG_TEXT;
123
+ return OK;
124
+ }
125
+
126
+ if (this.matchesCaseless("<?xml ", start)) {
127
+ const end = str.indexOf("?>", start + 6);
128
+ if (end >= 0) {
129
+ tag.text = str.slice(start + 2, end);
130
+ this.pos = end + 2;
131
+ tag.type = TAG_XML_DECLARATION;
132
+ return OK;
133
+ }
134
+
135
+ return UNTERMINATED_XML_DECLARATION;
136
+ }
137
+
138
+ if (this.matchesCaseless("<!DOCTYPE", start)) {
139
+ // Up to its >, past any <...> within it.
140
+ let depth = 0;
141
+ let end = start + 1;
142
+ while (!this.atEnd()) {
143
+ const ch = str[end++];
144
+ if (ch === "<") {
145
+ depth++;
146
+ } else if (ch === ">") {
147
+ if (!depth) {
148
+ tag.text = str.slice(start, end);
149
+ tag.type = TAG_DOCTYPE;
150
+ this.pos = end;
151
+ return OK;
152
+ }
153
+
154
+ depth--;
155
+ }
156
+
157
+ this.pos = end;
158
+ }
159
+
160
+ return UNTERMINATED_DOCTYPE;
161
+ }
162
+
163
+ if (this.matchesCaseless("<![CDATA[", start)) {
164
+ start += 9;
165
+ const end = str.indexOf("]]>", start);
166
+ if (end >= 0) {
167
+ tag.text = str.slice(start, end);
168
+ tag.type = TAG_CDATA;
169
+ this.pos = end + 3;
170
+ return OK;
171
+ }
172
+
173
+ return UNTERMINATED_CDATA;
174
+ }
175
+
176
+ if (str.startsWith("<?", start)) {
177
+ start += 2;
178
+ const end = str.indexOf("?>", start);
179
+ if (end >= 0) {
180
+ tag.text = str.slice(start, end);
181
+ tag.type = TAG_PROCESSING_INSTRUCTION;
182
+ this.pos = end + 2;
183
+ return OK;
184
+ }
185
+
186
+ return UNTERMINATED_PROCESSING_INSTRUCTION;
187
+ }
188
+
189
+ start = ++this.pos;
190
+ if (str.startsWith("!--", start)) {
191
+ start += 3;
192
+ const end = str.indexOf("-->", start);
193
+ if (end >= 0) {
194
+ tag.text = str.slice(start, end);
195
+ tag.type = TAG_COMMENT;
196
+ this.pos = end + 3;
197
+ return OK;
198
+ }
199
+
200
+ return UNTERMINATED_COMMENT;
201
+ }
202
+
203
+ // An element: its name, up to >, whitespace or />.
204
+ start = this.pos;
205
+ while (!this.atEnd()) {
206
+ const ch = str[this.pos];
207
+ if (ch === ">" || isSpace(ch.charCodeAt(0))) {
208
+ break;
209
+ }
210
+
211
+ if (ch === "/" && this.pos < str.length - 1 && str[this.pos + 1] === ">") {
212
+ break;
213
+ }
214
+
215
+ this.pos++;
216
+ }
217
+
218
+ if (this.atEnd() || this.pos === start) {
219
+ return MALFORMED_ELEMENT;
220
+ }
221
+
222
+ tag.text = this.unescape(start, this.pos);
223
+ tag.type = TAG_ELEMENT;
224
+
225
+ // Its attributes.
226
+ let ch = "";
227
+ for (;;) {
228
+ if (!this.skipWhiteSpace()) {
229
+ return MALFORMED_ELEMENT;
230
+ }
231
+
232
+ ch = str[this.pos];
233
+ if (ch === ">") {
234
+ break;
235
+ }
236
+
237
+ if (ch === "/" && this.pos < str.length - 1 && str[this.pos + 1] === ">") {
238
+ tag.empty = true;
239
+ ch = str[++this.pos];
240
+ break;
241
+ }
242
+
243
+ start = this.pos;
244
+ while (!isSpace(ch.charCodeAt(0)) && ch !== "=" && ch !== ">") {
245
+ this.pos++;
246
+ if (this.atEnd()) {
247
+ return MALFORMED_ELEMENT;
248
+ }
249
+
250
+ ch = str[this.pos];
251
+ }
252
+
253
+ if (start === this.pos) {
254
+ return MALFORMED_ELEMENT;
255
+ }
256
+
257
+ const name = this.unescape(start, this.pos);
258
+ if (!this.skipWhiteSpace()) {
259
+ return MALFORMED_ELEMENT;
260
+ }
261
+
262
+ if (str[this.pos++] !== "=") {
263
+ return MALFORMED_ELEMENT;
264
+ }
265
+
266
+ if (!this.skipWhiteSpace()) {
267
+ return MALFORMED_ELEMENT;
268
+ }
269
+
270
+ const delimiter = str[this.pos++];
271
+ if (delimiter !== '"' && delimiter !== "'") {
272
+ return MALFORMED_ELEMENT;
273
+ }
274
+
275
+ // Up to the closing quote; < is not allowed within.
276
+ start = this.pos;
277
+ ch = "";
278
+ while (ch !== delimiter) {
279
+ if (this.atEnd() || ch === "<") {
280
+ return UNTERMINATED_ATTRIBUTE_VALUE;
281
+ }
282
+
283
+ ch = str[this.pos++];
284
+ }
285
+
286
+ tag.attributes.push(name, this.unescape(start, this.pos - 1));
287
+ }
288
+
289
+ if (ch === ">") {
290
+ this.pos++;
291
+ }
292
+
293
+ return OK;
294
+ }
295
+
296
+ /**
297
+ * As XMLParser::unescape: [start, last) with its entity and character
298
+ * references decoded: &#dd; and &#xhh; up to 0xFFFF, and ENTITIES. An &
299
+ * without a ; ends the decoding; one that is not a known reference is
300
+ * kept as it is.
301
+ */
302
+ private unescape(start: number, last: number): string {
303
+ const str = this.text;
304
+ if (start === last) {
305
+ return "";
306
+ }
307
+
308
+ let bgn = str.indexOf("&", start);
309
+ if (bgn < 0 || bgn >= last) {
310
+ return str.slice(start, last);
311
+ }
312
+
313
+ let dest = "";
314
+ let end = start;
315
+ while (bgn >= start && bgn < last) {
316
+ const ampBgn = bgn;
317
+ const ampEnd = str.indexOf(";", ++bgn);
318
+ if (ampEnd < 0 || ampEnd >= last) {
319
+ break;
320
+ }
321
+
322
+ dest += str.slice(end, bgn - 1);
323
+ end = ampEnd;
324
+ let len = end - bgn;
325
+ let ok = true;
326
+ if (len >= 2) {
327
+ if (str[bgn] === "#") {
328
+ let ch = str.charCodeAt(++bgn);
329
+ len--;
330
+ let base = 10;
331
+ if (len >= 2 && ch === 0x78) {
332
+ base = 16;
333
+ bgn++;
334
+ len--;
335
+ }
336
+
337
+ if (len > 0) {
338
+ let value = 0;
339
+ while (len-- && ok) {
340
+ ch = str.charCodeAt(bgn++);
341
+ if (ch >= 0x41 && ch <= 0x46) {
342
+ ch -= 7;
343
+ } else if (ch >= 0x61 && ch <= 0x66) {
344
+ ch -= 0x61 - 0x41 + 7;
345
+ }
346
+
347
+ ch -= 0x30;
348
+ if (ch >= 0 && ch < base) {
349
+ value = value * base + ch;
350
+ } else {
351
+ ok = false;
352
+ }
353
+
354
+ if (value > 0xffff) {
355
+ ok = false;
356
+ }
357
+ }
358
+
359
+ if (ok) {
360
+ dest += String.fromCharCode(value);
361
+ bgn = ++end;
362
+ }
363
+ }
364
+ } else if (len <= 4) {
365
+ const entity = ENTITIES[str.slice(bgn, end)];
366
+ if (entity !== undefined && Object.hasOwn(ENTITIES, str.slice(bgn, end))) {
367
+ dest += entity;
368
+ bgn = ++end;
369
+ } else {
370
+ ok = false;
371
+ }
372
+ } else {
373
+ ok = false;
374
+ }
375
+ } else {
376
+ ok = false;
377
+ }
378
+
379
+ if (!ok) {
380
+ // Kept as it is, rather than dropped, which would break content.
381
+ bgn = end + 1;
382
+ if (ampBgn < end) {
383
+ dest += str.slice(ampBgn, end);
384
+ }
385
+ }
386
+
387
+ bgn = str.indexOf("&", bgn);
388
+ if (bgn >= last) {
389
+ bgn = -1;
390
+ }
391
+ }
392
+
393
+ if (end < last) {
394
+ dest += str.slice(end, last);
395
+ }
396
+
397
+ return dest;
398
+ }
399
+ }
400
+
401
+ /** As _condenseWhitespace: `s` without leading and trailing whitespace. */
402
+ function trimWhitespace(s: string): string {
403
+ let start = 0;
404
+ while (start < s.length && isSpace(s.charCodeAt(start))) {
405
+ start++;
406
+ }
407
+
408
+ let end = s.length - 1;
409
+ while (end > start && isSpace(s.charCodeAt(end))) {
410
+ end--;
411
+ }
412
+
413
+ return s.slice(start, end + 1);
414
+ }
@@ -0,0 +1,241 @@
1
+ // E4X's strings: XML and XMLList as toString and toXMLString write them,
2
+ // pretty printed or not.
3
+ //
4
+ // Translated from avmplus' core/XMLObject.cpp and XMLListObject.cpp, this
5
+ // file is subject to the Mozilla Public License, v. 2.0:
6
+ // http://mozilla.org/MPL/2.0/.
7
+
8
+ import type { AsObject } from "../../descriptors.js";
9
+ import { type Namespace, prefixedNamespace, prefixOf } from "../../names.js";
10
+ import type { Runtime } from "../../runtime.js";
11
+ import { escapeAttributeValue, escapeElementValue } from "./escape.js";
12
+ import { getNamespace, hasPrefix } from "./names.js";
13
+ import {
14
+ ATTRIBUTE,
15
+ CDATA,
16
+ COMMENT,
17
+ ELEMENT,
18
+ PROCESSING_INSTRUCTION,
19
+ TEXT,
20
+ type XMLNode,
21
+ } from "./node.js";
22
+ import { e4x, okToPrettyPrint } from "./values.js";
23
+
24
+ // Strings.
25
+
26
+ /** As GenerateUniquePrefix: "" if no namespace has it, else the first of aaa to zzz none has. */
27
+ function uniquePrefix(ns: Namespace, namespaces: Namespace[]): Namespace {
28
+ if (!namespaces.some((n) => prefixOf(n) === "")) {
29
+ return prefixedNamespace("", ns.uri ?? "");
30
+ }
31
+
32
+ const a = 0x61;
33
+ for (let x1 = 0; x1 < 26; x1++) {
34
+ for (let x2 = 0; x2 < 26; x2++) {
35
+ for (let x3 = 0; x3 < 26; x3++) {
36
+ const p = String.fromCharCode(a + x1, a + x2, a + x3);
37
+ if (!namespaces.some((n) => prefixOf(n) === p)) {
38
+ return prefixedNamespace(p, ns.uri ?? "");
39
+ }
40
+ }
41
+ }
42
+ }
43
+
44
+ return ns;
45
+ }
46
+
47
+ /** As XMLObject::__toXMLString, E4X 10.2.1: `node` as XML text, into `out`. */
48
+ function toXMLStringOf(
49
+ rt: Runtime,
50
+ node: XMLNode,
51
+ ancestors: Namespace[],
52
+ indentLevel: number,
53
+ out: string[],
54
+ ): void {
55
+ const e = e4x(rt);
56
+ const pretty = okToPrettyPrint(e);
57
+ if (pretty && indentLevel > 0) {
58
+ out.push(" ".repeat(indentLevel));
59
+ }
60
+
61
+ switch (node.kind) {
62
+ case TEXT:
63
+ out.push(escapeElementValue(node.value, pretty));
64
+ return;
65
+ case CDATA:
66
+ out.push(`<![CDATA[${node.value}]]>`);
67
+ return;
68
+ case ATTRIBUTE:
69
+ out.push(escapeAttributeValue(node.value));
70
+ return;
71
+ case COMMENT:
72
+ out.push(`<!--${node.value}-->`);
73
+ return;
74
+ case PROCESSING_INSTRUCTION:
75
+ out.push(`<?${node.name} ${node.value}?>`);
76
+ return;
77
+ }
78
+
79
+ // The namespaces in scope not already among the ancestors'.
80
+ const origLength = ancestors.length;
81
+ for (const ns of node.inScopeNamespaces()) {
82
+ if (!ancestors.some((ns2) => ns.uri === ns2.uri && prefixOf(ns) === prefixOf(ns2))) {
83
+ ancestors.push(ns);
84
+ }
85
+ }
86
+
87
+ // This node's namespace, and its attributes', each with a prefix.
88
+ let own = getNamespace(node.ns, ancestors);
89
+ if (prefixOf(own) === undefined) {
90
+ own = uniquePrefix(own, ancestors);
91
+ ancestors.push(own);
92
+ }
93
+
94
+ for (const a of node.attributes) {
95
+ if (a.name !== null) {
96
+ const ns = getNamespace(a.ns, ancestors);
97
+ if (prefixOf(ns) === undefined) {
98
+ ancestors.push(uniquePrefix(ns, ancestors));
99
+ }
100
+ }
101
+ }
102
+
103
+ const prefix = prefixOf(own) as string;
104
+ const qualified = prefix !== "" ? `${prefix}:${node.name}` : (node.name as string);
105
+ out.push("<", qualified);
106
+ for (const a of node.attributes) {
107
+ if (a.name !== null) {
108
+ out.push(" ");
109
+ const ns = getNamespace(a.ns, ancestors);
110
+ if (hasPrefix(ns)) {
111
+ out.push(prefixOf(ns) as string, ":");
112
+ }
113
+
114
+ out.push(a.name, '="', escapeAttributeValue(a.value), '"');
115
+ }
116
+ }
117
+
118
+ for (let i = origLength; i < ancestors.length; i++) {
119
+ const ns = ancestors[i];
120
+ if (ns.uri !== "") {
121
+ const p = prefixOf(ns);
122
+ out.push(p !== "" ? ` xmlns:${p}="` : ' xmlns="', ns.uri ?? "", '"');
123
+ }
124
+ }
125
+
126
+ const children = node.children;
127
+ if (!children.length) {
128
+ out.push("/>");
129
+ return;
130
+ }
131
+
132
+ out.push(">");
133
+ const indentChildren = children.length > 1 || (children[0].kind & ~(TEXT | CDATA)) !== 0;
134
+ const nextIndentLevel = e.prettyPrinting && indentChildren ? indentLevel + e.prettyIndent : 0;
135
+
136
+ // The ancestors' namespaces less those whose prefix one here declares
137
+ // again, so that each is declared where it is shadowed.
138
+ const scope: Namespace[] = [];
139
+ for (let i = 0; i < ancestors.length; i++) {
140
+ const first = ancestors[i];
141
+ if (i < origLength) {
142
+ let j = origLength;
143
+ while (j < ancestors.length && prefixOf(ancestors[j]) !== prefixOf(first)) {
144
+ j++;
145
+ }
146
+
147
+ if (j === ancestors.length) {
148
+ scope.push(first);
149
+ }
150
+ } else {
151
+ scope.push(first);
152
+ }
153
+ }
154
+
155
+ const scopeLength = scope.length;
156
+ for (const child of children) {
157
+ if (pretty && indentChildren) {
158
+ out.push("\n");
159
+ }
160
+
161
+ toXMLStringOf(rt, child, scope, nextIndentLevel, out);
162
+ scope.length = scopeLength;
163
+ }
164
+
165
+ if (pretty && indentChildren) {
166
+ out.push("\n");
167
+ if (indentLevel > 0) {
168
+ out.push(" ".repeat(indentLevel));
169
+ }
170
+ }
171
+
172
+ out.push("</", qualified, ">");
173
+ }
174
+
175
+ export function xmlToXMLString(rt: Runtime, node: XMLNode): string {
176
+ const out: string[] = [];
177
+ toXMLStringOf(rt, node, [], 0, out);
178
+ return out.join("");
179
+ }
180
+
181
+ export function listToXMLString(rt: Runtime, list: AsObject): string {
182
+ const out: string[] = [];
183
+ const nodes: XMLNode[] = list.$nodes;
184
+ for (let i = 0; i < nodes.length; i++) {
185
+ if (i) {
186
+ out.push("\n");
187
+ }
188
+
189
+ toXMLStringOf(rt, nodes[i], [], 0, out);
190
+ }
191
+
192
+ return out.join("");
193
+ }
194
+
195
+ /** As XMLObject::toString, E4X 10.1.1: a simple node's text, else its XML. */
196
+ export function xmlToString(rt: Runtime, node: XMLNode): string {
197
+ if (node.kind & (TEXT | CDATA | ATTRIBUTE)) {
198
+ return node.value;
199
+ }
200
+
201
+ if (node.hasSimpleContent()) {
202
+ let s = "";
203
+ for (const child of node.children) {
204
+ if (child.kind !== COMMENT && child.kind !== PROCESSING_INSTRUCTION) {
205
+ s += xmlToString(rt, child);
206
+ }
207
+ }
208
+
209
+ return s;
210
+ }
211
+
212
+ return xmlToXMLString(rt, node);
213
+ }
214
+
215
+ export function listHasSimpleContent(nodes: XMLNode[]): boolean {
216
+ if (nodes.length === 0) {
217
+ return true;
218
+ }
219
+
220
+ if (nodes.length === 1) {
221
+ return nodes[0].hasSimpleContent();
222
+ }
223
+
224
+ return !nodes.some((n) => n.kind === ELEMENT);
225
+ }
226
+
227
+ export function listToString(rt: Runtime, list: AsObject): string {
228
+ const nodes: XMLNode[] = list.$nodes;
229
+ if (listHasSimpleContent(nodes)) {
230
+ let s = "";
231
+ for (const node of nodes) {
232
+ if (node.kind !== COMMENT && node.kind !== PROCESSING_INSTRUCTION) {
233
+ s += xmlToString(rt, node);
234
+ }
235
+ }
236
+
237
+ return s;
238
+ }
239
+
240
+ return listToXMLString(rt, list);
241
+ }