@feiyoug/skill-lab 0.0.0 → 0.0.2

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 (465) hide show
  1. package/README.md +73 -0
  2. package/esm/analyzer/astgrep/client.d.ts +20 -8
  3. package/esm/analyzer/astgrep/client.d.ts.map +1 -1
  4. package/esm/analyzer/astgrep/client.js +58 -31
  5. package/esm/analyzer/config/default.d.ts +8 -0
  6. package/esm/analyzer/config/default.d.ts.map +1 -0
  7. package/esm/analyzer/config/default.js +91 -0
  8. package/esm/analyzer/config/helpers.d.ts +8 -0
  9. package/esm/analyzer/config/helpers.d.ts.map +1 -0
  10. package/esm/analyzer/config/helpers.js +72 -0
  11. package/esm/analyzer/config/mod.d.ts +4 -0
  12. package/esm/analyzer/config/mod.d.ts.map +1 -0
  13. package/esm/analyzer/config/mod.js +3 -0
  14. package/esm/analyzer/config/types.d.ts +58 -0
  15. package/esm/analyzer/config/types.d.ts.map +1 -0
  16. package/esm/analyzer/{config.js → config/types.js} +0 -28
  17. package/esm/analyzer/logging.d.ts +3 -0
  18. package/esm/analyzer/logging.d.ts.map +1 -0
  19. package/esm/analyzer/logging.js +6 -0
  20. package/esm/analyzer/mod.d.ts +12 -5
  21. package/esm/analyzer/mod.d.ts.map +1 -1
  22. package/esm/analyzer/mod.js +25 -12
  23. package/esm/analyzer/result.d.ts +35 -0
  24. package/esm/analyzer/result.d.ts.map +1 -0
  25. package/esm/analyzer/result.js +311 -0
  26. package/esm/analyzer/rules/bash/commands/mod.d.ts +1 -0
  27. package/esm/analyzer/rules/bash/commands/mod.d.ts.map +1 -1
  28. package/esm/analyzer/rules/bash/commands/mod.js +3 -0
  29. package/esm/analyzer/rules/bash/commands/pip.d.ts +3 -0
  30. package/esm/analyzer/rules/bash/commands/pip.d.ts.map +1 -0
  31. package/esm/analyzer/rules/bash/commands/pip.js +14 -0
  32. package/esm/analyzer/rules/bash/extractFileRefs.d.ts +1 -1
  33. package/esm/analyzer/rules/bash/extractFileRefs.d.ts.map +1 -1
  34. package/esm/analyzer/rules/bash/extractFileRefs.js +2 -2
  35. package/esm/analyzer/rules/bash/inline-command-classifier.d.ts +1 -1
  36. package/esm/analyzer/rules/bash/inline-command-classifier.d.ts.map +1 -1
  37. package/esm/analyzer/rules/bash/inline-command-classifier.js +4 -4
  38. package/esm/analyzer/rules/javascript/extractFileRefs.d.ts +3 -4
  39. package/esm/analyzer/rules/javascript/extractFileRefs.d.ts.map +1 -1
  40. package/esm/analyzer/rules/javascript/extractFileRefs.js +3 -4
  41. package/esm/analyzer/rules/markdown/extractCodeBlocks.d.ts.map +1 -1
  42. package/esm/analyzer/rules/markdown/extractCodeBlocks.js +6 -3
  43. package/esm/analyzer/rules/markdown/extractFileRefs.d.ts.map +1 -1
  44. package/esm/analyzer/rules/markdown/extractFileRefs.js +2 -0
  45. package/esm/analyzer/rules/python/extractFileRefs.d.ts +1 -1
  46. package/esm/analyzer/rules/python/extractFileRefs.d.ts.map +1 -1
  47. package/esm/analyzer/rules/python/extractFileRefs.js +2 -2
  48. package/esm/analyzer/steps/001-discovery/discover-files.d.ts +4 -0
  49. package/esm/analyzer/steps/001-discovery/discover-files.d.ts.map +1 -1
  50. package/esm/analyzer/steps/001-discovery/discover-files.js +18 -2
  51. package/esm/analyzer/steps/001-discovery/mod.d.ts.map +1 -1
  52. package/esm/analyzer/steps/001-discovery/mod.js +39 -9
  53. package/esm/analyzer/steps/002-permissions/mod.d.ts.map +1 -1
  54. package/esm/analyzer/steps/002-permissions/mod.js +156 -73
  55. package/esm/analyzer/steps/002-permissions/scan-file.d.ts +1 -1
  56. package/esm/analyzer/steps/002-permissions/scan-file.d.ts.map +1 -1
  57. package/esm/analyzer/steps/002-permissions/scan-file.js +40 -5
  58. package/esm/analyzer/steps/002-permissions/seed-frontmatter.js +2 -2
  59. package/esm/analyzer/steps/003-risks/dep-risks.d.ts +3 -0
  60. package/esm/analyzer/steps/003-risks/dep-risks.d.ts.map +1 -0
  61. package/esm/analyzer/steps/003-risks/dep-risks.js +74 -0
  62. package/esm/analyzer/steps/003-risks/helpers.d.ts +1 -0
  63. package/esm/analyzer/steps/003-risks/helpers.d.ts.map +1 -1
  64. package/esm/analyzer/steps/003-risks/helpers.js +1 -0
  65. package/esm/analyzer/steps/003-risks/mod.d.ts +3 -2
  66. package/esm/analyzer/steps/003-risks/mod.d.ts.map +1 -1
  67. package/esm/analyzer/steps/003-risks/mod.js +41 -4
  68. package/esm/analyzer/steps/003-risks/policy.d.ts +7 -0
  69. package/esm/analyzer/steps/003-risks/policy.d.ts.map +1 -0
  70. package/esm/analyzer/steps/003-risks/policy.js +23 -0
  71. package/esm/analyzer/steps/003-risks/rule-mapped.d.ts +2 -2
  72. package/esm/analyzer/steps/003-risks/rule-mapped.d.ts.map +1 -1
  73. package/esm/analyzer/steps/003-risks/rule-mapped.js +83 -2
  74. package/esm/analyzer/steps/003-risks/scoring.d.ts +9 -1
  75. package/esm/analyzer/steps/003-risks/scoring.d.ts.map +1 -1
  76. package/esm/analyzer/steps/003-risks/scoring.js +55 -42
  77. package/esm/analyzer/treesitter/client.d.ts +31 -0
  78. package/esm/analyzer/treesitter/client.d.ts.map +1 -0
  79. package/esm/analyzer/{treesiter → treesitter}/client.js +43 -39
  80. package/esm/analyzer/treesitter/registry.d.ts +73 -0
  81. package/esm/analyzer/treesitter/registry.d.ts.map +1 -0
  82. package/esm/analyzer/treesitter/registry.js +165 -0
  83. package/esm/analyzer/types.d.ts +14 -28
  84. package/esm/analyzer/types.d.ts.map +1 -1
  85. package/esm/deps/jsr.io/@deno-library/progress/1.5.1/deps.d.ts +3 -0
  86. package/esm/deps/jsr.io/@deno-library/progress/1.5.1/deps.d.ts.map +1 -0
  87. package/esm/deps/jsr.io/@deno-library/progress/1.5.1/deps.js +3 -0
  88. package/esm/deps/jsr.io/@deno-library/progress/1.5.1/mod.d.ts +93 -0
  89. package/esm/deps/jsr.io/@deno-library/progress/1.5.1/mod.d.ts.map +1 -0
  90. package/esm/deps/jsr.io/@deno-library/progress/1.5.1/mod.js +297 -0
  91. package/esm/deps/jsr.io/@deno-library/progress/1.5.1/multi.d.ts +84 -0
  92. package/esm/deps/jsr.io/@deno-library/progress/1.5.1/multi.d.ts.map +1 -0
  93. package/esm/deps/jsr.io/@deno-library/progress/1.5.1/multi.js +268 -0
  94. package/esm/deps/jsr.io/@deno-library/progress/1.5.1/time.d.ts +18 -0
  95. package/esm/deps/jsr.io/@deno-library/progress/1.5.1/time.d.ts.map +1 -0
  96. package/esm/deps/jsr.io/@deno-library/progress/1.5.1/time.js +45 -0
  97. package/esm/deps/jsr.io/@std/fmt/1.0.3/colors.d.ts +700 -0
  98. package/esm/deps/jsr.io/@std/fmt/1.0.3/colors.d.ts.map +1 -0
  99. package/esm/deps/jsr.io/@std/fmt/1.0.3/colors.js +903 -0
  100. package/esm/deps/jsr.io/@std/io/0.225.0/types.d.ts +146 -0
  101. package/esm/deps/jsr.io/@std/io/0.225.0/types.d.ts.map +1 -0
  102. package/esm/deps/jsr.io/@std/io/0.225.0/types.js +15 -0
  103. package/esm/deps/jsr.io/@std/io/0.225.0/write_all.d.ts +51 -0
  104. package/esm/deps/jsr.io/@std/io/0.225.0/write_all.d.ts.map +1 -0
  105. package/esm/deps/jsr.io/@std/io/0.225.0/write_all.js +61 -0
  106. package/esm/shared/deep_merge.d.ts +12 -0
  107. package/esm/shared/deep_merge.d.ts.map +1 -0
  108. package/esm/shared/deep_merge.js +49 -0
  109. package/esm/shared/mod.d.ts +1 -0
  110. package/esm/shared/mod.d.ts.map +1 -1
  111. package/esm/shared/mod.js +1 -0
  112. package/esm/shared/types/filetypes.d.ts +2 -2
  113. package/esm/shared/types/filetypes.d.ts.map +1 -1
  114. package/esm/shared/types/permissions.d.ts +1 -1
  115. package/esm/shared/types/permissions.d.ts.map +1 -1
  116. package/esm/shared/types/risks.d.ts +4 -1
  117. package/esm/shared/types/risks.d.ts.map +1 -1
  118. package/esm/skillreader/types.d.ts +2 -2
  119. package/esm/skillreader/types.d.ts.map +1 -1
  120. package/esm/skillreader/types.js +2 -2
  121. package/package.json +1 -1
  122. package/script/analyzer/astgrep/client.d.ts +20 -8
  123. package/script/analyzer/astgrep/client.d.ts.map +1 -1
  124. package/script/analyzer/astgrep/client.js +58 -64
  125. package/script/analyzer/config/default.d.ts +8 -0
  126. package/script/analyzer/config/default.d.ts.map +1 -0
  127. package/script/analyzer/config/default.js +94 -0
  128. package/script/analyzer/config/helpers.d.ts +8 -0
  129. package/script/analyzer/config/helpers.d.ts.map +1 -0
  130. package/script/analyzer/config/helpers.js +76 -0
  131. package/script/analyzer/config/mod.d.ts +4 -0
  132. package/script/analyzer/config/mod.d.ts.map +1 -0
  133. package/script/analyzer/config/mod.js +21 -0
  134. package/script/analyzer/config/types.d.ts +58 -0
  135. package/script/analyzer/config/types.d.ts.map +1 -0
  136. package/script/analyzer/{config.js → config/types.js} +1 -29
  137. package/script/analyzer/logging.d.ts +3 -0
  138. package/script/analyzer/logging.d.ts.map +1 -0
  139. package/script/analyzer/logging.js +9 -0
  140. package/script/analyzer/mod.d.ts +12 -5
  141. package/script/analyzer/mod.d.ts.map +1 -1
  142. package/script/analyzer/mod.js +35 -20
  143. package/script/analyzer/result.d.ts +35 -0
  144. package/script/analyzer/result.d.ts.map +1 -0
  145. package/script/analyzer/result.js +315 -0
  146. package/script/analyzer/rules/bash/commands/mod.d.ts +1 -0
  147. package/script/analyzer/rules/bash/commands/mod.d.ts.map +1 -1
  148. package/script/analyzer/rules/bash/commands/mod.js +3 -0
  149. package/script/analyzer/rules/bash/commands/pip.d.ts +3 -0
  150. package/script/analyzer/rules/bash/commands/pip.d.ts.map +1 -0
  151. package/script/analyzer/rules/bash/commands/pip.js +17 -0
  152. package/script/analyzer/rules/bash/extractFileRefs.d.ts +1 -1
  153. package/script/analyzer/rules/bash/extractFileRefs.d.ts.map +1 -1
  154. package/script/analyzer/rules/bash/extractFileRefs.js +2 -2
  155. package/script/analyzer/rules/bash/inline-command-classifier.d.ts +1 -1
  156. package/script/analyzer/rules/bash/inline-command-classifier.d.ts.map +1 -1
  157. package/script/analyzer/rules/bash/inline-command-classifier.js +4 -4
  158. package/script/analyzer/rules/javascript/extractFileRefs.d.ts +3 -4
  159. package/script/analyzer/rules/javascript/extractFileRefs.d.ts.map +1 -1
  160. package/script/analyzer/rules/javascript/extractFileRefs.js +3 -4
  161. package/script/analyzer/rules/markdown/extractCodeBlocks.d.ts.map +1 -1
  162. package/script/analyzer/rules/markdown/extractCodeBlocks.js +6 -3
  163. package/script/analyzer/rules/markdown/extractFileRefs.d.ts.map +1 -1
  164. package/script/analyzer/rules/markdown/extractFileRefs.js +2 -0
  165. package/script/analyzer/rules/python/extractFileRefs.d.ts +1 -1
  166. package/script/analyzer/rules/python/extractFileRefs.d.ts.map +1 -1
  167. package/script/analyzer/rules/python/extractFileRefs.js +2 -2
  168. package/script/analyzer/steps/001-discovery/discover-files.d.ts +4 -0
  169. package/script/analyzer/steps/001-discovery/discover-files.d.ts.map +1 -1
  170. package/script/analyzer/steps/001-discovery/discover-files.js +18 -2
  171. package/script/analyzer/steps/001-discovery/mod.d.ts.map +1 -1
  172. package/script/analyzer/steps/001-discovery/mod.js +77 -11
  173. package/script/analyzer/steps/002-permissions/mod.d.ts.map +1 -1
  174. package/script/analyzer/steps/002-permissions/mod.js +194 -75
  175. package/script/analyzer/steps/002-permissions/scan-file.d.ts +1 -1
  176. package/script/analyzer/steps/002-permissions/scan-file.d.ts.map +1 -1
  177. package/script/analyzer/steps/002-permissions/scan-file.js +40 -5
  178. package/script/analyzer/steps/002-permissions/seed-frontmatter.js +3 -3
  179. package/script/analyzer/steps/003-risks/dep-risks.d.ts +3 -0
  180. package/script/analyzer/steps/003-risks/dep-risks.d.ts.map +1 -0
  181. package/script/analyzer/steps/003-risks/dep-risks.js +77 -0
  182. package/script/analyzer/steps/003-risks/helpers.d.ts +1 -0
  183. package/script/analyzer/steps/003-risks/helpers.d.ts.map +1 -1
  184. package/script/analyzer/steps/003-risks/helpers.js +1 -0
  185. package/script/analyzer/steps/003-risks/mod.d.ts +3 -2
  186. package/script/analyzer/steps/003-risks/mod.d.ts.map +1 -1
  187. package/script/analyzer/steps/003-risks/mod.js +77 -4
  188. package/script/analyzer/steps/003-risks/policy.d.ts +7 -0
  189. package/script/analyzer/steps/003-risks/policy.d.ts.map +1 -0
  190. package/script/analyzer/steps/003-risks/policy.js +29 -0
  191. package/script/analyzer/steps/003-risks/rule-mapped.d.ts +2 -2
  192. package/script/analyzer/steps/003-risks/rule-mapped.d.ts.map +1 -1
  193. package/script/analyzer/steps/003-risks/rule-mapped.js +83 -2
  194. package/script/analyzer/steps/003-risks/scoring.d.ts +9 -1
  195. package/script/analyzer/steps/003-risks/scoring.d.ts.map +1 -1
  196. package/script/analyzer/steps/003-risks/scoring.js +55 -42
  197. package/script/analyzer/treesitter/client.d.ts +31 -0
  198. package/script/analyzer/treesitter/client.d.ts.map +1 -0
  199. package/script/analyzer/treesitter/client.js +136 -0
  200. package/script/analyzer/treesitter/registry.d.ts +73 -0
  201. package/script/analyzer/treesitter/registry.d.ts.map +1 -0
  202. package/script/analyzer/treesitter/registry.js +206 -0
  203. package/script/analyzer/types.d.ts +14 -28
  204. package/script/analyzer/types.d.ts.map +1 -1
  205. package/script/deps/jsr.io/@deno-library/progress/1.5.1/deps.d.ts +3 -0
  206. package/script/deps/jsr.io/@deno-library/progress/1.5.1/deps.d.ts.map +1 -0
  207. package/script/deps/jsr.io/@deno-library/progress/1.5.1/deps.js +10 -0
  208. package/script/deps/jsr.io/@deno-library/progress/1.5.1/mod.d.ts +93 -0
  209. package/script/deps/jsr.io/@deno-library/progress/1.5.1/mod.d.ts.map +1 -0
  210. package/script/deps/jsr.io/@deno-library/progress/1.5.1/mod.js +334 -0
  211. package/script/deps/jsr.io/@deno-library/progress/1.5.1/multi.d.ts +84 -0
  212. package/script/deps/jsr.io/@deno-library/progress/1.5.1/multi.d.ts.map +1 -0
  213. package/script/deps/jsr.io/@deno-library/progress/1.5.1/multi.js +305 -0
  214. package/script/deps/jsr.io/@deno-library/progress/1.5.1/time.d.ts +18 -0
  215. package/script/deps/jsr.io/@deno-library/progress/1.5.1/time.d.ts.map +1 -0
  216. package/script/deps/jsr.io/@deno-library/progress/1.5.1/time.js +48 -0
  217. package/script/deps/jsr.io/@std/fmt/1.0.3/colors.d.ts +700 -0
  218. package/script/deps/jsr.io/@std/fmt/1.0.3/colors.d.ts.map +1 -0
  219. package/script/deps/jsr.io/@std/fmt/1.0.3/colors.js +986 -0
  220. package/script/deps/jsr.io/@std/io/0.225.0/types.d.ts +146 -0
  221. package/script/deps/jsr.io/@std/io/0.225.0/types.d.ts.map +1 -0
  222. package/script/deps/jsr.io/@std/io/0.225.0/types.js +18 -0
  223. package/script/deps/jsr.io/@std/io/0.225.0/write_all.d.ts +51 -0
  224. package/script/deps/jsr.io/@std/io/0.225.0/write_all.d.ts.map +1 -0
  225. package/script/deps/jsr.io/@std/io/0.225.0/write_all.js +65 -0
  226. package/script/shared/deep_merge.d.ts +12 -0
  227. package/script/shared/deep_merge.d.ts.map +1 -0
  228. package/script/shared/deep_merge.js +53 -0
  229. package/script/shared/mod.d.ts +1 -0
  230. package/script/shared/mod.d.ts.map +1 -1
  231. package/script/shared/mod.js +1 -0
  232. package/script/shared/types/filetypes.d.ts +2 -2
  233. package/script/shared/types/filetypes.d.ts.map +1 -1
  234. package/script/shared/types/permissions.d.ts +1 -1
  235. package/script/shared/types/permissions.d.ts.map +1 -1
  236. package/script/shared/types/risks.d.ts +4 -1
  237. package/script/shared/types/risks.d.ts.map +1 -1
  238. package/script/skillreader/types.d.ts +2 -2
  239. package/script/skillreader/types.d.ts.map +1 -1
  240. package/script/skillreader/types.js +2 -2
  241. package/src/_dnt.polyfills.ts +27 -0
  242. package/src/_dnt.shims.ts +64 -0
  243. package/src/analyzer/astgrep/client.ts +184 -0
  244. package/src/analyzer/astgrep/mod.ts +2 -0
  245. package/src/analyzer/config/default.ts +98 -0
  246. package/src/analyzer/config/helpers.ts +107 -0
  247. package/src/analyzer/config/mod.ts +3 -0
  248. package/src/analyzer/config/types.ts +103 -0
  249. package/src/analyzer/logging.ts +8 -0
  250. package/src/analyzer/mod.ts +118 -0
  251. package/src/analyzer/result.ts +393 -0
  252. package/src/analyzer/rules/bash/astTypes.ts +5 -0
  253. package/src/analyzer/rules/bash/commands/bd.ts +23 -0
  254. package/src/analyzer/rules/bash/commands/cron.ts +21 -0
  255. package/src/analyzer/rules/bash/commands/docker.ts +37 -0
  256. package/src/analyzer/rules/bash/commands/eval.ts +52 -0
  257. package/src/analyzer/rules/bash/commands/generic.ts +16 -0
  258. package/src/analyzer/rules/bash/commands/gh.ts +21 -0
  259. package/src/analyzer/rules/bash/commands/git.ts +28 -0
  260. package/src/analyzer/rules/bash/commands/mod.ts +38 -0
  261. package/src/analyzer/rules/bash/commands/node.ts +64 -0
  262. package/src/analyzer/rules/bash/commands/openspec.ts +16 -0
  263. package/src/analyzer/rules/bash/commands/pip.ts +16 -0
  264. package/src/analyzer/rules/bash/commands/sudo.ts +21 -0
  265. package/src/analyzer/rules/bash/destructive.ts +28 -0
  266. package/src/analyzer/rules/bash/extractFileRefs.ts +101 -0
  267. package/src/analyzer/rules/bash/filesystem.ts +50 -0
  268. package/src/analyzer/rules/bash/injection.ts +21 -0
  269. package/src/analyzer/rules/bash/inline-command-classifier.ts +94 -0
  270. package/src/analyzer/rules/bash/mod.ts +23 -0
  271. package/src/analyzer/rules/bash/network.ts +64 -0
  272. package/src/analyzer/rules/bash/secret-detection.ts +43 -0
  273. package/src/analyzer/rules/javascript/astTypes.ts +8 -0
  274. package/src/analyzer/rules/javascript/extractFileRefs.ts +131 -0
  275. package/src/analyzer/rules/javascript/filesystem.ts +28 -0
  276. package/src/analyzer/rules/javascript/injection.ts +21 -0
  277. package/src/analyzer/rules/javascript/mod.ts +26 -0
  278. package/src/analyzer/rules/javascript/network.ts +27 -0
  279. package/src/analyzer/rules/javascript/secret-detection.ts +68 -0
  280. package/src/analyzer/rules/javascript/subprocess.ts +16 -0
  281. package/src/analyzer/rules/markdown/astTypes.ts +35 -0
  282. package/src/analyzer/rules/markdown/extractCodeBlocks.ts +101 -0
  283. package/src/analyzer/rules/markdown/extractFileRefs.ts +179 -0
  284. package/src/analyzer/rules/markdown/mod.ts +12 -0
  285. package/src/analyzer/rules/mod.ts +77 -0
  286. package/src/analyzer/rules/python/astTypes.ts +9 -0
  287. package/src/analyzer/rules/python/extractFileRefs.ts +92 -0
  288. package/src/analyzer/rules/python/mod.ts +15 -0
  289. package/src/analyzer/rules/python/network.ts +26 -0
  290. package/src/analyzer/rules/python/secret-detection.ts +30 -0
  291. package/src/analyzer/rules/shared/file-refs.ts +38 -0
  292. package/src/analyzer/rules/shared/network-evaluators.ts +107 -0
  293. package/src/analyzer/rules/shared/prompt-injection.ts +48 -0
  294. package/src/analyzer/rules/shared/secret-evaluators.ts +13 -0
  295. package/src/analyzer/rules/text/mod.ts +12 -0
  296. package/src/analyzer/rules/typescript/mod.ts +7 -0
  297. package/src/analyzer/steps/001-discovery/discover-files.ts +211 -0
  298. package/src/analyzer/steps/001-discovery/filter-files.ts +72 -0
  299. package/src/analyzer/steps/001-discovery/mod.ts +103 -0
  300. package/src/analyzer/steps/002-permissions/mod.ts +329 -0
  301. package/src/analyzer/steps/002-permissions/scan-file.ts +258 -0
  302. package/src/analyzer/steps/002-permissions/seed-frontmatter.ts +66 -0
  303. package/src/analyzer/steps/002-permissions/synthesize.ts +42 -0
  304. package/src/analyzer/steps/003-risks/dep-risks.ts +89 -0
  305. package/src/analyzer/steps/003-risks/helpers.ts +41 -0
  306. package/src/analyzer/steps/003-risks/mod.ts +86 -0
  307. package/src/analyzer/steps/003-risks/policy.ts +38 -0
  308. package/src/analyzer/steps/003-risks/rule-mapped.ts +206 -0
  309. package/src/analyzer/steps/003-risks/scoring.ts +117 -0
  310. package/src/analyzer/steps/mod.ts +3 -0
  311. package/src/analyzer/treesitter/client.ts +120 -0
  312. package/src/analyzer/treesitter/registry.ts +198 -0
  313. package/src/analyzer/types.ts +78 -0
  314. package/src/analyzer/utils/code-block-path.ts +33 -0
  315. package/src/analyzer/utils/id-generator.ts +59 -0
  316. package/src/analyzer/utils/secret-validator.ts +29 -0
  317. package/src/analyzer/utils/url-parser.ts +25 -0
  318. package/src/deps/jsr.io/@deno-library/progress/1.5.1/deps.ts +3 -0
  319. package/src/deps/jsr.io/@deno-library/progress/1.5.1/mod.ts +265 -0
  320. package/src/deps/jsr.io/@deno-library/progress/1.5.1/multi.ts +250 -0
  321. package/src/deps/jsr.io/@deno-library/progress/1.5.1/time.ts +69 -0
  322. package/src/deps/jsr.io/@std/fmt/1.0.3/colors.ts +1004 -0
  323. package/src/deps/jsr.io/@std/internal/1.0.12/_os.ts +15 -0
  324. package/src/deps/jsr.io/@std/internal/1.0.12/os.ts +7 -0
  325. package/src/deps/jsr.io/@std/io/0.225.0/types.ts +157 -0
  326. package/src/deps/jsr.io/@std/io/0.225.0/write_all.ts +65 -0
  327. package/src/deps/jsr.io/@std/path/1.1.4/_common/assert_path.ts +10 -0
  328. package/src/deps/jsr.io/@std/path/1.1.4/_common/basename.ts +53 -0
  329. package/src/deps/jsr.io/@std/path/1.1.4/_common/common.ts +26 -0
  330. package/src/deps/jsr.io/@std/path/1.1.4/_common/constants.ts +49 -0
  331. package/src/deps/jsr.io/@std/path/1.1.4/_common/dirname.ts +9 -0
  332. package/src/deps/jsr.io/@std/path/1.1.4/_common/format.ts +25 -0
  333. package/src/deps/jsr.io/@std/path/1.1.4/_common/from_file_url.ts +12 -0
  334. package/src/deps/jsr.io/@std/path/1.1.4/_common/glob_to_reg_exp.ts +295 -0
  335. package/src/deps/jsr.io/@std/path/1.1.4/_common/normalize.ts +9 -0
  336. package/src/deps/jsr.io/@std/path/1.1.4/_common/normalize_string.ts +74 -0
  337. package/src/deps/jsr.io/@std/path/1.1.4/_common/relative.ts +10 -0
  338. package/src/deps/jsr.io/@std/path/1.1.4/_common/strip_trailing_separators.ts +25 -0
  339. package/src/deps/jsr.io/@std/path/1.1.4/_common/to_file_url.ts +17 -0
  340. package/src/deps/jsr.io/@std/path/1.1.4/basename.ts +37 -0
  341. package/src/deps/jsr.io/@std/path/1.1.4/common.ts +35 -0
  342. package/src/deps/jsr.io/@std/path/1.1.4/constants.ts +18 -0
  343. package/src/deps/jsr.io/@std/path/1.1.4/dirname.ts +30 -0
  344. package/src/deps/jsr.io/@std/path/1.1.4/extname.ts +29 -0
  345. package/src/deps/jsr.io/@std/path/1.1.4/format.ts +30 -0
  346. package/src/deps/jsr.io/@std/path/1.1.4/from_file_url.ts +30 -0
  347. package/src/deps/jsr.io/@std/path/1.1.4/glob_to_regexp.ts +94 -0
  348. package/src/deps/jsr.io/@std/path/1.1.4/is_absolute.ts +30 -0
  349. package/src/deps/jsr.io/@std/path/1.1.4/is_glob.ts +49 -0
  350. package/src/deps/jsr.io/@std/path/1.1.4/join.ts +31 -0
  351. package/src/deps/jsr.io/@std/path/1.1.4/join_globs.ts +42 -0
  352. package/src/deps/jsr.io/@std/path/1.1.4/mod.ts +217 -0
  353. package/src/deps/jsr.io/@std/path/1.1.4/normalize.ts +33 -0
  354. package/src/deps/jsr.io/@std/path/1.1.4/normalize_glob.ts +45 -0
  355. package/src/deps/jsr.io/@std/path/1.1.4/parse.ts +44 -0
  356. package/src/deps/jsr.io/@std/path/1.1.4/posix/_util.ts +10 -0
  357. package/src/deps/jsr.io/@std/path/1.1.4/posix/basename.ts +62 -0
  358. package/src/deps/jsr.io/@std/path/1.1.4/posix/constants.ts +15 -0
  359. package/src/deps/jsr.io/@std/path/1.1.4/posix/dirname.ts +72 -0
  360. package/src/deps/jsr.io/@std/path/1.1.4/posix/extname.ts +96 -0
  361. package/src/deps/jsr.io/@std/path/1.1.4/posix/format.ts +31 -0
  362. package/src/deps/jsr.io/@std/path/1.1.4/posix/from_file_url.ts +25 -0
  363. package/src/deps/jsr.io/@std/path/1.1.4/posix/glob_to_regexp.ts +94 -0
  364. package/src/deps/jsr.io/@std/path/1.1.4/posix/is_absolute.ts +25 -0
  365. package/src/deps/jsr.io/@std/path/1.1.4/posix/join.ts +46 -0
  366. package/src/deps/jsr.io/@std/path/1.1.4/posix/join_globs.ts +45 -0
  367. package/src/deps/jsr.io/@std/path/1.1.4/posix/normalize.ts +63 -0
  368. package/src/deps/jsr.io/@std/path/1.1.4/posix/normalize_glob.ts +43 -0
  369. package/src/deps/jsr.io/@std/path/1.1.4/posix/parse.ts +121 -0
  370. package/src/deps/jsr.io/@std/path/1.1.4/posix/relative.ts +103 -0
  371. package/src/deps/jsr.io/@std/path/1.1.4/posix/resolve.ts +71 -0
  372. package/src/deps/jsr.io/@std/path/1.1.4/posix/to_file_url.ts +32 -0
  373. package/src/deps/jsr.io/@std/path/1.1.4/posix/to_namespaced_path.ts +21 -0
  374. package/src/deps/jsr.io/@std/path/1.1.4/relative.ts +32 -0
  375. package/src/deps/jsr.io/@std/path/1.1.4/resolve.ts +32 -0
  376. package/src/deps/jsr.io/@std/path/1.1.4/to_file_url.ts +30 -0
  377. package/src/deps/jsr.io/@std/path/1.1.4/to_namespaced_path.ts +31 -0
  378. package/src/deps/jsr.io/@std/path/1.1.4/types.ts +40 -0
  379. package/src/deps/jsr.io/@std/path/1.1.4/windows/_util.ts +28 -0
  380. package/src/deps/jsr.io/@std/path/1.1.4/windows/basename.ts +54 -0
  381. package/src/deps/jsr.io/@std/path/1.1.4/windows/constants.ts +15 -0
  382. package/src/deps/jsr.io/@std/path/1.1.4/windows/dirname.ts +118 -0
  383. package/src/deps/jsr.io/@std/path/1.1.4/windows/extname.ts +90 -0
  384. package/src/deps/jsr.io/@std/path/1.1.4/windows/format.ts +31 -0
  385. package/src/deps/jsr.io/@std/path/1.1.4/windows/from_file_url.ts +34 -0
  386. package/src/deps/jsr.io/@std/path/1.1.4/windows/glob_to_regexp.ts +92 -0
  387. package/src/deps/jsr.io/@std/path/1.1.4/windows/is_absolute.ts +40 -0
  388. package/src/deps/jsr.io/@std/path/1.1.4/windows/join.ts +78 -0
  389. package/src/deps/jsr.io/@std/path/1.1.4/windows/join_globs.ts +46 -0
  390. package/src/deps/jsr.io/@std/path/1.1.4/windows/normalize.ts +136 -0
  391. package/src/deps/jsr.io/@std/path/1.1.4/windows/normalize_glob.ts +43 -0
  392. package/src/deps/jsr.io/@std/path/1.1.4/windows/parse.ts +184 -0
  393. package/src/deps/jsr.io/@std/path/1.1.4/windows/relative.ts +128 -0
  394. package/src/deps/jsr.io/@std/path/1.1.4/windows/resolve.ts +178 -0
  395. package/src/deps/jsr.io/@std/path/1.1.4/windows/to_file_url.ts +38 -0
  396. package/src/deps/jsr.io/@std/path/1.1.4/windows/to_namespaced_path.ts +60 -0
  397. package/src/deps/jsr.io/@std/yaml/1.0.11/_chars.ts +55 -0
  398. package/src/deps/jsr.io/@std/yaml/1.0.11/_dumper_state.ts +841 -0
  399. package/src/deps/jsr.io/@std/yaml/1.0.11/_loader_state.ts +1780 -0
  400. package/src/deps/jsr.io/@std/yaml/1.0.11/_schema.ts +183 -0
  401. package/src/deps/jsr.io/@std/yaml/1.0.11/_type/binary.ts +127 -0
  402. package/src/deps/jsr.io/@std/yaml/1.0.11/_type/bool.ts +37 -0
  403. package/src/deps/jsr.io/@std/yaml/1.0.11/_type/float.ts +112 -0
  404. package/src/deps/jsr.io/@std/yaml/1.0.11/_type/int.ts +174 -0
  405. package/src/deps/jsr.io/@std/yaml/1.0.11/_type/map.ts +17 -0
  406. package/src/deps/jsr.io/@std/yaml/1.0.11/_type/merge.ts +13 -0
  407. package/src/deps/jsr.io/@std/yaml/1.0.11/_type/nil.ts +27 -0
  408. package/src/deps/jsr.io/@std/yaml/1.0.11/_type/omap.ts +30 -0
  409. package/src/deps/jsr.io/@std/yaml/1.0.11/_type/pairs.ts +22 -0
  410. package/src/deps/jsr.io/@std/yaml/1.0.11/_type/regexp.ts +33 -0
  411. package/src/deps/jsr.io/@std/yaml/1.0.11/_type/seq.ts +13 -0
  412. package/src/deps/jsr.io/@std/yaml/1.0.11/_type/set.ts +17 -0
  413. package/src/deps/jsr.io/@std/yaml/1.0.11/_type/str.ts +12 -0
  414. package/src/deps/jsr.io/@std/yaml/1.0.11/_type/timestamp.ts +101 -0
  415. package/src/deps/jsr.io/@std/yaml/1.0.11/_type/undefined.ts +23 -0
  416. package/src/deps/jsr.io/@std/yaml/1.0.11/_type.ts +49 -0
  417. package/src/deps/jsr.io/@std/yaml/1.0.11/_utils.ts +16 -0
  418. package/src/deps/jsr.io/@std/yaml/1.0.11/mod.ts +54 -0
  419. package/src/deps/jsr.io/@std/yaml/1.0.11/parse.ts +128 -0
  420. package/src/deps/jsr.io/@std/yaml/1.0.11/stringify.ts +118 -0
  421. package/src/shared/deep_merge.ts +73 -0
  422. package/src/shared/mod.ts +2 -0
  423. package/src/shared/types/filetypes.ts +101 -0
  424. package/src/shared/types/findings.ts +7 -0
  425. package/src/shared/types/mod.ts +6 -0
  426. package/src/shared/types/permissions.ts +17 -0
  427. package/src/shared/types/references.ts +62 -0
  428. package/src/shared/types/risks.ts +72 -0
  429. package/src/shared/types/syntaxNode.ts +7 -0
  430. package/src/skillreader/cloudStorage/mod.ts +170 -0
  431. package/src/skillreader/factory.ts +71 -0
  432. package/src/skillreader/fs/git.ts +153 -0
  433. package/src/skillreader/fs/mod.ts +84 -0
  434. package/src/skillreader/github/base.ts +162 -0
  435. package/src/skillreader/github/githubApi.ts +40 -0
  436. package/src/skillreader/github/githubRaw.ts +24 -0
  437. package/src/skillreader/github/mod.ts +45 -0
  438. package/src/skillreader/github/utils.ts +40 -0
  439. package/src/skillreader/manifest.ts +67 -0
  440. package/src/skillreader/mod.ts +26 -0
  441. package/src/skillreader/types.ts +150 -0
  442. package/src/skillreader/utils/frontmatter-parser.ts +72 -0
  443. package/src/skillreader/utils/http-range.ts +38 -0
  444. package/src/skillreader/utils/mod.ts +12 -0
  445. package/esm/analyzer/astgrep/registry.d.ts +0 -18
  446. package/esm/analyzer/astgrep/registry.d.ts.map +0 -1
  447. package/esm/analyzer/astgrep/registry.js +0 -71
  448. package/esm/analyzer/config.d.ts +0 -27
  449. package/esm/analyzer/config.d.ts.map +0 -1
  450. package/esm/analyzer/steps/003-risks/output.d.ts +0 -3
  451. package/esm/analyzer/steps/003-risks/output.d.ts.map +0 -1
  452. package/esm/analyzer/steps/003-risks/output.js +0 -16
  453. package/esm/analyzer/treesiter/client.d.ts +0 -26
  454. package/esm/analyzer/treesiter/client.d.ts.map +0 -1
  455. package/script/analyzer/astgrep/registry.d.ts +0 -18
  456. package/script/analyzer/astgrep/registry.d.ts.map +0 -1
  457. package/script/analyzer/astgrep/registry.js +0 -109
  458. package/script/analyzer/config.d.ts +0 -27
  459. package/script/analyzer/config.d.ts.map +0 -1
  460. package/script/analyzer/steps/003-risks/output.d.ts +0 -3
  461. package/script/analyzer/steps/003-risks/output.d.ts.map +0 -1
  462. package/script/analyzer/steps/003-risks/output.js +0 -19
  463. package/script/analyzer/treesiter/client.d.ts +0 -26
  464. package/script/analyzer/treesiter/client.d.ts.map +0 -1
  465. package/script/analyzer/treesiter/client.js +0 -165
@@ -0,0 +1,265 @@
1
+ import * as dntShim from "../../../../../_dnt.shims.js";
2
+ import { bgGreen, bgWhite, stripAnsiCode } from "./deps.js";
3
+ import { writeAll } from "./deps.js";
4
+ // import type { Writer } from "./deps.ts";
5
+ import { prettyTime, type prettyTimeOptions } from "./time.js";
6
+ export { MultiProgressBar } from "./multi.js";
7
+
8
+ const isTerminal = dntShim.Deno.stdout.isTerminal;
9
+
10
+ const enum Direction {
11
+ left,
12
+ right,
13
+ all,
14
+ }
15
+
16
+ interface constructorOptions {
17
+ title?: string;
18
+ total?: number;
19
+ width?: number;
20
+ complete?: string;
21
+ preciseBar?: string[];
22
+ incomplete?: string;
23
+ clear?: boolean;
24
+ interval?: number;
25
+ display?: string;
26
+ prettyTime?: boolean;
27
+ output?: typeof dntShim.Deno.stdout | typeof dntShim.Deno.stderr;
28
+ }
29
+
30
+ interface renderOptions {
31
+ title?: string;
32
+ total?: number;
33
+ text?: string;
34
+ complete?: string;
35
+ preciseBar?: string[];
36
+ incomplete?: string;
37
+ prettyTimeOptions?: prettyTimeOptions;
38
+ }
39
+
40
+ /**
41
+ * ProgressBar single progress bar.
42
+ */
43
+ export default class ProgressBar {
44
+ title: string;
45
+ total?: number;
46
+ width: number;
47
+ complete: string;
48
+ preciseBar: string[];
49
+ incomplete: string;
50
+ clear: boolean;
51
+ interval: number;
52
+ display: string;
53
+ prettyTime: boolean;
54
+
55
+ #end = false;
56
+ private lastStr = "";
57
+ private lastStrLen = 0;
58
+ private start = Date.now();
59
+ private lastRenderTime = 0;
60
+ private encoder = new TextEncoder();
61
+ // private writer: WritableStreamDefaultWriter<Uint8Array>;
62
+ // private writer: Writer;
63
+ private writer: typeof dntShim.Deno.stdout | typeof dntShim.Deno.stderr;
64
+
65
+ /**
66
+ * Title, total, complete, incomplete, can also be set or changed in the render method
67
+ *
68
+ * - title Progress bar title, default: ''
69
+ * - total total number of ticks to complete,
70
+ * - width the displayed width of the progress, default: 50
71
+ * - complete completion character, default: colors.bgGreen(' '), can use any string
72
+ * - incomplete incomplete character, default: colors.bgWhite(' '), can use any string
73
+ * - clear clear the bar on completion, default: false
74
+ * - interval minimum time between updates in milliseconds, default: 16
75
+ * - display What is displayed and display order, default: ':title :percent :bar :time :completed/:total'
76
+ * - prettyTime Whether to pretty print time and eta
77
+ * - output Output stream, can be Deno.stdout or Deno.stderr, default is Deno.stdout
78
+ */
79
+ constructor({
80
+ title = "",
81
+ total,
82
+ width = 50,
83
+ complete = bgGreen(" "),
84
+ preciseBar = [],
85
+ incomplete = bgWhite(" "),
86
+ clear = false,
87
+ interval = 16,
88
+ display,
89
+ prettyTime = false,
90
+ output = dntShim.Deno.stdout,
91
+ }: constructorOptions = {}) {
92
+ this.title = title;
93
+ this.total = total;
94
+ this.width = width;
95
+ this.complete = complete;
96
+ this.preciseBar = preciseBar.concat(complete);
97
+ this.incomplete = incomplete;
98
+ this.clear = clear;
99
+ this.interval = interval;
100
+ this.display = display ??
101
+ ":title :percent :bar :time :completed/:total :text";
102
+ this.prettyTime = prettyTime;
103
+ // this.writer = output.writable.getWriter();
104
+ this.writer = output;
105
+ }
106
+
107
+ /**
108
+ * "render" the progress bar
109
+ *
110
+ * - `completed` completed value
111
+ * - `options` optional parameters
112
+ * - `title` progress bar title
113
+ * - `total` total number of ticks to complete
114
+ * - `text` optional, custom text, default: ''
115
+ * - `complete` completion character, If you want to change at a certain moment. For example, it turns red at 20%
116
+ * - `incomplete` incomplete character, If you want to change at a certain moment. For example, it turns red at 20%
117
+ * - `prettyTimeOptions` prettyTime options
118
+ */
119
+ async render(completed: number, options: renderOptions = {}): Promise<void> {
120
+ if (this.#end || !isTerminal) return;
121
+
122
+ if (completed < 0) {
123
+ throw new Error(`completed must greater than or equal to 0`);
124
+ }
125
+
126
+ const total = options.total ?? this.total ?? 100;
127
+ const now = Date.now();
128
+ const ms = now - this.lastRenderTime;
129
+ const end = completed >= total;
130
+ if (ms < this.interval && !end) return;
131
+
132
+ this.lastRenderTime = now;
133
+ const time = this.prettyTime
134
+ ? prettyTime(now - this.start, options.prettyTimeOptions)
135
+ : ((now - this.start) / 1000).toFixed(1) + "s";
136
+ const msEta = completed >= total
137
+ ? 0
138
+ : (total / completed - 1) * (now - this.start);
139
+ const eta = completed == 0
140
+ ? "-"
141
+ : this.prettyTime
142
+ ? prettyTime(msEta, options.prettyTimeOptions)
143
+ : (msEta / 1000).toFixed(1) + "s";
144
+
145
+ const percent = ((completed / total) * 100).toFixed(2) + "%";
146
+
147
+ // :title :percent :bar :time :completed/:total
148
+ let str = this.display
149
+ .replace(":title", options.title ?? this.title)
150
+ .replace(":time", time)
151
+ .replace(":text", options.text ?? "")
152
+ .replace(":eta", eta)
153
+ .replace(":percent", percent)
154
+ .replace(":completed", completed + "")
155
+ .replace(":total", total + "");
156
+
157
+ // compute the available space (non-zero) for the bar
158
+ const availableSpace = Math.max(
159
+ 0,
160
+ this.ttyColumns - stripAnsiCode(str.replace(":bar", "")).length,
161
+ );
162
+
163
+ const width = Math.min(this.width, availableSpace);
164
+
165
+ const preciseBar = options.preciseBar ?? this.preciseBar;
166
+ const precision = preciseBar.length > 1;
167
+
168
+ // :bar
169
+ const completeLength = (width * completed) / total;
170
+ const roundedCompleteLength = Math.floor(completeLength);
171
+
172
+ let precise = "";
173
+ if (precision) {
174
+ const preciseLength = completeLength - roundedCompleteLength;
175
+ precise = end
176
+ ? ""
177
+ : preciseBar[Math.floor(preciseBar.length * preciseLength)];
178
+ }
179
+
180
+ const complete = new Array(roundedCompleteLength)
181
+ .fill(options.complete ?? this.complete)
182
+ .join("");
183
+ const incomplete = new Array(
184
+ Math.max(width - roundedCompleteLength - (precision ? 1 : 0), 0),
185
+ )
186
+ .fill(options.incomplete ?? this.incomplete)
187
+ .join("");
188
+
189
+ str = str.replace(":bar", complete + precise + incomplete);
190
+
191
+ if (str !== this.lastStr) {
192
+ const strLen = stripAnsiCode(str).length;
193
+ if (strLen < this.lastStrLen) {
194
+ str += " ".repeat(this.lastStrLen - strLen);
195
+ }
196
+ await this.write(str);
197
+ this.lastStr = str;
198
+ this.lastStrLen = strLen;
199
+ }
200
+
201
+ if (end) await this.end();
202
+ }
203
+
204
+ /**
205
+ * end: end a progress bar.
206
+ * No need to call in most cases, unless you want to end before 100%
207
+ */
208
+ async end(): Promise<void> {
209
+ if (this.#end) return;
210
+ this.#end = true;
211
+ if (this.clear) {
212
+ await this.stdoutWrite("\r");
213
+ await this.clearLine();
214
+ } else {
215
+ await this.breakLine();
216
+ }
217
+ await this.showCursor();
218
+ // this.writer.releaseLock();
219
+ }
220
+
221
+ /**
222
+ * interrupt the progress bar and write a message above it
223
+ *
224
+ * @param message The message to write
225
+ */
226
+ async console(message: string | number): Promise<void> {
227
+ await this.clearLine();
228
+ await this.write(`${message}`);
229
+ await this.breakLine();
230
+ await this.write(this.lastStr);
231
+ }
232
+
233
+ private write(msg: string): Promise<void> {
234
+ return this.stdoutWrite(`\r${msg}\x1b[?25l`);
235
+ }
236
+
237
+ private get ttyColumns(): number {
238
+ if (!dntShim.Deno.stdout.isTerminal()) return 100;
239
+ return dntShim.Deno.consoleSize().columns;
240
+ }
241
+
242
+ private breakLine(): Promise<void> {
243
+ return this.stdoutWrite("\n");
244
+ }
245
+
246
+ private stdoutWrite(msg: string): Promise<void> {
247
+ // return this.writer.write(this.encoder.encode(msg));
248
+ return writeAll(this.writer, this.encoder.encode(msg))
249
+ }
250
+
251
+ private clearLine(direction: Direction = Direction.all): Promise<void> {
252
+ switch (direction) {
253
+ case Direction.all:
254
+ return this.stdoutWrite("\x1b[2K");
255
+ case Direction.left:
256
+ return this.stdoutWrite("\x1b[1K");
257
+ case Direction.right:
258
+ return this.stdoutWrite("\x1b[0K");
259
+ }
260
+ }
261
+
262
+ private showCursor(): Promise<void> {
263
+ return this.stdoutWrite("\x1b[?25h");
264
+ }
265
+ }
@@ -0,0 +1,250 @@
1
+ import * as dntShim from "../../../../../_dnt.shims.js";
2
+ import { bgGreen, bgWhite, stripAnsiCode } from "./deps.js";
3
+ import { writeAll } from "./deps.js";
4
+ // import type { Writer } from "./deps.ts";
5
+ import { prettyTime, type prettyTimeOptions } from "./time.js";
6
+
7
+ const isTerminal = dntShim.Deno.stdout.isTerminal;
8
+
9
+ interface constructorOptions {
10
+ title?: string;
11
+ width?: number;
12
+ complete?: string;
13
+ incomplete?: string;
14
+ clear?: boolean;
15
+ interval?: number;
16
+ display?: string;
17
+ prettyTime?: boolean;
18
+ output?: typeof dntShim.Deno.stdout | typeof dntShim.Deno.stderr;
19
+ }
20
+
21
+ interface renderOptions {
22
+ completed: number;
23
+ text?: string;
24
+ total?: number;
25
+ complete?: string;
26
+ incomplete?: string;
27
+ prettyTimeOptions?: prettyTimeOptions;
28
+ }
29
+
30
+ interface bar {
31
+ str: string;
32
+ strLen?: number;
33
+ end?: boolean;
34
+ }
35
+
36
+ /**
37
+ * MultiProgressBar multiple progress bars.
38
+ */
39
+ export class MultiProgressBar {
40
+ width: number;
41
+ complete: string;
42
+ incomplete: string;
43
+ clear: boolean;
44
+ interval: number;
45
+ display: string;
46
+ prettyTime: boolean;
47
+
48
+ #end = false;
49
+ #startIndex = 0;
50
+ #lastRows = 0;
51
+ #bars: bar[] = [];
52
+ private lastStr = "";
53
+ private start = Date.now();
54
+ private lastRenderTime = 0;
55
+ private encoder = new TextEncoder();
56
+ // private writer: WritableStreamDefaultWriter<Uint8Array>;
57
+ // private writer: Writer;
58
+ private writer: typeof dntShim.Deno.stdout | typeof dntShim.Deno.stderr;
59
+
60
+ /**
61
+ * Title, total, complete, incomplete, can also be set or changed in the render method
62
+ *
63
+ * - title Progress bar title, default: ''
64
+ * - width the displayed width of the progress, default: 50
65
+ * - complete completion character, default: colors.bgGreen(' '), can use any string
66
+ * - incomplete incomplete character, default: colors.bgWhite(' '), can use any string
67
+ * - clear clear the bar on completion, default: false
68
+ * - interval minimum time between updates in milliseconds, default: 16
69
+ * - display What is displayed and display order, default: ':bar :text :percent :time :completed/:total'
70
+ * - prettyTime Whether to pretty print time and eta
71
+ * - output Output stream, can be Deno.stdout or Deno.stderr, default is Deno.stdout
72
+ */
73
+ constructor({
74
+ title = "",
75
+ width = 50,
76
+ complete = bgGreen(" "),
77
+ incomplete = bgWhite(" "),
78
+ clear = false,
79
+ interval,
80
+ display,
81
+ prettyTime = false,
82
+ output = dntShim.Deno.stdout,
83
+ }: constructorOptions = {}) {
84
+ if (title != "") {
85
+ this.#bars.push({ str: title });
86
+ this.#startIndex = 1;
87
+ }
88
+ this.width = width;
89
+ this.complete = complete;
90
+ this.incomplete = incomplete;
91
+ this.clear = clear;
92
+ this.interval = interval ?? 16;
93
+ this.display = display ?? ":bar :text :percent :time :completed/:total";
94
+ this.prettyTime = prettyTime;
95
+ // this.writer = output.writable.getWriter();
96
+ this.writer = output;
97
+ }
98
+
99
+ /**
100
+ * "render" the progress bar
101
+ *
102
+ * - `bars` progress bars
103
+ * - `completed` completed value
104
+ * - `total` optional, total number of ticks to complete, default: 100
105
+ * - `text` optional, text displayed per ProgressBar, default: ''
106
+ * - `complete` - optional, completion character
107
+ * - `incomplete` - optional, incomplete character
108
+ * - `prettyTimeOptions` - prettyTime options
109
+ */
110
+ async render(bars: Array<renderOptions>): Promise<void> {
111
+ if (this.#end || !isTerminal) return;
112
+
113
+ const now = Date.now();
114
+ const ms = now - this.lastRenderTime;
115
+ this.lastRenderTime = now;
116
+ let end = true;
117
+ let index = this.#startIndex;
118
+
119
+ for (const { completed, total = 100, text = "", ...options } of bars) {
120
+ if (completed < 0) {
121
+ throw new Error(`completed must greater than or equal to 0`);
122
+ }
123
+ if (!Number.isInteger(total)) throw new Error(`total must be 'number'`);
124
+ if (this.#bars[index] && this.#bars[index].end) {
125
+ index++;
126
+ continue;
127
+ }
128
+ end = false;
129
+ const percent = ((completed / total) * 100).toFixed(2) + "%";
130
+ const time = this.prettyTime
131
+ ? prettyTime(now - this.start, options.prettyTimeOptions)
132
+ : ((now - this.start) / 1000).toFixed(1) + "s";
133
+ const msEta = completed >= total
134
+ ? 0
135
+ : (total / completed - 1) * (now - this.start);
136
+ const eta = completed == 0
137
+ ? "-"
138
+ : this.prettyTime
139
+ ? prettyTime(msEta, options.prettyTimeOptions)
140
+ : (msEta / 1000).toFixed(1) + "s";
141
+
142
+ // :bar :text :percent :time :completed/:total
143
+ let str = this.display
144
+ .replace(":text", text)
145
+ .replace(":time", time)
146
+ .replace(":eta", eta)
147
+ .replace(":percent", percent)
148
+ .replace(":completed", completed + "")
149
+ .replace(":total", total + "");
150
+
151
+ // compute the available space (non-zero) for the bar
152
+ const availableSpace = Math.max(
153
+ 0,
154
+ this.ttyColumns - stripAnsiCode(str.replace(":bar", "")).length,
155
+ );
156
+
157
+ const width = Math.min(this.width, availableSpace);
158
+ // :bar
159
+ const completeLength = Math.round((width * completed) / total);
160
+ const complete = new Array(completeLength)
161
+ .fill(options.complete ?? this.complete)
162
+ .join("");
163
+ const incomplete = new Array(width - completeLength)
164
+ .fill(options.incomplete ?? this.incomplete)
165
+ .join("");
166
+
167
+ str = str.replace(":bar", complete + incomplete);
168
+ const strLen = stripAnsiCode(str).length;
169
+ if (this.#bars[index] && str != this.#bars[index].str) {
170
+ const lastStrLen = this.#bars[index].strLen!;
171
+ if (strLen < lastStrLen) {
172
+ str += " ".repeat(lastStrLen - strLen);
173
+ }
174
+ }
175
+
176
+ this.#bars[index++] = {
177
+ str,
178
+ strLen,
179
+ end: completed >= total,
180
+ };
181
+ }
182
+ if (ms < this.interval && !end) return;
183
+ const str = this.#bars.map((v) => v.str).join("\n");
184
+
185
+ if (str !== this.lastStr) {
186
+ await this.resetScreen();
187
+ await this.write(str);
188
+ this.lastStr = str;
189
+ this.#lastRows = this.#bars.length;
190
+ }
191
+
192
+ if (end) await this.end();
193
+ }
194
+
195
+ /**
196
+ * end: end a progress bar.
197
+ * No need to call in most cases, unless you want to end before 100%
198
+ */
199
+ async end(): Promise<void> {
200
+ if (this.#end) return;
201
+ this.#end = true;
202
+ if (this.clear) {
203
+ await this.resetScreen();
204
+ } else {
205
+ await this.breakLine();
206
+ }
207
+ await this.showCursor();
208
+ // this.writer.releaseLock();
209
+ }
210
+
211
+ /**
212
+ * interrupt the progress bar and write a message above it
213
+ *
214
+ * @param message The message to write
215
+ */
216
+ async console(message: string | number): Promise<void> {
217
+ await this.resetScreen();
218
+ await this.write(`${message}`);
219
+ await this.breakLine();
220
+ await this.write(this.lastStr);
221
+ }
222
+
223
+ private write(msg: string): Promise<void> {
224
+ return this.stdoutWrite(`${msg}\x1b[?25l`);
225
+ }
226
+
227
+ private async resetScreen(): Promise<void> {
228
+ if (this.#lastRows > 0) {
229
+ await this.stdoutWrite("\x1b[" + (this.#lastRows - 1) + "A\r\x1b[?0J");
230
+ }
231
+ }
232
+
233
+ private get ttyColumns(): number {
234
+ if (!dntShim.Deno.stdout.isTerminal()) return 100;
235
+ return dntShim.Deno.consoleSize().columns;
236
+ }
237
+
238
+ private breakLine(): Promise<void> {
239
+ return this.stdoutWrite("\n");
240
+ }
241
+
242
+ private stdoutWrite(msg: string): Promise<void> {
243
+ // return this.writer.write(this.encoder.encode(msg));
244
+ return writeAll(this.writer, this.encoder.encode(msg))
245
+ }
246
+
247
+ private showCursor(): Promise<void> {
248
+ return this.stdoutWrite("\x1b[?25h");
249
+ }
250
+ }
@@ -0,0 +1,69 @@
1
+ /**
2
+ * prettyTime options
3
+ * - withSpaces Whether to use spaces to separate times, `1d2h3m5s` or `1d 2h 3m 5s`, default false
4
+ * - toFixedVal value pass to toFixed for seconds, default 1
5
+ * - longFormat Whether to use a long format, default false, `1d2h3m5s` or `1days 2hours 3minutes 5seconds`
6
+ */
7
+ export interface prettyTimeOptions {
8
+ withSpaces?: boolean;
9
+ toFixedVal?: number;
10
+ longFormat?: boolean;
11
+ }
12
+
13
+ /**
14
+ * Convert time duration to a human readable string: 5d1h20m30s
15
+ *
16
+ * - milliseconds The number to format, unit milliseconds
17
+ */
18
+ export function prettyTime(
19
+ milliseconds: number,
20
+ options: prettyTimeOptions = {
21
+ withSpaces: false,
22
+ toFixedVal: 1,
23
+ longFormat: false,
24
+ },
25
+ ): string {
26
+ let second = milliseconds / 1000;
27
+ if (second < 60) {
28
+ return unitToString(second, 0, options);
29
+ }
30
+ let minute = Math.floor(second / 60);
31
+ second %= 60;
32
+ if (minute < 60) {
33
+ return unitToString(minute, 1, options) + unitToString(second, 0, options);
34
+ }
35
+ let hour = Math.floor(minute / 60);
36
+ minute %= 60;
37
+ if (hour < 24) {
38
+ return (
39
+ unitToString(hour, 2, options) +
40
+ unitToString(minute, 1, options) +
41
+ unitToString(second, 0, options)
42
+ );
43
+ }
44
+ const day = Math.floor(hour / 24);
45
+ hour %= 24;
46
+ return (
47
+ unitToString(day, 3, options) +
48
+ unitToString(hour, 2, options) +
49
+ unitToString(minute, 1, options) +
50
+ unitToString(second, 0, options)
51
+ );
52
+ }
53
+
54
+ function unitToString(
55
+ val: number,
56
+ i: number,
57
+ { withSpaces = false, toFixedVal = 1, longFormat = false }: prettyTimeOptions,
58
+ ): string {
59
+ const units = longFormat
60
+ ? ["second", "minute", "hour", "day"]
61
+ : ["s", "m", "h", "d"];
62
+ const unit = longFormat && (val >= 2 || (val > 1 && toFixedVal > 0))
63
+ ? units[i] + "s"
64
+ : units[i];
65
+ if (i == 0) {
66
+ return val.toFixed(toFixedVal) + unit;
67
+ }
68
+ return val + (withSpaces ? unit + " " : unit);
69
+ }