wsemi 1.9.21 → 1.9.23

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 (524) 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 +3 -4
  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 +150 -5
  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 +49 -20
  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/getFileAccept.mjs +2 -3
  506. package/src/getFileType.mjs +149 -4
  507. package/src/getltdtkeys.mjs +6 -5
  508. package/src/treeObj.mjs +6 -6
  509. package/src/u8arr2obj.mjs +16 -2
  510. package/test/clearXSS.test.mjs +1276 -1
  511. package/test/domGetFileAccept.test.mjs +79 -11
  512. package/test/flattenToConn.test.mjs +83 -0
  513. package/test/flattenTree.test.mjs +49 -0
  514. package/test/fsTask.test.mjs +144 -0
  515. package/test/getFileAccept.test.mjs +83 -0
  516. package/test/getFileType.test.mjs +200 -29
  517. package/test/getltdtkeys.test.mjs +71 -0
  518. package/test/tools/clearXssWalkRunner.mjs +202 -0
  519. package/test/tools/getFileTypeBase.mjs +189 -0
  520. package/test/treeObj.test.mjs +119 -0
  521. package/test/u8arr2obj.test.mjs +107 -2
  522. package/toolfp/dist/wsemip.umd.js +1 -1
  523. package/toolparfor/dist/wpf.umd.js +1 -1
  524. package/toolparfor/dist/wpf_pmSeries.umd.js +1 -1
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
 
@@ -1,5 +1,4 @@
1
- import each from 'lodash-es/each.js'
2
- import haskey from './haskey.mjs'
1
+ import each from 'lodash-es/each.js'
3
2
  import getFileType from './getFileType.mjs'
4
3
 
5
4
 
@@ -54,7 +53,7 @@ function getFileAccept(groupBy = '') {
54
53
  let r = {}
55
54
  each(data, function(v) {
56
55
  let k = v[groupBy]
57
- if (!haskey(r, k)) {
56
+ if (!Object.prototype.hasOwnProperty.call(r, k)) {
58
57
  r[k] = []
59
58
  }
60
59
  r[k].push(v)