wsemi 1.9.21 → 1.9.22

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 (518) hide show
  1. package/README.md +1 -1
  2. package/dist/wsemi.umd.js +6 -6
  3. package/dist/wsemi.umd.js.map +1 -1
  4. package/docs/-_class.mjs.html +1 -1
  5. package/docs/-_const.mjs.html +1 -1
  6. package/docs/-_detector.mjs.html +1 -1
  7. package/docs/-_errToStr.mjs.html +1 -1
  8. package/docs/-_execThrownMsg.mjs.html +1 -1
  9. package/docs/-_isRealError.mjs.html +1 -1
  10. package/docs/-_optNum.mjs.html +1 -1
  11. package/docs/-_pmMarkHandled.mjs.html +1 -1
  12. package/docs/-_pmReadItems.mjs.html +1 -1
  13. package/docs/-_pmSettleByState.mjs.html +1 -1
  14. package/docs/-_realErrorToStr.mjs.html +1 -1
  15. package/docs/-_toResultError.mjs.html +1 -1
  16. package/docs/ab2blob.mjs.html +1 -1
  17. package/docs/ab2u8arr.mjs.html +1 -1
  18. package/docs/addExcelWorksheetFromData.mjs.html +1 -1
  19. package/docs/addMonth.mjs.html +1 -1
  20. package/docs/aes2str.mjs.html +1 -1
  21. package/docs/alive.mjs.html +1 -1
  22. package/docs/arr2dt.mjs.html +1 -1
  23. package/docs/arrAccum.mjs.html +1 -1
  24. package/docs/arrAdd.mjs.html +1 -1
  25. package/docs/arrAt.mjs.html +1 -1
  26. package/docs/arrDiff.mjs.html +1 -1
  27. package/docs/arrFilterByKeywords.mjs.html +1 -1
  28. package/docs/arrFilterByNum.mjs.html +1 -1
  29. package/docs/arrFilterByPnum.mjs.html +1 -1
  30. package/docs/arrFilterByPnumAndToLog.mjs.html +1 -1
  31. package/docs/arrFind.mjs.html +1 -1
  32. package/docs/arrGroupByMaxmin.mjs.html +1 -1
  33. package/docs/arrHas.mjs.html +1 -1
  34. package/docs/arrInsert.mjs.html +1 -1
  35. package/docs/arrLookupByMaxmin.mjs.html +1 -1
  36. package/docs/arrMax.mjs.html +1 -1
  37. package/docs/arrMin.mjs.html +1 -1
  38. package/docs/arrMulti.mjs.html +1 -1
  39. package/docs/arrNorm.mjs.html +1 -1
  40. package/docs/arrProduct.mjs.html +1 -1
  41. package/docs/arrPull.mjs.html +1 -1
  42. package/docs/arrPullAt.mjs.html +1 -1
  43. package/docs/arrReduce.mjs.html +1 -1
  44. package/docs/arrReverse.mjs.html +1 -1
  45. package/docs/arrSep.mjs.html +1 -1
  46. package/docs/arrSort.mjs.html +1 -1
  47. package/docs/asind.mjs.html +1 -1
  48. package/docs/atan2d.mjs.html +1 -1
  49. package/docs/atand.mjs.html +1 -1
  50. package/docs/attstr.mjs.html +1 -1
  51. package/docs/b642obj.mjs.html +1 -1
  52. package/docs/b642str.mjs.html +1 -1
  53. package/docs/b642u16arr.mjs.html +1 -1
  54. package/docs/b642u8arr.mjs.html +1 -1
  55. package/docs/binstr.mjs.html +1 -1
  56. package/docs/blob2ab.mjs.html +1 -1
  57. package/docs/blob2b64.mjs.html +1 -1
  58. package/docs/blob2str.mjs.html +1 -1
  59. package/docs/blob2u8arr.mjs.html +1 -1
  60. package/docs/blobs2b64s.mjs.html +1 -1
  61. package/docs/blobs2u8arrs.mjs.html +1 -1
  62. package/docs/bodyLog.mjs.html +1 -1
  63. package/docs/browserView.mjs.html +1 -1
  64. package/docs/browserViewFromBlob.mjs.html +1 -1
  65. package/docs/browserViewFromText.mjs.html +1 -1
  66. package/docs/browserViewFromU8arr.mjs.html +1 -1
  67. package/docs/bs2u8arr.mjs.html +1 -1
  68. package/docs/bufRead.mjs.html +1 -1
  69. package/docs/bufReadDbl.mjs.html +1 -1
  70. package/docs/bufWrite.mjs.html +1 -1
  71. package/docs/bufWriteDbl.mjs.html +1 -1
  72. package/docs/cache.mjs.html +1 -1
  73. package/docs/cacheBd.mjs.html +1 -1
  74. package/docs/cacheSt.mjs.html +1 -1
  75. package/docs/cbol.mjs.html +1 -1
  76. package/docs/cdbl.mjs.html +1 -1
  77. package/docs/ceil.mjs.html +1 -1
  78. package/docs/cfilesize.mjs.html +1 -1
  79. package/docs/cfinancial.mjs.html +1 -1
  80. package/docs/cint.mjs.html +1 -1
  81. package/docs/clearXSS.mjs.html +263 -25
  82. package/docs/clearXSSDyn.mjs.html +1 -1
  83. package/docs/color.mjs.html +1 -1
  84. package/docs/composeToTree.mjs.html +1 -1
  85. package/docs/convertToTree.mjs.html +1 -1
  86. package/docs/copyStrToClipboard.mjs.html +1 -1
  87. package/docs/cosd.mjs.html +1 -1
  88. package/docs/cotd.mjs.html +1 -1
  89. package/docs/createExcelWorkbook.mjs.html +1 -1
  90. package/docs/cscd.mjs.html +1 -1
  91. package/docs/cstr.mjs.html +1 -1
  92. package/docs/cvOrmFind.mjs.html +1 -1
  93. package/docs/day2cht.mjs.html +1 -1
  94. package/docs/debounce.mjs.html +1 -1
  95. package/docs/delay.mjs.html +1 -1
  96. package/docs/detectXSS.mjs.html +1 -1
  97. package/docs/detectXSSDyn.mjs.html +1 -1
  98. package/docs/dig.mjs.html +1 -1
  99. package/docs/digExp.mjs.html +1 -1
  100. package/docs/domAlert.mjs.html +1 -1
  101. package/docs/domAppend.mjs.html +1 -1
  102. package/docs/domCancelEvent.mjs.html +1 -1
  103. package/docs/domCompareText.mjs.html +1 -1
  104. package/docs/domConvertToPic.mjs.html +1 -1
  105. package/docs/domConvertToPicDyn.mjs.html +1 -1
  106. package/docs/domDetect.mjs.html +1 -1
  107. package/docs/domDrag.mjs.html +1 -1
  108. package/docs/domDragBarAndScroll.mjs.html +1 -1
  109. package/docs/domDragPointer.mjs.html +1 -1
  110. package/docs/domDragPreview.mjs.html +1 -1
  111. package/docs/domDropFiles.mjs.html +1 -1
  112. package/docs/domElementsFromPoint.mjs.html +1 -1
  113. package/docs/domFadeIn.mjs.html +1 -1
  114. package/docs/domFadeOut.mjs.html +1 -1
  115. package/docs/domFind.mjs.html +1 -1
  116. package/docs/domFinds.mjs.html +1 -1
  117. package/docs/domGetAttr.mjs.html +1 -1
  118. package/docs/domGetBoudRect.mjs.html +1 -1
  119. package/docs/domGetBoudRectRefSelf.mjs.html +1 -1
  120. package/docs/domGetFileAccept.mjs.html +1 -1
  121. package/docs/domGetFiles.mjs.html +1 -1
  122. package/docs/domGetParents.mjs.html +1 -1
  123. package/docs/domGetPointFromEvent.mjs.html +1 -1
  124. package/docs/domGetScrollableParent.mjs.html +1 -1
  125. package/docs/domGetWindowSize.mjs.html +1 -1
  126. package/docs/domIsClientXYIn.mjs.html +1 -1
  127. package/docs/domIsFocused.mjs.html +1 -1
  128. package/docs/domIsRendered.mjs.html +1 -1
  129. package/docs/domIsStable.mjs.html +1 -1
  130. package/docs/domIsVisible.mjs.html +1 -1
  131. package/docs/domPrepend.mjs.html +1 -1
  132. package/docs/domRemove.mjs.html +1 -1
  133. package/docs/domRenderMarkdownMind.mjs.html +1 -1
  134. package/docs/domRenderMarkdownMindDyn.mjs.html +1 -1
  135. package/docs/domRipple.mjs.html +1 -1
  136. package/docs/domScrollIntoView.mjs.html +1 -1
  137. package/docs/domScrollTo.mjs.html +1 -1
  138. package/docs/domSetAttr.mjs.html +1 -1
  139. package/docs/domShowImages.mjs.html +1 -1
  140. package/docs/domShowImagesDyn.mjs.html +1 -1
  141. package/docs/domShowInputAndGetFiles.mjs.html +1 -1
  142. package/docs/domShowInputAndGetFilesU8Arrs.mjs.html +1 -1
  143. package/docs/domShowInputDatatime.mjs.html +1 -1
  144. package/docs/domTooltip.mjs.html +1 -1
  145. package/docs/domTriggerEvent.mjs.html +1 -1
  146. package/docs/domVirtualCreate.mjs.html +1 -1
  147. package/docs/domVirtualCreateQueue.mjs.html +1 -1
  148. package/docs/downloadExcelFileFromData.mjs.html +1 -1
  149. package/docs/downloadExcelFileFromDataDyn.mjs.html +1 -1
  150. package/docs/downloadFileFromB64.mjs.html +1 -1
  151. package/docs/downloadFileFromBlob.mjs.html +1 -1
  152. package/docs/downloadFileFromText.mjs.html +1 -1
  153. package/docs/downloadFileFromU8Arr.mjs.html +1 -1
  154. package/docs/dtmapping.mjs.html +1 -1
  155. package/docs/dtpick.mjs.html +1 -1
  156. package/docs/estimateTicks.mjs.html +1 -1
  157. package/docs/evEmit.mjs.html +1 -1
  158. package/docs/evEmitDelay.mjs.html +1 -1
  159. package/docs/evem.mjs.html +1 -1
  160. package/docs/examples/ex-blob2b64.html +1 -1
  161. package/docs/examples/ex-clearXSS.html +1 -1
  162. package/docs/examples/ex-clearXSSDyn.html +1 -1
  163. package/docs/examples/ex-colorConverter.html +1 -1
  164. package/docs/examples/ex-detectXSS.html +1 -1
  165. package/docs/examples/ex-detectXSSDyn.html +1 -1
  166. package/docs/examples/ex-domCompareText.html +1 -1
  167. package/docs/examples/ex-domConvertToPic.html +1 -1
  168. package/docs/examples/ex-domDrag.html +1 -1
  169. package/docs/examples/ex-domDropFiles.html +1 -1
  170. package/docs/examples/ex-domIsVisible.html +1 -1
  171. package/docs/examples/ex-domRenderMarkdownMind.html +1 -1
  172. package/docs/examples/ex-domRenderMarkdownMindDyn.html +1 -1
  173. package/docs/examples/ex-domRipple.html +1 -1
  174. package/docs/examples/ex-domScrollIntoView.html +1 -1
  175. package/docs/examples/ex-domScrollTo.html +1 -1
  176. package/docs/examples/ex-domShowImages.html +1 -1
  177. package/docs/examples/ex-domShowImagesDyn.html +1 -1
  178. package/docs/examples/ex-domShowInputAndGetFiles.html +1 -1
  179. package/docs/examples/ex-domTooltip.html +1 -1
  180. package/docs/examples/ex-getFileHash.html +1 -1
  181. package/docs/examples/ex-getUserAgent.html +1 -1
  182. package/docs/examples/ex-getUserAgentDyn.html +1 -1
  183. package/docs/examples/ex-html2str.html +1 -1
  184. package/docs/examples/ex-obj2u8arr-u8arr2obj.html +1 -1
  185. package/docs/examples/ex-openLink.html +1 -1
  186. package/docs/examples/ex-str2aes-aes2str.html +1 -1
  187. package/docs/examples/ex-str2b64-b642str.html +1 -1
  188. package/docs/examples/ex-strFindFuzz.html +1 -1
  189. package/docs/examples/ex-timeTZ2expire-timeTZ2past.html +1 -1
  190. package/docs/examples/ex-xlsx.html +1 -1
  191. package/docs/execCli.mjs.html +1 -1
  192. package/docs/execCliCore.mjs.html +1 -1
  193. package/docs/execCliJsonRpc.mjs.html +1 -1
  194. package/docs/execCliSession.mjs.html +1 -1
  195. package/docs/execJsCode.mjs.html +1 -1
  196. package/docs/execProcess.mjs.html +1 -1
  197. package/docs/execProcessKillPid.mjs.html +1 -1
  198. package/docs/filepathToTree.mjs.html +1 -1
  199. package/docs/files2data.mjs.html +1 -1
  200. package/docs/flattenToConn.mjs.html +12 -8
  201. package/docs/flattenTree.mjs.html +9 -9
  202. package/docs/floor.mjs.html +1 -1
  203. package/docs/fsBuildReadStreamText.mjs.html +1 -1
  204. package/docs/fsBuildWriteStreamText.mjs.html +1 -1
  205. package/docs/fsCleanFolder.mjs.html +1 -1
  206. package/docs/fsCleanFolderCore.mjs.html +1 -1
  207. package/docs/fsCopyFile.mjs.html +1 -1
  208. package/docs/fsCopyFileCore.mjs.html +1 -1
  209. package/docs/fsCopyFolder.mjs.html +1 -1
  210. package/docs/fsCopyFolderCore.mjs.html +1 -1
  211. package/docs/fsCreateFile.mjs.html +1 -1
  212. package/docs/fsCreateFileCore.mjs.html +1 -1
  213. package/docs/fsCreateFolder.mjs.html +1 -1
  214. package/docs/fsCreateFolderCore.mjs.html +1 -1
  215. package/docs/fsDeleteFile.mjs.html +1 -1
  216. package/docs/fsDeleteFileCore.mjs.html +1 -1
  217. package/docs/fsDeleteFileSafe.mjs.html +1 -1
  218. package/docs/fsDeleteFileSafeCore.mjs.html +1 -1
  219. package/docs/fsDeleteFolder.mjs.html +1 -1
  220. package/docs/fsDeleteFolderCore.mjs.html +1 -1
  221. package/docs/fsDeleteFolderSafe.mjs.html +1 -1
  222. package/docs/fsDeleteFolderSafeCore.mjs.html +1 -1
  223. package/docs/fsDownloadFile.mjs.html +1 -1
  224. package/docs/fsDownloadFileCore.mjs.html +1 -1
  225. package/docs/fsEvem.mjs.html +1 -1
  226. package/docs/fsExists.mjs.html +1 -1
  227. package/docs/fsExistsCore.mjs.html +1 -1
  228. package/docs/fsGetFileBasicHash.mjs.html +1 -1
  229. package/docs/fsGetFileBasicHashCore.mjs.html +1 -1
  230. package/docs/fsGetFileHash.mjs.html +1 -1
  231. package/docs/fsGetFileHashCore.mjs.html +1 -1
  232. package/docs/fsGetFileXxHash.mjs.html +1 -1
  233. package/docs/fsGetFileXxHashCore.mjs.html +1 -1
  234. package/docs/fsGetFilesInFolder.mjs.html +1 -1
  235. package/docs/fsGetFilesInFolderCore.mjs.html +1 -1
  236. package/docs/fsGetFilesWithHashInFolder.mjs.html +1 -1
  237. package/docs/fsGetFilesWithHashInFolderCore.mjs.html +1 -1
  238. package/docs/fsGetFolderBasicHash.mjs.html +1 -1
  239. package/docs/fsGetFolderBasicHashCore.mjs.html +1 -1
  240. package/docs/fsGetFoldersInFolder.mjs.html +1 -1
  241. package/docs/fsGetFoldersInFolderCore.mjs.html +1 -1
  242. package/docs/fsIsFile.mjs.html +1 -1
  243. package/docs/fsIsFileCore.mjs.html +1 -1
  244. package/docs/fsIsFolder.mjs.html +1 -1
  245. package/docs/fsIsFolderCore.mjs.html +1 -1
  246. package/docs/fsMergeFiles.mjs.html +1 -1
  247. package/docs/fsMergeFilesCore.mjs.html +1 -1
  248. package/docs/fsReadJson.mjs.html +1 -1
  249. package/docs/fsReadText.mjs.html +1 -1
  250. package/docs/fsReadTextCore.mjs.html +1 -1
  251. package/docs/fsRenameFile.mjs.html +1 -1
  252. package/docs/fsRenameFileCore.mjs.html +1 -1
  253. package/docs/fsRenameFolder.mjs.html +1 -1
  254. package/docs/fsRenameFolderCore.mjs.html +1 -1
  255. package/docs/fsSrlog.mjs.html +1 -1
  256. package/docs/fsSyncFolder.mjs.html +1 -1
  257. package/docs/fsSyncFolderCore.mjs.html +1 -1
  258. package/docs/fsTask.mjs.html +14 -13
  259. package/docs/fsTaskCp.mjs.html +1 -1
  260. package/docs/fsTreeFolder.mjs.html +1 -1
  261. package/docs/fsTreeFolderCore.mjs.html +1 -1
  262. package/docs/fsTreeFolderWithHash.mjs.html +1 -1
  263. package/docs/fsTreeFolderWithHashCore.mjs.html +1 -1
  264. package/docs/fsWatchFile.mjs.html +1 -1
  265. package/docs/fsWatchFolder.mjs.html +1 -1
  266. package/docs/fsWriteJson.mjs.html +1 -1
  267. package/docs/fsWriteText.mjs.html +1 -1
  268. package/docs/fsWriteTextCore.mjs.html +1 -1
  269. package/docs/genGradientColor.mjs.html +1 -1
  270. package/docs/genID.mjs.html +1 -1
  271. package/docs/genIDSeq.mjs.html +1 -1
  272. package/docs/genPm.mjs.html +1 -1
  273. package/docs/getBufferSize.mjs.html +1 -1
  274. package/docs/getClearPathName.mjs.html +1 -1
  275. package/docs/getCsvStrFromData.mjs.html +1 -1
  276. package/docs/getDataFromExcelFileU8Arr.mjs.html +1 -1
  277. package/docs/getDataFromExcelFileU8ArrDyn.mjs.html +1 -1
  278. package/docs/getEnv.mjs.html +1 -1
  279. package/docs/getErrorMessage.mjs.html +1 -1
  280. package/docs/getExcelU8ArrFromData.mjs.html +1 -1
  281. package/docs/getExcelU8ArrFromWorkbook.mjs.html +1 -1
  282. package/docs/getExcelWorkbookFromData.mjs.html +1 -1
  283. package/docs/getExcelWorkbookFromWorksheet.mjs.html +1 -1
  284. package/docs/getExcelWorksheetFromData.mjs.html +1 -1
  285. package/docs/getFileAccept.mjs.html +1 -1
  286. package/docs/getFileBasicHash.mjs.html +1 -1
  287. package/docs/getFileHash.mjs.html +1 -1
  288. package/docs/getFileName.mjs.html +1 -1
  289. package/docs/getFileNameExt.mjs.html +1 -1
  290. package/docs/getFileTrueName.mjs.html +1 -1
  291. package/docs/getFileType.mjs.html +1 -1
  292. package/docs/getFileXxHash.mjs.html +1 -1
  293. package/docs/getGlobal.mjs.html +1 -1
  294. package/docs/getObjSize.mjs.html +1 -1
  295. package/docs/getPathParent.mjs.html +1 -1
  296. package/docs/getTimeBetween.mjs.html +1 -1
  297. package/docs/getTimeFromUnit.mjs.html +1 -1
  298. package/docs/getTimeHp.mjs.html +1 -1
  299. package/docs/getTimeObject.mjs.html +1 -1
  300. package/docs/getTimeRange.mjs.html +1 -1
  301. package/docs/getUserAgent.mjs.html +1 -1
  302. package/docs/getUserAgentDyn.mjs.html +1 -1
  303. package/docs/getltdtkeys.mjs.html +7 -6
  304. package/docs/global.html +1 -1
  305. package/docs/haskey.mjs.html +1 -1
  306. package/docs/html2str.mjs.html +1 -1
  307. package/docs/htmlDecode.mjs.html +1 -1
  308. package/docs/htmlEncode.mjs.html +1 -1
  309. package/docs/importResources.mjs.html +1 -1
  310. package/docs/index.html +1 -1
  311. package/docs/interp1.mjs.html +1 -1
  312. package/docs/isDate.mjs.html +1 -1
  313. package/docs/isDev.mjs.html +1 -1
  314. package/docs/isEle.mjs.html +1 -1
  315. package/docs/isEleExistByID.mjs.html +1 -1
  316. package/docs/isEmail.mjs.html +1 -1
  317. package/docs/isErr.mjs.html +1 -1
  318. package/docs/isIE.mjs.html +1 -1
  319. package/docs/isNarrow.mjs.html +1 -1
  320. package/docs/isStrHasCapital.mjs.html +1 -1
  321. package/docs/isStrHasLetter.mjs.html +1 -1
  322. package/docs/isStrHasLowerCase.mjs.html +1 -1
  323. package/docs/isStrHasNumber.mjs.html +1 -1
  324. package/docs/isStrHasSpace.mjs.html +1 -1
  325. package/docs/isStrHasSymbol.mjs.html +1 -1
  326. package/docs/isUserIdentify.mjs.html +1 -1
  327. package/docs/isUserName.mjs.html +1 -1
  328. package/docs/isUserPw.mjs.html +1 -1
  329. package/docs/isWindow.mjs.html +1 -1
  330. package/docs/isab.mjs.html +1 -1
  331. package/docs/isarr.mjs.html +1 -1
  332. package/docs/isarr0.mjs.html +1 -1
  333. package/docs/isarr1.mjs.html +1 -1
  334. package/docs/isbigint.mjs.html +1 -1
  335. package/docs/isblob.mjs.html +1 -1
  336. package/docs/isbol.mjs.html +1 -1
  337. package/docs/isday.mjs.html +1 -1
  338. package/docs/isearr.mjs.html +1 -1
  339. package/docs/iseobj.mjs.html +1 -1
  340. package/docs/iser.mjs.html +1 -1
  341. package/docs/isernot.mjs.html +1 -1
  342. package/docs/isestr.mjs.html +1 -1
  343. package/docs/isfile.mjs.html +1 -1
  344. package/docs/isfun.mjs.html +1 -1
  345. package/docs/isint.mjs.html +1 -1
  346. package/docs/ismonth.mjs.html +1 -1
  347. package/docs/isn0int.mjs.html +1 -1
  348. package/docs/isn0num.mjs.html +1 -1
  349. package/docs/isnan.mjs.html +1 -1
  350. package/docs/isnbr.mjs.html +1 -1
  351. package/docs/isnint.mjs.html +1 -1
  352. package/docs/isnnum.mjs.html +1 -1
  353. package/docs/isnull.mjs.html +1 -1
  354. package/docs/isnum.mjs.html +1 -1
  355. package/docs/isobj.mjs.html +1 -1
  356. package/docs/isobj0.mjs.html +1 -1
  357. package/docs/isp0int.mjs.html +1 -1
  358. package/docs/isp0num.mjs.html +1 -1
  359. package/docs/ispint.mjs.html +1 -1
  360. package/docs/ispm.mjs.html +1 -1
  361. package/docs/ispnum.mjs.html +1 -1
  362. package/docs/isstr.mjs.html +1 -1
  363. package/docs/isstr0.mjs.html +1 -1
  364. package/docs/istime.mjs.html +1 -1
  365. package/docs/istimeTZ.mjs.html +1 -1
  366. package/docs/istimems.mjs.html +1 -1
  367. package/docs/istimemsTZ.mjs.html +1 -1
  368. package/docs/isu16arr.mjs.html +1 -1
  369. package/docs/isu8arr.mjs.html +1 -1
  370. package/docs/isundefined.mjs.html +1 -1
  371. package/docs/j2o.mjs.html +1 -1
  372. package/docs/judge.mjs.html +1 -1
  373. package/docs/keysmat2ltdt.mjs.html +1 -1
  374. package/docs/ltdt2vrtsable.mjs.html +1 -1
  375. package/docs/ltdtDiff.mjs.html +1 -1
  376. package/docs/ltdtDiffByKey.mjs.html +1 -1
  377. package/docs/ltdtkeys2mat.mjs.html +1 -1
  378. package/docs/ltdtkeysheads2mat.mjs.html +1 -1
  379. package/docs/ltdtmapping.mjs.html +1 -1
  380. package/docs/ltdtmerge.mjs.html +1 -1
  381. package/docs/ltdtpick.mjs.html +1 -1
  382. package/docs/ltdtpull.mjs.html +1 -1
  383. package/docs/mat2ltdt.mjs.html +1 -1
  384. package/docs/matConcat.mjs.html +1 -1
  385. package/docs/matDiff.mjs.html +1 -1
  386. package/docs/matat.mjs.html +1 -1
  387. package/docs/now2str.mjs.html +1 -1
  388. package/docs/now2strp.mjs.html +1 -1
  389. package/docs/nowDay2str.mjs.html +1 -1
  390. package/docs/nowms2str.mjs.html +1 -1
  391. package/docs/nowms2strp.mjs.html +1 -1
  392. package/docs/o2j.mjs.html +1 -1
  393. package/docs/obj2b64.mjs.html +1 -1
  394. package/docs/obj2pb64.mjs.html +1 -1
  395. package/docs/obj2str.mjs.html +1 -1
  396. package/docs/obj2stru8arr.mjs.html +1 -1
  397. package/docs/obj2u8arr.mjs.html +1 -1
  398. package/docs/objSortBy.mjs.html +1 -1
  399. package/docs/objSortByKeys.mjs.html +1 -1
  400. package/docs/oo.mjs.html +1 -1
  401. package/docs/openLink.mjs.html +1 -1
  402. package/docs/pb642obj.mjs.html +1 -1
  403. package/docs/pmChain.mjs.html +1 -1
  404. package/docs/pmConvertResolve.mjs.html +1 -1
  405. package/docs/pmDebounce.mjs.html +1 -1
  406. package/docs/pmHook.mjs.html +1 -1
  407. package/docs/pmHookReject.mjs.html +1 -1
  408. package/docs/pmIni.mjs.html +1 -1
  409. package/docs/pmInvResolve.mjs.html +1 -1
  410. package/docs/pmKeyMutex.mjs.html +1 -1
  411. package/docs/pmMap.mjs.html +1 -1
  412. package/docs/pmQueue.mjs.html +1 -1
  413. package/docs/pmSeries.mjs.html +1 -1
  414. package/docs/pmThrottle.mjs.html +1 -1
  415. package/docs/pmTimeout.mjs.html +1 -1
  416. package/docs/preciseNum.mjs.html +1 -1
  417. package/docs/pseudoRandom.mjs.html +1 -1
  418. package/docs/pseudoRandomIntRange.mjs.html +1 -1
  419. package/docs/pseudoRandomIntsNdpRange.mjs.html +1 -1
  420. package/docs/pseudoRandomIntsRange.mjs.html +1 -1
  421. package/docs/pseudoRandomRange.mjs.html +1 -1
  422. package/docs/pseudoRandomsRange.mjs.html +1 -1
  423. package/docs/queue.mjs.html +1 -1
  424. package/docs/random.mjs.html +1 -1
  425. package/docs/randomIntRange.mjs.html +1 -1
  426. package/docs/randomIntsNdpRange.mjs.html +1 -1
  427. package/docs/randomIntsRange.mjs.html +1 -1
  428. package/docs/randomRange.mjs.html +1 -1
  429. package/docs/randomsRange.mjs.html +1 -1
  430. package/docs/rang.mjs.html +1 -1
  431. package/docs/rep.mjs.html +1 -1
  432. package/docs/repObj.mjs.html +1 -1
  433. package/docs/replace.mjs.html +1 -1
  434. package/docs/replaceObj.mjs.html +1 -1
  435. package/docs/replacePlus.mjs.html +1 -1
  436. package/docs/round.mjs.html +1 -1
  437. package/docs/secd.mjs.html +1 -1
  438. package/docs/sep.mjs.html +1 -1
  439. package/docs/sepInt.mjs.html +1 -1
  440. package/docs/setIntervalHp.mjs.html +1 -1
  441. package/docs/setTimeoutHp.mjs.html +1 -1
  442. package/docs/sind.mjs.html +1 -1
  443. package/docs/split.mjs.html +1 -1
  444. package/docs/str2aes.mjs.html +1 -1
  445. package/docs/str2b64.mjs.html +1 -1
  446. package/docs/str2hint.mjs.html +1 -1
  447. package/docs/str2md5.mjs.html +1 -1
  448. package/docs/str2obj.mjs.html +1 -1
  449. package/docs/str2sha.mjs.html +1 -1
  450. package/docs/str2sha512.mjs.html +1 -1
  451. package/docs/str2u8arr.mjs.html +1 -1
  452. package/docs/strCompare.mjs.html +1 -1
  453. package/docs/strCompareForVersion.mjs.html +1 -1
  454. package/docs/strDiff.mjs.html +1 -1
  455. package/docs/strDiffToHtml.mjs.html +1 -1
  456. package/docs/strFindFuzz.mjs.html +1 -1
  457. package/docs/strFindSimilar.mjs.html +1 -1
  458. package/docs/strTruncate.mjs.html +1 -1
  459. package/docs/strdelleft.mjs.html +1 -1
  460. package/docs/strdelright.mjs.html +1 -1
  461. package/docs/strleft.mjs.html +1 -1
  462. package/docs/strmid.mjs.html +1 -1
  463. package/docs/strright.mjs.html +1 -1
  464. package/docs/stru8arr2obj.mjs.html +1 -1
  465. package/docs/tand.mjs.html +1 -1
  466. package/docs/time2day.mjs.html +1 -1
  467. package/docs/time2hour.mjs.html +1 -1
  468. package/docs/time2min.mjs.html +1 -1
  469. package/docs/timeTZ2day.mjs.html +1 -1
  470. package/docs/timeTZ2expire.mjs.html +1 -1
  471. package/docs/timeTZ2hour.mjs.html +1 -1
  472. package/docs/timeTZ2min.mjs.html +1 -1
  473. package/docs/timeTZ2past.mjs.html +1 -1
  474. package/docs/timems2day.mjs.html +1 -1
  475. package/docs/timems2hour.mjs.html +1 -1
  476. package/docs/timems2min.mjs.html +1 -1
  477. package/docs/timems2time.mjs.html +1 -1
  478. package/docs/timemsTZ2day.mjs.html +1 -1
  479. package/docs/timemsTZ2expire.mjs.html +1 -1
  480. package/docs/timemsTZ2hour.mjs.html +1 -1
  481. package/docs/timemsTZ2min.mjs.html +1 -1
  482. package/docs/timemsTZ2past.mjs.html +1 -1
  483. package/docs/timemsTZ2time.mjs.html +1 -1
  484. package/docs/treeObj.mjs.html +7 -7
  485. package/docs/treeToFilepath.mjs.html +1 -1
  486. package/docs/trim.mjs.html +1 -1
  487. package/docs/u16arr2b64.mjs.html +1 -1
  488. package/docs/u16arr2u8arr.mjs.html +1 -1
  489. package/docs/u8arr2ab.mjs.html +1 -1
  490. package/docs/u8arr2b64.mjs.html +1 -1
  491. package/docs/u8arr2blob.mjs.html +1 -1
  492. package/docs/u8arr2bs.mjs.html +1 -1
  493. package/docs/u8arr2obj.mjs.html +17 -3
  494. package/docs/u8arr2str.mjs.html +1 -1
  495. package/docs/u8arr2u16arr.mjs.html +1 -1
  496. package/docs/urlParse.mjs.html +1 -1
  497. package/docs/verifyValue.mjs.html +1 -1
  498. package/docs/waitFun.mjs.html +1 -1
  499. package/docs/wsemi.html +36 -13
  500. package/package.json +1 -1
  501. package/src/clearXSS.mjs +262 -24
  502. package/src/flattenToConn.mjs +11 -7
  503. package/src/flattenTree.mjs +8 -8
  504. package/src/fsTask.mjs +13 -12
  505. package/src/getltdtkeys.mjs +6 -5
  506. package/src/treeObj.mjs +6 -6
  507. package/src/u8arr2obj.mjs +16 -2
  508. package/test/clearXSS.test.mjs +1276 -1
  509. package/test/flattenToConn.test.mjs +83 -0
  510. package/test/flattenTree.test.mjs +49 -0
  511. package/test/fsTask.test.mjs +144 -0
  512. package/test/getltdtkeys.test.mjs +71 -0
  513. package/test/tools/clearXssWalkRunner.mjs +202 -0
  514. package/test/treeObj.test.mjs +119 -0
  515. package/test/u8arr2obj.test.mjs +107 -2
  516. package/toolfp/dist/wsemip.umd.js +1 -1
  517. package/toolparfor/dist/wpf.umd.js +1 -1
  518. package/toolparfor/dist/wpf_pmSeries.umd.js +1 -1
package/docs/wsemi.html CHANGED
@@ -15497,14 +15497,37 @@ await test3()
15497
15497
  <p>Depend on: <a href="https://jsxss.com/zh/index.html">https://jsxss.com/zh/index.html</a></p>
15498
15498
  <p>白名單外之標籤轉義,白名單內之標籤刪除白名單外之屬性與危險網址(style屬性保留),標籤外之文字只轉義會開始標籤之&lt;(其後為英文字母、斜線、驚嘆號、問號或位於結尾),&gt;與其餘之&lt;維持原樣,故'a &lt; b'等數學式不改寫</p>
15499
15499
  <p>輸出僅供以HTML內文呈現(如v-html、innerHTML),不可放入屬性值或註解內</p>
15500
- <p>物件與陣列遞迴處理,物件只依自有可列舉鍵走訪,length視為一般鍵(不使走訪改為類陣列,不新增鍵),成本與length值無關</p>
15500
+ <p>走訪採顯式堆疊並以來源物件之參照記憶化,不遞迴:深巢狀與循環參照不拋錯(循環保持),共用子結構只處理一次且輸出中保持共用,成本與節點數成正比,不設深度上限(僅受堆積限制)。處置如下:</p>
15501
+ <ol>
15502
+ <li>
15503
+ <p>字串清除(含包裝String,清除後為原始字串);空字串與number、boolean、null、undefined等非字串原值回傳</p>
15504
+ </li>
15505
+ <li>
15506
+ <p>物件(含類別實例)與真陣列(含子類別)走訪並保留原型(null原型物件變一般物件),length視為一般鍵(不使走訪改為類陣列,不新增鍵),成本與length值無關;物件依自有可列舉之字串鍵與Symbol鍵,陣列依索引(空洞補undefined,非索引屬性不複製,正規表示式比對結果之index與input除外,其input亦清除);Map走訪值、Set走訪元素(Map之鍵不處理,清除後相同之Set元素合併),Map與Set之自有可列舉屬性一併走訪;不可列舉屬性不複製,原型上之資料不處理</p>
15507
+ </li>
15508
+ <li>
15509
+ <p>物件之字串鍵與Map之鍵不清除,由使用端自行檢核</p>
15510
+ </li>
15511
+ <li>
15512
+ <p>arguments物件與以Symbol.toStringTag偽稱Array或Arguments之物件,視為物件並依自有可列舉鍵走訪,轉為一般物件</p>
15513
+ </li>
15514
+ <li>
15515
+ <p>Date、RegExp、型別陣列、Buffer、ArrayBuffer、包裝Number等回傳複本,其自有字串屬性不清除(物件值屬性依上述走訪);函數、Error、WeakMap、Promise、URL等不可複製者,巢狀時回傳同一參照而不清除其內字串,位於最外層時函數複製為一般物件(清除其可列舉屬性)、Error等回傳{};其餘經lodash cloneDeep複製後仍帶自訂Symbol.toStringTag之物件亦不清除其內字串</p>
15516
+ </li>
15517
+ <li>
15518
+ <p>經lodash cloneDeep複製之物件(上述第4、5點以外之非一般物件,如類別實例、null原型物件、陣列子類別、自訂標籤者)沿用其複製行為(含原型上之setter),再依複本之終態逐鍵清除;除此之外輸入不被修改</p>
15519
+ </li>
15520
+ <li>
15521
+ <p>清除對字串不保證冪等(如&lt;b='&lt;&lt;&gt;清一次與清兩次結果不同),已清除之值再送入可能再被改寫</p>
15522
+ </li>
15523
+ </ol>
15501
15524
  <p>Unit Test: <a href="https://github.com/yuda-lyu/wsemi/blob/master/test/clearXSS.test.mjs">Github</a></p></li></ul></dd>
15502
15525
 
15503
15526
 
15504
15527
 
15505
15528
  <dt class="tag-source">Source:</dt>
15506
15529
  <dd class="tag-source"><ul class="dummy"><li>
15507
- <a href="clearXSS.mjs.html">clearXSS.mjs</a>, <a href="clearXSS.mjs.html#line35">line 35</a>
15530
+ <a href="clearXSS.mjs.html">clearXSS.mjs</a>, <a href="clearXSS.mjs.html#line138">line 138</a>
15508
15531
  </li></ul></dd>
15509
15532
 
15510
15533
 
@@ -15551,7 +15574,7 @@ await test3()
15551
15574
 
15552
15575
  <h5 class="h5-examples">Example</h5>
15553
15576
 
15554
- <pre class="prettyprint"><code>console.log(clearXSS(`>&lt;script>alert('XSS')&lt;/script>`))
15577
+ <pre class="prettyprint"><code>console.log(clearXSS(`>&lt;script>alert('XSS')&lt;/script>`))
15555
15578
 
15556
15579
 
15557
15580
 
@@ -15604,7 +15627,7 @@ await test3()
15604
15627
 
15605
15628
 
15606
15629
 
15607
- <td class="description last"><p>輸入資料</p></td>
15630
+ <td class="description last"><p>輸入資料,可為字串,或含字串之物件、陣列、Map、Set</p></td>
15608
15631
  </tr>
15609
15632
 
15610
15633
 
@@ -15630,7 +15653,7 @@ await test3()
15630
15653
 
15631
15654
 
15632
15655
  <div class="param-desc">
15633
- <p>輸出資料</p>
15656
+ <p>輸出資料,字串輸入回傳清除後字串,其餘回傳清除後之新結構(原始值原樣回傳)</p>
15634
15657
  </div>
15635
15658
 
15636
15659
 
@@ -40582,7 +40605,7 @@ if (true) {
40582
40605
  <dl class="details">
40583
40606
 
40584
40607
  <dt class="tag-description">Description:</dt>
40585
- <dd class="tag-description"><ul class="dummy"><li><p>展平物件或陣列成為關聯陣列</p>
40608
+ <dd class="tag-description"><ul class="dummy"><li><p>展平物件或陣列成為關聯陣列,真陣列(含帶其他Symbol.toStringTag者)依索引,物件依自有鍵(length視為一般鍵),以Symbol.toStringTag偽稱Array之物件視為物件</p>
40586
40609
  <p>Unit Test: <a href="https://github.com/yuda-lyu/wsemi/blob/master/test/flattenToConn.test.mjs">Github</a></p></li></ul></dd>
40587
40610
 
40588
40611
 
@@ -41045,7 +41068,7 @@ if (true) {
41045
41068
  <dl class="details">
41046
41069
 
41047
41070
  <dt class="tag-description">Description:</dt>
41048
- <dd class="tag-description"><ul class="dummy"><li><p>展平樹狀物件或陣列</p>
41071
+ <dd class="tag-description"><ul class="dummy"><li><p>展平樹狀物件或陣列,以Symbol.toStringTag偽稱Array之物件視為物件</p>
41049
41072
  <p>Unit Test: <a href="https://github.com/yuda-lyu/wsemi/blob/master/test/flattenTree.test.mjs">Github</a></p></li></ul></dd>
41050
41073
 
41051
41074
 
@@ -66009,7 +66032,7 @@ console.log(wb2.sheets[0].name)
66009
66032
  <dl class="details">
66010
66033
 
66011
66034
  <dt class="tag-description">Description:</dt>
66012
- <dd class="tag-description"><ul class="dummy"><li><p>由ltdt提取不重複keys</p>
66035
+ <dd class="tag-description"><ul class="dummy"><li><p>由ltdt提取不重複keys,各列物件只依自有可列舉鍵(length視為一般鍵)</p>
66013
66036
  <p>Unit Test: <a href="https://github.com/yuda-lyu/wsemi/blob/master/test/getltdtkeys.test.mjs">Github</a></p></li></ul></dd>
66014
66037
 
66015
66038
 
@@ -107202,7 +107225,7 @@ console.log(strTruncate('abcdefghij', -1))
107202
107225
  <dl class="details">
107203
107226
 
107204
107227
  <dt class="tag-description">Description:</dt>
107205
- <dd class="tag-description"><ul class="dummy"><li><p>遍歷物件並回傳複製物件,類似JSON.stringify,但不會序列化成為字串</p>
107228
+ <dd class="tag-description"><ul class="dummy"><li><p>遍歷物件並回傳複製物件,類似JSON.stringify,但不會序列化成為字串。真陣列(含帶其他Symbol.toStringTag者)依索引遍歷,物件依自有鍵遍歷(length視為一般鍵),以Symbol.toStringTag偽稱Array之物件視為物件</p>
107206
107229
  <p>Unit Test: <a href="https://github.com/yuda-lyu/wsemi/blob/master/test/treeObj.test.mjs">Github</a></p></li></ul></dd>
107207
107230
 
107208
107231
 
@@ -109916,7 +109939,7 @@ console.log(u8arr2bs('abc', { returnWithStateAndMsg: true }))
109916
109939
 
109917
109940
  <dt class="tag-source">Source:</dt>
109918
109941
  <dd class="tag-source"><ul class="dummy"><li>
109919
- <a href="u8arr2obj.mjs.html">u8arr2obj.mjs</a>, <a href="u8arr2obj.mjs.html#line89">line 89</a>
109942
+ <a href="u8arr2obj.mjs.html">u8arr2obj.mjs</a>, <a href="u8arr2obj.mjs.html#line99">line 99</a>
109920
109943
  </li></ul></dd>
109921
109944
 
109922
109945
 
@@ -109963,7 +109986,7 @@ console.log(u8arr2bs('abc', { returnWithStateAndMsg: true }))
109963
109986
 
109964
109987
  <h5 class="h5-examples">Example</h5>
109965
109988
 
109966
- <pre class="prettyprint"><code>let u8a = new Uint8Array([
109967
109989
  64, 24, 0, 0, 0, 0, 0, 0, 91, 54, 54, 44,
109968
109990
  51, 93, 123, 34, 97, 34, 58, 91, 49, 50, 51, 44,
109969
109991
  52, 53, 46, 54, 55, 44, 34, 116, 101, 115, 116, 228,
109970
109992
  184, 173, 230, 150, 135, 34, 93, 44, 34, 98, 34, 58,
109971
109993
  123, 34, 99, 34, 58, 34, 91, 66, 108, 97, 122, 101,
109972
109994
  70, 111, 114, 85, 105, 110, 116, 56, 65, 114, 114, 97,
109973
109995
  121, 93, 58, 58, 48, 34, 125, 125, 66, 97, 115
109996
+ <pre class="prettyprint"><code>let u8a = new Uint8Array([
109974
109997
  64, 24, 0, 0, 0, 0, 0, 0, 91, 54, 54, 44,
109975
109998
  51, 93, 123, 34, 97, 34, 58, 91, 49, 50, 51, 44,
109976
109999
  52, 53, 46, 54, 55, 44, 34, 116, 101, 115, 116, 228,
109977
110000
  184, 173, 230, 150, 135, 34, 93, 44, 34, 98, 34, 58,
109978
110001
  123, 34, 99, 34, 58, 34, 91, 66, 108, 97, 122, 101,
109979
110002
  70, 111, 114, 85, 105, 110, 116, 56, 65, 114, 114, 97,
109980
110003
  121, 93, 58, 58, 48, 34, 125, 125, 66, 97, 115
109981
110004
 
109982
110005
 
109983
110006
 
@@ -110162,7 +110185,7 @@ console.log(u8arr2bs('abc', { returnWithStateAndMsg: true }))
110162
110185
 
110163
110186
 
110164
110187
  <div class="param-desc">
110165
- <p>回傳物件或陣列資料,其內二進位數據依標記所記之原型別還原,Uint8Array、Uint16Array、ArrayBuffer皆原型別原數值返回;輸入非Uint8Array或封包損毀時回傳空物件,封包標頭內分塊資訊非真陣列、含非負有限整數以外之項、、總量逾封包長度、或分塊數量逾主區塊可容納之二進位標記數(每個分塊在主區塊內至少有一個25位元組之標記)亦視為損毀(msg為'invalid pks, &lt;原因&gt;');同一二進位索引被引用多次亦視為損毀;若opt.returnWithStateAndMsg為true則回傳{ state, msg }物件</p>
110188
+ <p>回傳物件或陣列資料,其內二進位數據依標記所記之原型別還原,Uint8Array、Uint16Array、ArrayBuffer皆原型別原數值返回;輸入非Uint8Array或封包損毀時回傳空物件,封包標頭記載之分塊資訊區長度非非負整數或逾封包資料區長度(含封包短於8位元組)、分塊資訊非真陣列、含非負有限整數以外之項、總量逾封包長度、或分塊數量逾主區塊可容納之二進位標記數(每個分塊在主區塊內至少有一個25位元組之標記)亦視為損毀(msg為'invalid pks, &lt;原因&gt;');同一二進位索引被引用多次亦視為損毀;若opt.returnWithStateAndMsg為true則回傳{ state, msg }物件</p>
110166
110189
  </div>
110167
110190
 
110168
110191
 
@@ -111455,7 +111478,7 @@ console.log(u8arr2u16arr('abc', { returnWithStateAndMsg: true }))
111455
111478
  <br class="clear">
111456
111479
 
111457
111480
  <footer>
111458
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Mon Oct 19 2026 23:54:10 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
111481
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Tue Oct 20 2026 10:52:09 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
111459
111482
  </footer>
111460
111483
 
111461
111484
  <script>prettyPrint();</script>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wsemi",
3
- "version": "1.9.21",
3
+ "version": "1.9.22",
4
4
  "main": "dist/wsemi.umd.js",
5
5
  "dependencies": {
6
6
  "@zumer/snapdom": "^3.3.0",
package/src/clearXSS.mjs CHANGED
@@ -1,10 +1,96 @@
1
- import cloneDeep from 'lodash-es/cloneDeep.js'
2
- import isarr from './isarr.mjs'
3
- import isobj from './isobj.mjs'
1
+ import cloneDeepWith from 'lodash-es/cloneDeepWith.js'
4
2
  import isestr from './isestr.mjs'
5
3
  import fxss from './_filterXSS.mjs'
6
4
 
7
5
 
6
+ //內部標籤(Object.prototype.toString)與判準同isobj、isarr, 此處每個物件只取一次(標籤可為存取器), 另需判別arguments與Map、Set
7
+ let toStr = Object.prototype.toString
8
+ let hasOwn = Object.prototype.hasOwnProperty
9
+ let isEnum = Object.prototype.propertyIsEnumerable
10
+
11
+
12
+ //Skip, lodash淺複製時置換物件值之佔位, 內存原值, 由主迴圈改為走訪結果
13
+ class Skip {
14
+ constructor(v) {
15
+ this.v = v
16
+ }
17
+ }
18
+
19
+
20
+ //ownKeysEnum, 自有可列舉之字串鍵與Symbol鍵(同lodash cloneDeep複製之鍵), length視為一般鍵
21
+ function ownKeysEnum(o) {
22
+ let ks = Object.keys(o)
23
+ let ss = Object.getOwnPropertySymbols(o)
24
+ if (ss.length > 0) {
25
+ for (let s of ss) {
26
+ if (isEnum.call(o, s)) {
27
+ ks.push(s)
28
+ }
29
+ }
30
+ }
31
+ return ks
32
+ }
33
+
34
+
35
+ //newObj, 同lodash initCloneObject: constructor為函數且本身非原型物件者沿用原型, 否則為一般物件(null原型物件、constructor鍵非函數者變一般物件)
36
+ function newObj(v) {
37
+ let c = v.constructor
38
+ if (typeof c !== 'function') {
39
+ return {}
40
+ }
41
+ let p = Object.getPrototypeOf(v)
42
+ if (p === Object.prototype) {
43
+ return {} //與Object.create(Object.prototype)等價, v本身為其建構子之prototype時lodash亦得{}
44
+ }
45
+ if (v === (c.prototype || Object.prototype)) {
46
+ return {}
47
+ }
48
+ return (p !== null && (typeof p === 'object' || typeof p === 'function')) ? Object.create(p) : {}
49
+ }
50
+
51
+
52
+ //setKey, __proto__鍵以defineProperty設為自有資料屬性(一般賦值會改原型)
53
+ function setKey(o, k, val) {
54
+ if (k === '__proto__') {
55
+ Object.defineProperty(o, k, { configurable: true, enumerable: true, value: val, writable: true })
56
+ }
57
+ else {
58
+ o[k] = val
59
+ }
60
+ }
61
+
62
+
63
+ //isBoxedString, 以內部槽確認為包裝String(以Symbol.toStringTag偽稱String者無內部槽, 交由lodash複製後依終態處理)
64
+ function isBoxedString(v) {
65
+ try {
66
+ String.prototype.valueOf.call(v)
67
+ return true
68
+ }
69
+ catch (err) {
70
+ return false
71
+ }
72
+ }
73
+
74
+
75
+ //brandOf, 以內部槽確認Map或Set(含跨realm者, 如iframe、vm; instanceof不成立), 僅偽造標籤或原型者不算; 先試tag或instanceof所指者
76
+ function brandOf(v, tag) {
77
+ let setFirst = tag === '[object Set]' || v instanceof Set
78
+ for (let b of setFirst ? ['set', 'map'] : ['map', 'set']) {
79
+ try {
80
+ if (b === 'map') {
81
+ Map.prototype.has.call(v)
82
+ }
83
+ else {
84
+ Set.prototype.has.call(v)
85
+ }
86
+ return b
87
+ }
88
+ catch (err) {}
89
+ }
90
+ return ''
91
+ }
92
+
93
+
8
94
  /**
9
95
  * 清除xss攻擊語法
10
96
  *
@@ -14,12 +100,26 @@ import fxss from './_filterXSS.mjs'
14
100
  *
15
101
  * 輸出僅供以HTML內文呈現(如v-html、innerHTML),不可放入屬性值或註解內
16
102
  *
17
- * 物件與陣列遞迴處理,物件只依自有可列舉鍵走訪,length視為一般鍵(不使走訪改為類陣列,不新增鍵),成本與length值無關
103
+ * 走訪採顯式堆疊並以來源物件之參照記憶化,不遞迴:深巢狀與循環參照不拋錯(循環保持),共用子結構只處理一次且輸出中保持共用,成本與節點數成正比,不設深度上限(僅受堆積限制)。處置如下:
104
+ *
105
+ * 1. 字串清除(含包裝String,清除後為原始字串);空字串與number、boolean、null、undefined等非字串原值回傳
106
+ *
107
+ * 2. 物件(含類別實例)與真陣列(含子類別)走訪並保留原型(null原型物件變一般物件),length視為一般鍵(不使走訪改為類陣列,不新增鍵),成本與length值無關;物件依自有可列舉之字串鍵與Symbol鍵,陣列依索引(空洞補undefined,非索引屬性不複製,正規表示式比對結果之index與input除外,其input亦清除);Map走訪值、Set走訪元素(Map之鍵不處理,清除後相同之Set元素合併),Map與Set之自有可列舉屬性一併走訪;不可列舉屬性不複製,原型上之資料不處理
108
+ *
109
+ * 3. 物件之字串鍵與Map之鍵不清除,由使用端自行檢核
110
+ *
111
+ * 4. arguments物件與以Symbol.toStringTag偽稱Array或Arguments之物件,視為物件並依自有可列舉鍵走訪,轉為一般物件
112
+ *
113
+ * 5. Date、RegExp、型別陣列、Buffer、ArrayBuffer、包裝Number等回傳複本,其自有字串屬性不清除(物件值屬性依上述走訪);函數、Error、WeakMap、Promise、URL等不可複製者,巢狀時回傳同一參照而不清除其內字串,位於最外層時函數複製為一般物件(清除其可列舉屬性)、Error等回傳{};其餘經lodash cloneDeep複製後仍帶自訂Symbol.toStringTag之物件亦不清除其內字串
114
+ *
115
+ * 6. 經lodash cloneDeep複製之物件(上述第4、5點以外之非一般物件,如類別實例、null原型物件、陣列子類別、自訂標籤者)沿用其複製行為(含原型上之setter),再依複本之終態逐鍵清除;除此之外輸入不被修改
116
+ *
117
+ * 7. 清除對字串不保證冪等(如<b='<<>清一次與清兩次結果不同),已清除之值再送入可能再被改寫
18
118
  *
19
119
  * Unit Test: {@link https://github.com/yuda-lyu/wsemi/blob/master/test/clearXSS.test.mjs Github}
20
120
  * @memberOf wsemi
21
- * @param {String|Object|Array} inp 輸入資料
22
- * @returns {Object|Array|String} 輸出資料
121
+ * @param {String|Object|Array} inp 輸入資料,可為字串,或含字串之物件、陣列、Map、Set
122
+ * @returns {Object|Array|String} 輸出資料,字串輸入回傳清除後字串,其餘回傳清除後之新結構(原始值原樣回傳)
23
123
  * @example
24
124
  *
25
125
  * console.log(clearXSS(`><script>alert('XSS')</script>`))
@@ -31,6 +131,9 @@ import fxss from './_filterXSS.mjs'
31
131
  * console.log(clearXSS(`孔深 < 500 m 且 > 10 m`))
32
132
  * // => `孔深 < 500 m 且 > 10 m`
33
133
  *
134
+ * console.log(clearXSS({ a: `<script>alert('XSS')</script>`, b: [1, `<b>x</b>`, { c: `<img src=x onerror=alert(1)>` }], d: new Map([['k', `<script>1</script>`]]) }))
135
+ * // => { a: "&lt;script>alert('XSS')&lt;/script>", b: [ 1, '<b>x</b>', { c: '<img src>' } ], d: Map(1) { 'k' => '&lt;script>1&lt;/script>' } }
136
+ *
34
137
  */
35
138
  function clearXSS(inp) {
36
139
 
@@ -47,33 +150,168 @@ function clearXSS(inp) {
47
150
  return filterXSS(c, opt)
48
151
  }
49
152
 
50
- //scxss, 物件只依自有可列舉鍵迭代(不用lodash each: 具非負整數length鍵之物件會被當類陣列, 真實鍵被略過且依length逐一建立索引鍵), 真陣列依索引迭代
51
- //僅以Symbol.toStringTag偽稱Array之物件(isarr為真而Array.isArray為假)視為物件, 不依其length迭代
52
- function scxss(o) {
53
- if (Array.isArray(o)) {
54
- for (let i = 0; i < o.length; i++) {
55
- o[i] = scxss(o[i])
153
+ //根為原始值(含字串)時不配置記憶化表與工作框
154
+ if (typeof inp === 'string') {
155
+ return isestr(inp) ? ftxss(inp) : inp
156
+ }
157
+ if (inp === null || (typeof inp !== 'object' && typeof inp !== 'function')) {
158
+ return inp
159
+ }
160
+
161
+ //memo, 來源物件 -> 輸出物件(包裝String為清除後之字串), 使共用子結構只處理一次且輸出保持共用, 循環參照得以終止
162
+ let memo = new Map()
163
+
164
+ //stack, 工作框: t為型式, s為來源, d為輸出, ks為鍵陣列, es為條目/元素/物件值屬性, i為已處理數, n為總數
165
+ // t=0 陣列(索引, 輸出為新陣列) t=1 一般物件(鍵, 輸出為新物件) t=2 偽稱Array/Arguments之物件(鍵, 以defineProperty定義)
166
+ // t=3 lodash複本之終態(輸出即複本, 逐項清除; ks為null時依索引) t=4 Map條目 t=5 Set元素 t=6 複本之物件值屬性(es為[鍵, 值])
167
+ let stack = []
168
+
169
+ //skipClone, lodash淺複製: v之物件值(含函數)置換為Skip, 其餘(原始值、型別陣列元素等)照常複製; 回傳複本與被置換之[鍵, 值]
170
+ // 不可複製者(函數、Error、WeakMap、Promise等)回傳同一參照
171
+ function skipClone(v) {
172
+ let rec = []
173
+ let r = cloneDeepWith({ v }, (val, key, obj) => {
174
+ if (obj === v && val !== null && (typeof val === 'object' || typeof val === 'function')) {
175
+ rec.push([key, val])
176
+ return new Skip(val)
56
177
  }
57
- return o
178
+ }).v
179
+ return { r, rec }
180
+ }
181
+
182
+ //slow, 其餘物件(類別實例、null原型、陣列子類別、跨realm物件、Date、RegExp、型別陣列、自訂標籤者等)沿用lodash cloneDeep之行為
183
+ // 複製後成為一般物件或陣列者, 依複本之終態逐鍵清除(同修前先複製後走訪, 含原型setter產生之鍵與陣列建構子新增之索引); 其餘為複本, 其物件值屬性改由主迴圈走訪
184
+ function slow(v, isRoot) {
185
+ let { r, rec } = skipClone(v)
186
+ if (r === v) {
187
+ return isRoot ? {} : v //不可複製者: 巢狀回同一參照, 最外層回{}
58
188
  }
59
- else if (isobj(o) || isarr(o)) {
60
- for (let k of Object.keys(o)) {
61
- o[k] = scxss(o[k])
189
+ memo.set(v, r)
190
+ if (Array.isArray(r)) {
191
+ if (hasOwn.call(r, 'index') && typeof r.input === 'string') {
192
+ r.input = ftxss(r.input) //正規表示式比對結果, lodash複製index與input
62
193
  }
63
- return o
194
+ stack.push({ t: 3, s: null, d: r, ks: null, es: null, i: 0, n: r.length })
64
195
  }
65
- else if (isestr(o)) {
66
- return ftxss(o)
196
+ else if (toStr.call(r) === '[object Object]') {
197
+ let ks = ownKeysEnum(r)
198
+ stack.push({ t: 3, s: null, d: r, ks, es: null, i: 0, n: ks.length })
67
199
  }
68
- else {
69
- return o
200
+ else if (rec.length > 0) {
201
+ stack.push({ t: 6, s: null, d: r, ks: null, es: rec, i: 0, n: rec.length })
202
+ }
203
+ return r
204
+ }
205
+
206
+ //conv, 回傳v對應之輸出值; 容器先建立輸出並登記於memo後入工作框, 其內容由主迴圈填入
207
+ function conv(v, isRoot) {
208
+ if (typeof v === 'string') {
209
+ return isestr(v) ? ftxss(v) : v
210
+ }
211
+ if (v === null || typeof v !== 'object') {
212
+ if (isRoot === true && typeof v === 'function') { //最外層函數複製為一般物件並走訪其可列舉屬性(同lodash cloneDeep之頂層語意)
213
+ let d = {}
214
+ memo.set(v, d)
215
+ let ks = ownKeysEnum(v)
216
+ stack.push({ t: 1, s: v, d, ks, es: null, i: 0, n: ks.length })
217
+ return d
218
+ }
219
+ return v
220
+ }
221
+ let h = memo.get(v)
222
+ if (h !== undefined) {
223
+ return h
70
224
  }
225
+ if (Array.isArray(v)) {
226
+ if (Object.getPrototypeOf(v) !== Array.prototype) {
227
+ return slow(v, isRoot) //陣列子類別、跨realm陣列
228
+ }
229
+ let n = v.length
230
+ let d = new Array(n)
231
+ memo.set(v, d)
232
+ if (n > 0 && typeof v[0] === 'string' && hasOwn.call(v, 'index')) {
233
+ d.index = v.index //正規表示式比對結果, 同lodash initCloneArray
234
+ d.input = conv(v.input)
235
+ }
236
+ stack.push({ t: 0, s: v, d, ks: null, es: null, i: 0, n })
237
+ return d
238
+ }
239
+ let tag = toStr.call(v)
240
+ if (tag === '[object Object]' && Object.getPrototypeOf(v) === Object.prototype) {
241
+ let d = {}
242
+ memo.set(v, d)
243
+ let ks = ownKeysEnum(v)
244
+ stack.push({ t: 1, s: v, d, ks, es: null, i: 0, n: ks.length })
245
+ return d
246
+ }
247
+ if (tag === '[object String]' && isBoxedString(v) && isestr(v)) {
248
+ let r = ftxss(v) //包裝String, 清除後為原始字串
249
+ memo.set(v, r)
250
+ return r
251
+ }
252
+ let brand = (tag === '[object Map]' || tag === '[object Set]' || v instanceof Map || v instanceof Set) ? brandOf(v, tag) : ''
253
+ if (brand !== '') {
254
+ let Ctor = v.constructor
255
+ let d = typeof Ctor === 'function' ? new Ctor() : (brand === 'map' ? new Map() : new Set())
256
+ memo.set(v, d)
257
+ let ks = ownKeysEnum(v)
258
+ if (ks.length > 0) {
259
+ stack.push({ t: 1, s: v, d, ks, es: null, i: 0, n: ks.length }) //自有可列舉屬性(後處理)
260
+ }
261
+ let es = brand === 'map' ? [...Map.prototype.entries.call(v)] : [...Set.prototype.values.call(v)]
262
+ stack.push({ t: brand === 'map' ? 4 : 5, s: null, d, ks: null, es, i: 0, n: es.length })
263
+ return d
264
+ }
265
+ if (tag === '[object Arguments]' || tag === '[object Array]') { //arguments物件與偽稱Array/Arguments者(lodash對不可寫偽標籤會丟失鍵或拋錯), 視為物件
266
+ let d = newObj(v)
267
+ memo.set(v, d)
268
+ let ks = ownKeysEnum(v)
269
+ stack.push({ t: 2, s: v, d, ks, es: null, i: 0, n: ks.length })
270
+ return d
271
+ }
272
+ return slow(v, isRoot)
71
273
  }
72
274
 
73
- //遍例所有屬性filterXSS
74
- let t = scxss(cloneDeep(inp))
275
+ let out = conv(inp, true)
276
+
277
+ //主迴圈, 取頂框逐一處理子項(深度優先前序, 字串清除順序同遞迴)
278
+ while (stack.length > 0) {
279
+ let f = stack[stack.length - 1]
280
+ if (f.i >= f.n) {
281
+ stack.pop()
282
+ continue
283
+ }
284
+ let i = f.i++
285
+ if (f.t === 1) {
286
+ let k = f.ks[i]
287
+ setKey(f.d, k, conv(f.s[k]))
288
+ }
289
+ else if (f.t === 0) {
290
+ f.d[i] = conv(f.s[i])
291
+ }
292
+ else if (f.t === 3) {
293
+ let k = f.ks === null ? i : f.ks[i]
294
+ let val = f.d[k]
295
+ f.d[k] = conv(val instanceof Skip ? val.v : val)
296
+ }
297
+ else if (f.t === 4) {
298
+ let e = f.es[i]
299
+ f.d.set(e[0], conv(e[1])) //Map之鍵不處理
300
+ }
301
+ else if (f.t === 5) {
302
+ f.d.add(conv(f.es[i]))
303
+ }
304
+ else if (f.t === 6) {
305
+ let e = f.es[i]
306
+ f.d[e[0]] = conv(e[1])
307
+ }
308
+ else {
309
+ let k = f.ks[i]
310
+ Object.defineProperty(f.d, k, { configurable: true, enumerable: true, value: conv(f.s[k]), writable: true })
311
+ }
312
+ }
75
313
 
76
- return t
314
+ return out
77
315
  }
78
316
 
79
317
 
@@ -17,7 +17,7 @@ import treeObj from './treeObj.mjs'
17
17
 
18
18
 
19
19
  /**
20
- * 展平物件或陣列成為關聯陣列
20
+ * 展平物件或陣列成為關聯陣列,真陣列(含帶其他Symbol.toStringTag者)依索引,物件依自有鍵(length視為一般鍵),以Symbol.toStringTag偽稱Array之物件視為物件
21
21
  *
22
22
  * Unit Test: {@link https://github.com/yuda-lyu/wsemi/blob/master/test/flattenToConn.test.mjs Github}
23
23
  * @memberOf wsemi
@@ -688,12 +688,16 @@ function flattenToConn(data, opt = {}) {
688
688
  //idParent
689
689
  let idParent = genId(nk, null)
690
690
 
691
+ //isArr, isObj, 真陣列依索引; 以Symbol.toStringTag偽稱Array之物件(isarr為真而非真陣列)視為物件, 不依其length迭代(R-OBJ-ITER-01)
692
+ let isArr = Array.isArray(value)
693
+ let isObj = !isArr && (isobj(value) || isarr(value))
694
+
691
695
  //type
692
696
  let type = 'node'
693
- if (isobj(value)) {
697
+ if (isObj) {
694
698
  type = 'object'
695
699
  }
696
- else if (isarr(value)) {
700
+ else if (isArr) {
697
701
  type = 'array'
698
702
  }
699
703
 
@@ -710,17 +714,17 @@ function flattenToConn(data, opt = {}) {
710
714
  }
711
715
 
712
716
  //bindText
713
- if (!isobj(value) && !isarr(value)) {
717
+ if (!isObj && !isArr) {
714
718
  node[bindText] = value
715
719
  }
716
720
 
717
721
  //bindNumOfChilren
718
- if (isobj(value) || isarr(value)) {
722
+ if (isObj || isArr) {
719
723
  let numOfChilren = null
720
- if (isobj(value)) {
724
+ if (isObj) {
721
725
  numOfChilren = size(keys(value))
722
726
  }
723
- else if (isarr(value)) {
727
+ else {
724
728
  numOfChilren = size(value)
725
729
  }
726
730
  node[bindNumOfChilren] = numOfChilren
@@ -1,5 +1,5 @@
1
- import get from 'lodash-es/get.js'
2
- import size from 'lodash-es/size.js'
1
+ import get from 'lodash-es/get.js'
2
+ import size from 'lodash-es/size.js'
3
3
  import treeObj from './treeObj.mjs'
4
4
  import isestr from './isestr.mjs'
5
5
  import isarr from './isarr.mjs'
@@ -8,7 +8,7 @@ import isobj0 from './isobj0.mjs'
8
8
 
9
9
 
10
10
  /**
11
- * 展平樹狀物件或陣列
11
+ * 展平樹狀物件或陣列,以Symbol.toStringTag偽稱Array之物件視為物件
12
12
  *
13
13
  * Unit Test: {@link https://github.com/yuda-lyu/wsemi/blob/master/test/flattenTree.test.mjs Github}
14
14
  * @memberOf wsemi
@@ -74,14 +74,14 @@ import isobj0 from './isobj0.mjs'
74
74
  */
75
75
  function flattenTree(data, opt = {}) {
76
76
 
77
- //check
78
- if (isarr(data)) {
77
+ //check, 真陣列依索引; 以Symbol.toStringTag偽稱Array之物件(isarr為真而非真陣列)視為物件, 不依其length迭代(R-OBJ-ITER-01)
78
+ if (Array.isArray(data)) {
79
79
  if (data.length === 0) {
80
80
  return []
81
81
  }
82
82
  }
83
- else if (isobj(data)) {
84
- if (isobj0(data)) {
83
+ else if (isobj(data) || isarr(data)) {
84
+ if (isobj(data) ? isobj0(data) : Object.keys(data).length === 0) { //偽稱Array之物件(isobj為假)以自有鍵數判定空物件
85
85
  return []
86
86
  }
87
87
  }
@@ -103,7 +103,7 @@ function flattenTree(data, opt = {}) {
103
103
 
104
104
  //data
105
105
  let toArr = false
106
- if (isobj(data)) {
106
+ if (!Array.isArray(data)) {
107
107
  toArr = true
108
108
  data = [data]
109
109
  }
package/src/fsTask.mjs CHANGED
@@ -1,15 +1,15 @@
1
1
  import fs from 'fs'
2
2
  import get from 'lodash-es/get.js'
3
3
  import each from 'lodash-es/each.js'
4
- import map from 'lodash-es/map.js'
5
4
  import cloneDeep from 'lodash-es/cloneDeep.js'
6
- import cst from './_const.mjs'
5
+ import cst from './_const.mjs'
7
6
  import evem from './evem.mjs'
8
7
  import evEmit from './evEmit.mjs'
9
8
  import genPm from './genPm.mjs'
10
9
  import isestr from './isestr.mjs'
11
10
  import ispint from './ispint.mjs'
12
11
  import isarr from './isarr.mjs'
12
+ import isobj from './isobj.mjs'
13
13
  import ispnum from './ispnum.mjs'
14
14
  import cint from './cint.mjs'
15
15
  import j2o from './j2o.mjs'
@@ -216,7 +216,7 @@ function fsTask(fd, opt = {}) {
216
216
  if (!ispnum(timeInterval)) {
217
217
  timeInterval = 60 * 1000 //1min
218
218
  }
219
- timeInterval = cint(timeInterval)
219
+ timeInterval = cint(timeInterval)
220
220
  timeInterval = Math.min(timeInterval, cst.TIMER_TIME_MAX) //夾至計時器上限, 見_const.mjs
221
221
 
222
222
  //fsCreateFolder
@@ -241,7 +241,7 @@ function fsTask(fd, opt = {}) {
241
241
  r = j2o(j)
242
242
  }
243
243
  catch (err) {}
244
- return r
244
+ return isobj(r) ? r : {} //檔案來源, 可能被竄改或損毀, 非一般物件(陣列、字串、數字、null、布林)視為無紀錄(R-OBJ-ITER-01)
245
245
  }
246
246
 
247
247
  //writeObHash
@@ -293,15 +293,15 @@ function fsTask(fd, opt = {}) {
293
293
  let kpHashNew = await calcHash()
294
294
  // console.log('kpHashNew', kpHashNew)
295
295
 
296
- //hsOld
297
- let hsOld = map(kpHashsOld, (hash, path) => {
298
- return { path, hash }
296
+ //hsOld, 紀錄檔為檔案來源, 只依自有可列舉鍵迭代(length視為一般鍵; lodash map會把含非負整數length之物件當類陣列, R-OBJ-ITER-01)
297
+ let hsOld = Object.keys(kpHashsOld).map((path) => {
298
+ return { path, hash: kpHashsOld[path] }
299
299
  })
300
300
  // console.log('hsOld', hsOld)
301
301
 
302
302
  //hsNew
303
- let hsNew = map(kpHashNew, (hash, path) => {
304
- return { path, hash }
303
+ let hsNew = Object.keys(kpHashNew).map((path) => {
304
+ return { path, hash: kpHashNew[path] }
305
305
  })
306
306
  // console.log('hsNew', hsNew)
307
307
 
@@ -511,7 +511,7 @@ function fsTask(fd, opt = {}) {
511
511
  r = j2o(j)
512
512
  }
513
513
  catch (err) {}
514
- return r
514
+ return isobj(r) ? r : {} //檔案來源, 非一般物件視為無紀錄(R-OBJ-ITER-01)
515
515
  }
516
516
 
517
517
  //writeObResult
@@ -548,14 +548,15 @@ function fsTask(fd, opt = {}) {
548
548
  //eliminateObResult
549
549
  let eliminateObResult = (kpResult, fp) => {
550
550
  let kp = {}
551
- each(kpResult, (rs, key) => {
551
+ for (let key of Object.keys(kpResult)) { //紀錄檔為檔案來源, 只依自有可列舉鍵迭代(R-OBJ-ITER-01)
552
+ let rs = kpResult[key]
552
553
  let s = sep(key, '|')
553
554
  let _fp = get(s, 0, '')
554
555
  // let _hash = get(s, 1, '')
555
556
  if (_fp !== fp) {
556
557
  kp[key] = rs
557
558
  }
558
- })
559
+ }
559
560
  return kp
560
561
  }
561
562