@socketsecurity/lib 1.3.5 → 2.1.0

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 (291) hide show
  1. package/CHANGELOG.md +84 -0
  2. package/dist/agent.js +1 -1
  3. package/dist/agent.js.map +2 -2
  4. package/dist/bin.js +1 -1
  5. package/dist/bin.js.map +3 -3
  6. package/dist/cacache.d.ts +4 -0
  7. package/dist/cacache.js +1 -1
  8. package/dist/cacache.js.map +3 -3
  9. package/dist/constants/packages.js +1 -1
  10. package/dist/constants/packages.js.map +3 -3
  11. package/dist/debug.d.ts +0 -7
  12. package/dist/debug.js +2 -2
  13. package/dist/debug.js.map +3 -3
  14. package/dist/dlx-binary.js +1 -1
  15. package/dist/dlx-binary.js.map +3 -3
  16. package/dist/dlx-package.d.ts +51 -0
  17. package/dist/dlx-package.js +1 -1
  18. package/dist/dlx-package.js.map +3 -3
  19. package/dist/dlx.d.ts +15 -0
  20. package/dist/dlx.js +1 -1
  21. package/dist/dlx.js.map +3 -3
  22. package/dist/effects/text-shimmer.js +1 -1
  23. package/dist/effects/text-shimmer.js.map +2 -2
  24. package/dist/env/ci.d.ts +1 -1
  25. package/dist/env/ci.js +1 -1
  26. package/dist/env/ci.js.map +3 -3
  27. package/dist/env/debug.d.ts +1 -1
  28. package/dist/env/debug.js +1 -1
  29. package/dist/env/debug.js.map +3 -3
  30. package/dist/env/github.d.ts +40 -0
  31. package/dist/env/github.js +3 -0
  32. package/dist/env/github.js.map +7 -0
  33. package/dist/env/home.d.ts +1 -1
  34. package/dist/env/home.js +1 -1
  35. package/dist/env/home.js.map +3 -3
  36. package/dist/env/locale.d.ts +15 -0
  37. package/dist/env/locale.js +3 -0
  38. package/dist/env/locale.js.map +7 -0
  39. package/dist/env/node-auth-token.d.ts +1 -1
  40. package/dist/env/node-auth-token.js +1 -1
  41. package/dist/env/node-auth-token.js.map +3 -3
  42. package/dist/env/node-env.d.ts +1 -1
  43. package/dist/env/node-env.js +1 -1
  44. package/dist/env/node-env.js.map +3 -3
  45. package/dist/env/npm.d.ts +25 -0
  46. package/dist/env/npm.js +3 -0
  47. package/dist/env/npm.js.map +7 -0
  48. package/dist/env/package-manager.d.ts +58 -0
  49. package/dist/env/package-manager.js +3 -0
  50. package/dist/env/package-manager.js.map +7 -0
  51. package/dist/env/path.d.ts +1 -1
  52. package/dist/env/path.js +1 -1
  53. package/dist/env/path.js.map +3 -3
  54. package/dist/env/pre-commit.d.ts +1 -1
  55. package/dist/env/pre-commit.js +1 -1
  56. package/dist/env/pre-commit.js.map +3 -3
  57. package/dist/env/rewire.d.ts +106 -0
  58. package/dist/env/rewire.js +3 -0
  59. package/dist/env/rewire.js.map +7 -0
  60. package/dist/env/shell.d.ts +1 -1
  61. package/dist/env/shell.js +1 -1
  62. package/dist/env/shell.js.map +3 -3
  63. package/dist/env/socket-cli-shadow.d.ts +30 -0
  64. package/dist/env/socket-cli-shadow.js +3 -0
  65. package/dist/env/socket-cli-shadow.js.map +7 -0
  66. package/dist/env/socket-cli.d.ts +72 -0
  67. package/dist/env/socket-cli.js +3 -0
  68. package/dist/env/socket-cli.js.map +7 -0
  69. package/dist/env/socket.d.ts +75 -0
  70. package/dist/env/socket.js +3 -0
  71. package/dist/env/socket.js.map +7 -0
  72. package/dist/env/temp-dir.d.ts +15 -0
  73. package/dist/env/temp-dir.js +3 -0
  74. package/dist/env/temp-dir.js.map +7 -0
  75. package/dist/env/term.d.ts +1 -1
  76. package/dist/env/term.js +1 -1
  77. package/dist/env/term.js.map +3 -3
  78. package/dist/env/test.d.ts +15 -0
  79. package/dist/env/test.js +3 -0
  80. package/dist/env/test.js.map +7 -0
  81. package/dist/env/windows.d.ts +20 -0
  82. package/dist/env/windows.js +3 -0
  83. package/dist/env/windows.js.map +7 -0
  84. package/dist/env/xdg.d.ts +15 -0
  85. package/dist/env/xdg.js +3 -0
  86. package/dist/env/xdg.js.map +7 -0
  87. package/dist/fs.d.ts +7 -0
  88. package/dist/fs.js +3 -3
  89. package/dist/fs.js.map +3 -3
  90. package/dist/github.js +1 -1
  91. package/dist/github.js.map +3 -3
  92. package/dist/globs.js +1 -1
  93. package/dist/globs.js.map +2 -2
  94. package/dist/ipc.d.ts +1 -1
  95. package/dist/ipc.js +1 -1
  96. package/dist/ipc.js.map +3 -3
  97. package/dist/logger.d.ts +2 -1
  98. package/dist/logger.js +1 -1
  99. package/dist/logger.js.map +3 -3
  100. package/dist/packages/isolation.js +1 -1
  101. package/dist/packages/isolation.js.map +3 -3
  102. package/dist/packages/normalize.js +1 -1
  103. package/dist/packages/normalize.js.map +3 -3
  104. package/dist/packages/operations.js +1 -1
  105. package/dist/packages/operations.js.map +3 -3
  106. package/dist/path.d.ts +2 -2
  107. package/dist/path.js +1 -1
  108. package/dist/path.js.map +3 -3
  109. package/dist/paths/rewire.d.ts +71 -0
  110. package/dist/paths/rewire.js +3 -0
  111. package/dist/paths/rewire.js.map +7 -0
  112. package/dist/paths.d.ts +26 -0
  113. package/dist/paths.js +1 -1
  114. package/dist/paths.js.map +3 -3
  115. package/dist/spinner.js +1 -1
  116. package/dist/spinner.js.map +2 -2
  117. package/package.json +42 -225
  118. package/dist/env/appdata.d.ts +0 -1
  119. package/dist/env/appdata.js +0 -3
  120. package/dist/env/appdata.js.map +0 -7
  121. package/dist/env/comspec.d.ts +0 -1
  122. package/dist/env/comspec.js +0 -3
  123. package/dist/env/comspec.js.map +0 -7
  124. package/dist/env/getters.d.ts +0 -40
  125. package/dist/env/getters.js +0 -3
  126. package/dist/env/getters.js.map +0 -7
  127. package/dist/env/github-api-url.d.ts +0 -1
  128. package/dist/env/github-api-url.js +0 -3
  129. package/dist/env/github-api-url.js.map +0 -7
  130. package/dist/env/github-base-ref.d.ts +0 -1
  131. package/dist/env/github-base-ref.js +0 -3
  132. package/dist/env/github-base-ref.js.map +0 -7
  133. package/dist/env/github-ref-name.d.ts +0 -1
  134. package/dist/env/github-ref-name.js +0 -3
  135. package/dist/env/github-ref-name.js.map +0 -7
  136. package/dist/env/github-ref-type.d.ts +0 -1
  137. package/dist/env/github-ref-type.js +0 -3
  138. package/dist/env/github-ref-type.js.map +0 -7
  139. package/dist/env/github-repository.d.ts +0 -1
  140. package/dist/env/github-repository.js +0 -3
  141. package/dist/env/github-repository.js.map +0 -7
  142. package/dist/env/github-server-url.d.ts +0 -1
  143. package/dist/env/github-server-url.js +0 -3
  144. package/dist/env/github-server-url.js.map +0 -7
  145. package/dist/env/github-token.d.ts +0 -1
  146. package/dist/env/github-token.js +0 -3
  147. package/dist/env/github-token.js.map +0 -7
  148. package/dist/env/jest-worker-id.d.ts +0 -1
  149. package/dist/env/jest-worker-id.js +0 -3
  150. package/dist/env/jest-worker-id.js.map +0 -7
  151. package/dist/env/lang.d.ts +0 -1
  152. package/dist/env/lang.js +0 -3
  153. package/dist/env/lang.js.map +0 -7
  154. package/dist/env/lc-all.d.ts +0 -1
  155. package/dist/env/lc-all.js +0 -3
  156. package/dist/env/lc-all.js.map +0 -7
  157. package/dist/env/lc-messages.d.ts +0 -1
  158. package/dist/env/lc-messages.js +0 -3
  159. package/dist/env/lc-messages.js.map +0 -7
  160. package/dist/env/localappdata.d.ts +0 -1
  161. package/dist/env/localappdata.js +0 -3
  162. package/dist/env/localappdata.js.map +0 -7
  163. package/dist/env/npm-config-registry.d.ts +0 -1
  164. package/dist/env/npm-config-registry.js +0 -3
  165. package/dist/env/npm-config-registry.js.map +0 -7
  166. package/dist/env/npm-config-user-agent.d.ts +0 -1
  167. package/dist/env/npm-config-user-agent.js +0 -3
  168. package/dist/env/npm-config-user-agent.js.map +0 -7
  169. package/dist/env/npm-lifecycle-event.d.ts +0 -1
  170. package/dist/env/npm-lifecycle-event.js +0 -3
  171. package/dist/env/npm-lifecycle-event.js.map +0 -7
  172. package/dist/env/npm-registry.d.ts +0 -1
  173. package/dist/env/npm-registry.js +0 -3
  174. package/dist/env/npm-registry.js.map +0 -7
  175. package/dist/env/npm-token.d.ts +0 -1
  176. package/dist/env/npm-token.js +0 -3
  177. package/dist/env/npm-token.js.map +0 -7
  178. package/dist/env/socket-accept-risks.d.ts +0 -1
  179. package/dist/env/socket-accept-risks.js +0 -3
  180. package/dist/env/socket-accept-risks.js.map +0 -7
  181. package/dist/env/socket-api-base-url.d.ts +0 -1
  182. package/dist/env/socket-api-base-url.js +0 -3
  183. package/dist/env/socket-api-base-url.js.map +0 -7
  184. package/dist/env/socket-api-proxy.d.ts +0 -1
  185. package/dist/env/socket-api-proxy.js +0 -3
  186. package/dist/env/socket-api-proxy.js.map +0 -7
  187. package/dist/env/socket-api-timeout.d.ts +0 -1
  188. package/dist/env/socket-api-timeout.js +0 -3
  189. package/dist/env/socket-api-timeout.js.map +0 -7
  190. package/dist/env/socket-api-token.d.ts +0 -1
  191. package/dist/env/socket-api-token.js +0 -3
  192. package/dist/env/socket-api-token.js.map +0 -7
  193. package/dist/env/socket-cacache-dir.d.ts +0 -1
  194. package/dist/env/socket-cacache-dir.js +0 -3
  195. package/dist/env/socket-cacache-dir.js.map +0 -7
  196. package/dist/env/socket-cli-accept-risks.d.ts +0 -1
  197. package/dist/env/socket-cli-accept-risks.js +0 -3
  198. package/dist/env/socket-cli-accept-risks.js.map +0 -7
  199. package/dist/env/socket-cli-api-base-url.d.ts +0 -1
  200. package/dist/env/socket-cli-api-base-url.js +0 -3
  201. package/dist/env/socket-cli-api-base-url.js.map +0 -7
  202. package/dist/env/socket-cli-api-proxy.d.ts +0 -1
  203. package/dist/env/socket-cli-api-proxy.js +0 -3
  204. package/dist/env/socket-cli-api-proxy.js.map +0 -7
  205. package/dist/env/socket-cli-api-timeout.d.ts +0 -1
  206. package/dist/env/socket-cli-api-timeout.js +0 -3
  207. package/dist/env/socket-cli-api-timeout.js.map +0 -7
  208. package/dist/env/socket-cli-api-token.d.ts +0 -1
  209. package/dist/env/socket-cli-api-token.js +0 -3
  210. package/dist/env/socket-cli-api-token.js.map +0 -7
  211. package/dist/env/socket-cli-config.d.ts +0 -1
  212. package/dist/env/socket-cli-config.js +0 -3
  213. package/dist/env/socket-cli-config.js.map +0 -7
  214. package/dist/env/socket-cli-fix.d.ts +0 -1
  215. package/dist/env/socket-cli-fix.js +0 -3
  216. package/dist/env/socket-cli-fix.js.map +0 -7
  217. package/dist/env/socket-cli-no-api-token.d.ts +0 -1
  218. package/dist/env/socket-cli-no-api-token.js +0 -3
  219. package/dist/env/socket-cli-no-api-token.js.map +0 -7
  220. package/dist/env/socket-cli-optimize.d.ts +0 -1
  221. package/dist/env/socket-cli-optimize.js +0 -3
  222. package/dist/env/socket-cli-optimize.js.map +0 -7
  223. package/dist/env/socket-cli-org-slug.d.ts +0 -1
  224. package/dist/env/socket-cli-org-slug.js +0 -3
  225. package/dist/env/socket-cli-org-slug.js.map +0 -7
  226. package/dist/env/socket-cli-shadow-accept-risks.d.ts +0 -1
  227. package/dist/env/socket-cli-shadow-accept-risks.js +0 -3
  228. package/dist/env/socket-cli-shadow-accept-risks.js.map +0 -7
  229. package/dist/env/socket-cli-shadow-api-token.d.ts +0 -1
  230. package/dist/env/socket-cli-shadow-api-token.js +0 -3
  231. package/dist/env/socket-cli-shadow-api-token.js.map +0 -7
  232. package/dist/env/socket-cli-shadow-bin.d.ts +0 -1
  233. package/dist/env/socket-cli-shadow-bin.js +0 -3
  234. package/dist/env/socket-cli-shadow-bin.js.map +0 -7
  235. package/dist/env/socket-cli-shadow-progress.d.ts +0 -1
  236. package/dist/env/socket-cli-shadow-progress.js +0 -3
  237. package/dist/env/socket-cli-shadow-progress.js.map +0 -7
  238. package/dist/env/socket-cli-shadow-silent.d.ts +0 -1
  239. package/dist/env/socket-cli-shadow-silent.js +0 -3
  240. package/dist/env/socket-cli-shadow-silent.js.map +0 -7
  241. package/dist/env/socket-cli-view-all-risks.d.ts +0 -1
  242. package/dist/env/socket-cli-view-all-risks.js +0 -3
  243. package/dist/env/socket-cli-view-all-risks.js.map +0 -7
  244. package/dist/env/socket-config.d.ts +0 -1
  245. package/dist/env/socket-config.js +0 -3
  246. package/dist/env/socket-config.js.map +0 -7
  247. package/dist/env/socket-debug.d.ts +0 -1
  248. package/dist/env/socket-debug.js +0 -3
  249. package/dist/env/socket-debug.js.map +0 -7
  250. package/dist/env/socket-home.d.ts +0 -1
  251. package/dist/env/socket-home.js +0 -3
  252. package/dist/env/socket-home.js.map +0 -7
  253. package/dist/env/socket-no-api-token.d.ts +0 -1
  254. package/dist/env/socket-no-api-token.js +0 -3
  255. package/dist/env/socket-no-api-token.js.map +0 -7
  256. package/dist/env/socket-npm-registry.d.ts +0 -1
  257. package/dist/env/socket-npm-registry.js +0 -3
  258. package/dist/env/socket-npm-registry.js.map +0 -7
  259. package/dist/env/socket-org-slug.d.ts +0 -1
  260. package/dist/env/socket-org-slug.js +0 -3
  261. package/dist/env/socket-org-slug.js.map +0 -7
  262. package/dist/env/socket-registry-url.d.ts +0 -1
  263. package/dist/env/socket-registry-url.js +0 -3
  264. package/dist/env/socket-registry-url.js.map +0 -7
  265. package/dist/env/socket-view-all-risks.d.ts +0 -1
  266. package/dist/env/socket-view-all-risks.js +0 -3
  267. package/dist/env/socket-view-all-risks.js.map +0 -7
  268. package/dist/env/temp.d.ts +0 -1
  269. package/dist/env/temp.js +0 -3
  270. package/dist/env/temp.js.map +0 -7
  271. package/dist/env/tmp.d.ts +0 -1
  272. package/dist/env/tmp.js +0 -3
  273. package/dist/env/tmp.js.map +0 -7
  274. package/dist/env/tmpdir.d.ts +0 -1
  275. package/dist/env/tmpdir.js +0 -3
  276. package/dist/env/tmpdir.js.map +0 -7
  277. package/dist/env/userprofile.d.ts +0 -1
  278. package/dist/env/userprofile.js +0 -3
  279. package/dist/env/userprofile.js.map +0 -7
  280. package/dist/env/vitest.d.ts +0 -1
  281. package/dist/env/vitest.js +0 -3
  282. package/dist/env/vitest.js.map +0 -7
  283. package/dist/env/xdg-cache-home.d.ts +0 -1
  284. package/dist/env/xdg-cache-home.js +0 -3
  285. package/dist/env/xdg-cache-home.js.map +0 -7
  286. package/dist/env/xdg-config-home.d.ts +0 -1
  287. package/dist/env/xdg-config-home.js +0 -3
  288. package/dist/env/xdg-config-home.js.map +0 -7
  289. package/dist/env/xdg-data-home.d.ts +0 -1
  290. package/dist/env/xdg-data-home.js +0 -3
  291. package/dist/env/xdg-data-home.js.map +0 -7
package/dist/debug.d.ts CHANGED
@@ -18,17 +18,14 @@ export type { DebugOptions, NamespacesOrOptions, InspectOptions };
18
18
  /**
19
19
  * Debug output for object inspection with caller info.
20
20
  */
21
- /*@__NO_SIDE_EFFECTS__*/
22
21
  declare function debugDirNs(namespacesOrOpts: NamespacesOrOptions, obj: unknown, inspectOpts?: InspectOptions | undefined): void;
23
22
  /**
24
23
  * Debug output with caller info.
25
24
  */
26
- /*@__NO_SIDE_EFFECTS__*/
27
25
  declare function debugNs(namespacesOrOpts: NamespacesOrOptions, ...args: unknown[]): void;
28
26
  /**
29
27
  * Debug logging function with caller info.
30
28
  */
31
- /*@__NO_SIDE_EFFECTS__*/
32
29
  declare function debugLogNs(namespacesOrOpts: NamespacesOrOptions, ...args: unknown[]): void;
33
30
  /**
34
31
  * Debug output for cache operations with caller info.
@@ -36,7 +33,6 @@ declare function debugLogNs(namespacesOrOpts: NamespacesOrOptions, ...args: unkn
36
33
  * Second argument is the cache key or message.
37
34
  * Optional third argument is metadata object.
38
35
  */
39
- /*@__NO_SIDE_EFFECTS__*/
40
36
  declare function debugCacheNs(namespacesOrOpts: NamespacesOrOptions, operation: string, key: string, meta?: unknown | undefined): void;
41
37
  /**
42
38
  * Cache debug function with caller info.
@@ -51,17 +47,14 @@ declare function isDebugNs(namespaces: string | undefined): boolean;
51
47
  /**
52
48
  * Debug output with caller info (wrapper for debugNs with default namespace).
53
49
  */
54
- /*@__NO_SIDE_EFFECTS__*/
55
50
  declare function debug(...args: unknown[]): void;
56
51
  /**
57
52
  * Debug output for object inspection (wrapper for debugDirNs with default namespace).
58
53
  */
59
- /*@__NO_SIDE_EFFECTS__*/
60
54
  declare function debugDir(obj: unknown, inspectOpts?: InspectOptions | undefined): void;
61
55
  /**
62
56
  * Debug logging function (wrapper for debugLogNs with default namespace).
63
57
  */
64
- /*@__NO_SIDE_EFFECTS__*/
65
58
  declare function debugLog(...args: unknown[]): void;
66
59
  /**
67
60
  * Check if debug mode is enabled.
package/dist/debug.js CHANGED
@@ -1,4 +1,4 @@
1
1
  /* Socket Lib - Built with esbuild */
2
- var A=Object.create;var h=Object.defineProperty;var G=Object.getOwnPropertyDescriptor;var j=Object.getOwnPropertyNames;var T=Object.getPrototypeOf,L=Object.prototype.hasOwnProperty;var W=(n,t)=>{for(var e in t)h(n,e,{get:t[e],enumerable:!0})},S=(n,t,e,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of j(t))!L.call(n,o)&&o!==e&&h(n,o,{get:()=>t[o],enumerable:!(i=G(t,o))||i.enumerable});return n};var I=(n,t,e)=>(e=n!=null?A(T(n)):{},S(t||!n||!n.__esModule?h(e,"default",{value:n,enumerable:!0}):e,n)),J=n=>S(h({},"__esModule",{value:!0}),n);var Y={};W(Y,{debug:()=>P,debugCache:()=>K,debugCacheNs:()=>q,debugDir:()=>z,debugDirNs:()=>H,debugLog:()=>F,debugLogNs:()=>v,debugNs:()=>U,debuglog:()=>V,debugtime:()=>X,isDebug:()=>Q,isDebugNs:()=>M});module.exports=J(Y);var m=require("#constants/process"),C=require("#env/debug"),a=require("#env/socket-debug"),g=I(require("./external/@socketregistry/is-unicode-supported")),f=I(require("./external/debug")),d=require("./logger"),B=require("./objects"),k=require("./strings");const $=Reflect.apply,E=new Map;function _(n){let t=E.get(n);return t||(!C.DEBUG&&a.SOCKET_DEBUG&&(n==="error"||n==="notice")&&f.default.enable(n),t=(0,f.default)(n),t.log=R,E.set(n,t),t)}let D;function N(){return D===void 0&&(D=require("node:util")),D}function b(n=3){let t="";const e=Error.captureStackTrace;if(typeof e=="function"){const i={};e(i,b);const o=i.stack;if(typeof o=="string"){let u=0,c=0;for(let s=0,{length:l}=o;s<l;s+=1)if(o[s]===`
3
- `)if(u+=1,u<n)c=s+1;else{const r=o.slice(c,s).trimStart(),w=/(?<=^at\s+).*?(?=\s+\(|$)/.exec(r)?.[0];if(w&&(t=w.replace(/^(?:async|bound|get|new|set)\s+/,""),t.startsWith("Object."))){const x=t.slice(7);(0,B.hasOwn)(Object,x)||(t=x)}break}}}return t}function R(...n){const t=N(),e=f.default.inspectOpts?{...f.default.inspectOpts,showHidden:f.default.inspectOpts.showHidden===null?void 0:f.default.inspectOpts.showHidden,depth:f.default.inspectOpts.depth===null||typeof f.default.inspectOpts.depth=="boolean"?void 0:f.default.inspectOpts.depth}:{};$(d.logger.info,d.logger,[t.formatWithOptions(e,...n)])}function y(n){return n!==null&&typeof n=="object"?{__proto__:null,...n}:{__proto__:null,namespaces:n}}function O(n){if(!a.SOCKET_DEBUG)return!1;if(typeof n!="string"||!n||n==="*")return!0;const t=n.trim().replace(/\s+/g,",").split(",").filter(Boolean),e=[],i=[];for(const o of t)o.startsWith("-")?i.push(o.slice(1)):e.push(o);return e.length&&!e.some(o=>_(o).enabled)?!1:i.every(o=>!_(o).enabled)}function H(n,t,e){const i=y(n),{namespaces:o}=i;if(!O(o))return;const u=b(4)||"anonymous";p===void 0&&(p=(0,g.default)()?"\u25B8":">");let c=e;if(c===void 0){const r=f.default.inspectOpts;r&&(c={...r,showHidden:r.showHidden===null?void 0:r.showHidden,depth:r.depth===null||typeof r.depth=="boolean"?null:r.depth})}const s=i.spinner||(0,m.getSpinner)(),l=s?.isSpinning;s?.stop(),d.logger.info(`[DEBUG] ${u} ${p} object inspection:`),d.logger.dir(t,e),l&&s?.start()}let p;function U(n,...t){const e=y(n),{namespaces:i}=e;if(!O(i))return;const o=b(4)||"anonymous";p===void 0&&(p=(0,g.default)()?"\u25B8":">");const u=t.at(0),c=typeof u=="string"?[(0,k.applyLinePrefix)(`${o?`${o} ${p} `:""}${u}`,{prefix:"[DEBUG] "}),...t.slice(1)]:t,s=e.spinner||(0,m.getSpinner)(),l=s?.isSpinning;s?.stop(),$(d.logger.info,d.logger,c),l&&s?.start()}function v(n,...t){const e=y(n),{namespaces:i}=e;if(!O(i))return;const o=b(4)||"anonymous";p===void 0&&(p=(0,g.default)()?"\u25B8":">");const u=t.at(0),c=typeof u=="string"?[(0,k.applyLinePrefix)(`${o?`${o} ${p} `:""}${u}`,{prefix:"[DEBUG] "}),...t.slice(1)]:[`[DEBUG] ${o} ${p}`,...t],s=e.spinner||(0,m.getSpinner)(),l=s?.isSpinning;s?.stop(),$(d.logger.info,d.logger,c),l&&s?.start()}function q(n,t,e,i){const o=y(n),{namespaces:u}=o;if(!O(u))return;const c=b(4)||"cache";p===void 0&&(p=(0,g.default)()?"\u25B8":">");const s=`[CACHE] ${c} ${p} ${t}: ${e}`,l=i!==void 0?[s,i]:[s],r=o.spinner||(0,m.getSpinner)(),w=r?.isSpinning;r?.stop(),$(d.logger.info,d.logger,l),w&&r?.start()}function K(n,t,e){if(!a.SOCKET_DEBUG)return;const i=b(3)||"cache";p===void 0&&(p=(0,g.default)()?"\u25B8":">");const o=`[CACHE] ${i} ${p} ${n}: ${t}`;console.log(...e!==void 0?[o,e]:[o])}function M(n){return!!a.SOCKET_DEBUG&&O(n)}function P(...n){[...n]}function z(n,t){}function F(...n){[...n]}function Q(){return!!a.SOCKET_DEBUG}function V(n){return N().debuglog(n)}function X(n){const t=N();let e;const i=()=>{if(e===void 0)e=Date.now();else{const o=Date.now()-e;t.debuglog("time")(`${n}: ${o}ms`),e=void 0}};return i.start=()=>{e=Date.now()},i.end=()=>{if(e!==void 0){const o=Date.now()-e;t.debuglog("time")(`${n}: ${o}ms`),e=void 0}},i}0&&(module.exports={debug,debugCache,debugCacheNs,debugDir,debugDirNs,debugLog,debugLogNs,debugNs,debuglog,debugtime,isDebug,isDebugNs});
2
+ var U=Object.create;var h=Object.defineProperty;var j=Object.getOwnPropertyDescriptor;var G=Object.getOwnPropertyNames;var L=Object.getPrototypeOf,T=Object.prototype.hasOwnProperty;var W=(n,t)=>{for(var e in t)h(n,e,{get:t[e],enumerable:!0})},S=(n,t,e,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of G(t))!T.call(n,o)&&o!==e&&h(n,o,{get:()=>t[o],enumerable:!(i=j(t,o))||i.enumerable});return n};var I=(n,t,e)=>(e=n!=null?U(L(n)):{},S(t||!n||!n.__esModule?h(e,"default",{value:n,enumerable:!0}):e,n)),J=n=>S(h({},"__esModule",{value:!0}),n);var Y={};W(Y,{debug:()=>z,debugCache:()=>M,debugCacheNs:()=>q,debugDir:()=>F,debugDirNs:()=>v,debugLog:()=>K,debugLogNs:()=>B,debugNs:()=>A,debuglog:()=>V,debugtime:()=>X,isDebug:()=>Q,isDebugNs:()=>P});module.exports=J(Y);var m=require("#constants/process"),E=require("#env/debug"),a=require("#env/socket"),g=I(require("./external/@socketregistry/is-unicode-supported")),f=I(require("./external/debug")),d=require("./logger"),H=require("./objects"),D=require("./strings");const $=Reflect.apply,_=new Map;function C(n){let t=_.get(n);return t||(!(0,E.getDebug)()&&(0,a.getSocketDebug)()&&(n==="error"||n==="notice")&&f.default.enable(n),t=(0,f.default)(n),t.log=R,_.set(n,t),t)}let x;function N(){return x===void 0&&(x=require("node:util")),x}function b(n=3){let t="";const e=Error.captureStackTrace;if(typeof e=="function"){const i={};e(i,b);const o=i.stack;if(typeof o=="string"){let u=0,c=0;for(let s=0,{length:l}=o;s<l;s+=1)if(o[s]===`
3
+ `)if(u+=1,u<n)c=s+1;else{const r=o.slice(c,s).trimStart(),w=/(?<=^at\s+).*?(?=\s+\(|$)/.exec(r)?.[0];if(w&&(t=w.replace(/^(?:async|bound|get|new|set)\s+/,""),t.startsWith("Object."))){const k=t.slice(7);(0,H.hasOwn)(Object,k)||(t=k)}break}}}return t}function R(...n){const t=N(),e=f.default.inspectOpts?{...f.default.inspectOpts,showHidden:f.default.inspectOpts.showHidden===null?void 0:f.default.inspectOpts.showHidden,depth:f.default.inspectOpts.depth===null||typeof f.default.inspectOpts.depth=="boolean"?void 0:f.default.inspectOpts.depth}:{};$(d.logger.info,d.logger,[t.formatWithOptions(e,...n)])}function y(n){return n!==null&&typeof n=="object"?{__proto__:null,...n}:{__proto__:null,namespaces:n}}function O(n){if(!(0,a.getSocketDebug)())return!1;if(typeof n!="string"||!n||n==="*")return!0;const t=n.trim().replace(/\s+/g,",").split(",").filter(Boolean),e=[],i=[];for(const o of t)o.startsWith("-")?i.push(o.slice(1)):e.push(o);return e.length&&!e.some(o=>C(o).enabled)?!1:i.every(o=>!C(o).enabled)}function v(n,t,e){const i=y(n),{namespaces:o}=i;if(!O(o))return;const u=b(4)||"anonymous";p===void 0&&(p=(0,g.default)()?"\u25B8":">");let c=e;if(c===void 0){const r=f.default.inspectOpts;r&&(c={...r,showHidden:r.showHidden===null?void 0:r.showHidden,depth:r.depth===null||typeof r.depth=="boolean"?null:r.depth})}const s=i.spinner||(0,m.getSpinner)(),l=s?.isSpinning;s?.stop(),d.logger.info(`[DEBUG] ${u} ${p} object inspection:`),d.logger.dir(t,e),l&&s?.start()}let p;function A(n,...t){const e=y(n),{namespaces:i}=e;if(!O(i))return;const o=b(4)||"anonymous";p===void 0&&(p=(0,g.default)()?"\u25B8":">");const u=t.at(0),c=typeof u=="string"?[(0,D.applyLinePrefix)(`${o?`${o} ${p} `:""}${u}`,{prefix:"[DEBUG] "}),...t.slice(1)]:t,s=e.spinner||(0,m.getSpinner)(),l=s?.isSpinning;s?.stop(),$(d.logger.info,d.logger,c),l&&s?.start()}function B(n,...t){const e=y(n),{namespaces:i}=e;if(!O(i))return;const o=b(4)||"anonymous";p===void 0&&(p=(0,g.default)()?"\u25B8":">");const u=t.at(0),c=typeof u=="string"?[(0,D.applyLinePrefix)(`${o?`${o} ${p} `:""}${u}`,{prefix:"[DEBUG] "}),...t.slice(1)]:[`[DEBUG] ${o} ${p}`,...t],s=e.spinner||(0,m.getSpinner)(),l=s?.isSpinning;s?.stop(),$(d.logger.info,d.logger,c),l&&s?.start()}function q(n,t,e,i){const o=y(n),{namespaces:u}=o;if(!O(u))return;const c=b(4)||"cache";p===void 0&&(p=(0,g.default)()?"\u25B8":">");const s=`[CACHE] ${c} ${p} ${t}: ${e}`,l=i!==void 0?[s,i]:[s],r=o.spinner||(0,m.getSpinner)(),w=r?.isSpinning;r?.stop(),$(d.logger.info,d.logger,l),w&&r?.start()}function M(n,t,e){if(!(0,a.getSocketDebug)())return;const i=b(3)||"cache";p===void 0&&(p=(0,g.default)()?"\u25B8":">");const o=`[CACHE] ${i} ${p} ${n}: ${t}`;console.log(...e!==void 0?[o,e]:[o])}function P(n){return!!(0,a.getSocketDebug)()&&O(n)}function z(...n){A("*",...n)}function F(n,t){v("*",n,t)}function K(...n){B("*",...n)}function Q(){return!!(0,a.getSocketDebug)()}function V(n){return N().debuglog(n)}function X(n){const t=N();let e;const i=()=>{if(e===void 0)e=Date.now();else{const o=Date.now()-e;t.debuglog("time")(`${n}: ${o}ms`),e=void 0}};return i.start=()=>{e=Date.now()},i.end=()=>{if(e!==void 0){const o=Date.now()-e;t.debuglog("time")(`${n}: ${o}ms`),e=void 0}},i}0&&(module.exports={debug,debugCache,debugCacheNs,debugDir,debugDirNs,debugLog,debugLogNs,debugNs,debuglog,debugtime,isDebug,isDebugNs});
4
4
  //# sourceMappingURL=debug.js.map
package/dist/debug.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/debug.ts"],
4
- "sourcesContent": ["/**\n * @fileoverview Debug logging utilities with lazy loading and environment-based control.\n * Provides Socket CLI specific debug functionality and logging formatters.\n */\n\nimport { getSpinner } from '#constants/process'\nimport { DEBUG } from '#env/debug'\nimport { SOCKET_DEBUG } from '#env/socket-debug'\nimport isUnicodeSupported from './external/@socketregistry/is-unicode-supported'\nimport debugJs from './external/debug'\n\nimport { logger } from './logger'\nimport { hasOwn } from './objects'\nimport { applyLinePrefix } from './strings'\n\n// IMPORTANT: Do not use destructuring here - use direct assignment instead.\n// tsgo has a bug that incorrectly transpiles destructured exports, resulting in\n// `exports.SomeName = void 0;` which causes runtime errors.\n// See: https://github.com/SocketDev/socket-packageurl-js/issues/3\nconst ReflectApply = Reflect.apply\n\n// Type definitions\ninterface DebugOptions {\n namespaces?: string\n spinner?: { isSpinning: boolean; stop(): void; start(): void }\n [key: string]: unknown\n}\n\ntype NamespacesOrOptions = string | DebugOptions\n\ninterface InspectOptions {\n depth?: number | null\n colors?: boolean\n [key: string]: unknown\n}\n\nexport type { DebugOptions, NamespacesOrOptions, InspectOptions }\n\nconst debugByNamespace = new Map()\n/**\n * Get or create a debug instance for a namespace.\n * @private\n */\n/*@__NO_SIDE_EFFECTS__*/\nfunction getDebugJsInstance(namespace: string) {\n let inst = debugByNamespace.get(namespace)\n if (inst) {\n return inst\n }\n if (\n !DEBUG &&\n SOCKET_DEBUG &&\n (namespace === 'error' || namespace === 'notice')\n ) {\n debugJs.enable(namespace)\n }\n inst = debugJs(namespace)\n inst.log = customLog\n debugByNamespace.set(namespace, inst)\n return inst\n}\n\nlet _util: typeof import('util') | undefined\n/**\n * Lazily load the util module.\n * @private\n */\n/*@__NO_SIDE_EFFECTS__*/\nfunction getUtil() {\n if (_util === undefined) {\n // Use non-'node:' prefixed require to avoid Webpack errors.\n\n _util = /*@__PURE__*/ require('node:util')\n }\n return _util as typeof import('util')\n}\n\n/**\n * Extract caller information from the stack trace.\n * @private\n */\n/*@__NO_SIDE_EFFECTS__*/\nfunction getCallerInfo(stackOffset: number = 3): string {\n let name = ''\n const captureStackTrace = Error.captureStackTrace\n if (typeof captureStackTrace === 'function') {\n const obj: { stack?: unknown } = {}\n captureStackTrace(obj, getCallerInfo)\n const stack = obj.stack\n if (typeof stack === 'string') {\n let lineCount = 0\n let lineStart = 0\n for (let i = 0, { length } = stack; i < length; i += 1) {\n if (stack[i] === '\\n') {\n lineCount += 1\n if (lineCount < stackOffset) {\n // Store the start index of the next line.\n lineStart = i + 1\n } else {\n // Extract the full line and trim it.\n const line = stack.slice(lineStart, i).trimStart()\n // Match the function name portion (e.g., \"async runFix\").\n const match = /(?<=^at\\s+).*?(?=\\s+\\(|$)/.exec(line)?.[0]\n if (match) {\n name = match\n // Strip known V8 invocation prefixes to get the name.\n .replace(/^(?:async|bound|get|new|set)\\s+/, '')\n if (name.startsWith('Object.')) {\n // Strip leading 'Object.' if not an own property of Object.\n const afterDot = name.slice(7 /*'Object.'.length*/)\n if (!hasOwn(Object, afterDot)) {\n name = afterDot\n }\n }\n }\n break\n }\n }\n }\n }\n }\n return name\n}\n\n/**\n * Custom log function for debug output.\n * @private\n */\n/*@__NO_SIDE_EFFECTS__*/\nfunction customLog(...args: unknown[]) {\n const util = getUtil()\n const inspectOpts = debugJs.inspectOpts\n ? {\n ...debugJs.inspectOpts,\n showHidden:\n debugJs.inspectOpts.showHidden === null\n ? undefined\n : debugJs.inspectOpts.showHidden,\n depth:\n debugJs.inspectOpts.depth === null ||\n typeof debugJs.inspectOpts.depth === 'boolean'\n ? undefined\n : debugJs.inspectOpts.depth,\n }\n : {}\n ReflectApply(logger.info, logger, [\n util.formatWithOptions(inspectOpts, ...args),\n ])\n}\n\n/**\n * Extract options from namespaces parameter.\n * @private\n */\n/*@__NO_SIDE_EFFECTS__*/\nfunction extractOptions(namespaces: NamespacesOrOptions): DebugOptions {\n return namespaces !== null && typeof namespaces === 'object'\n ? ({ __proto__: null, ...namespaces } as DebugOptions)\n : ({ __proto__: null, namespaces } as DebugOptions)\n}\n\n/**\n * Check if debug is enabled for given namespaces.\n * @private\n */\n/*@__NO_SIDE_EFFECTS__*/\nfunction isEnabled(namespaces: string | undefined) {\n // Check if debugging is enabled at all\n if (!SOCKET_DEBUG) {\n return false\n }\n if (typeof namespaces !== 'string' || !namespaces || namespaces === '*') {\n return true\n }\n // Namespace splitting logic is based the 'debug' package implementation:\n // https://github.com/debug-js/debug/blob/4.4.1/src/common.js#L169-L173.\n const split = namespaces\n .trim()\n .replace(/\\s+/g, ',')\n .split(',')\n .filter(Boolean)\n const names = []\n const skips = []\n for (const ns of split) {\n if (ns.startsWith('-')) {\n skips.push(ns.slice(1))\n } else {\n names.push(ns)\n }\n }\n if (names.length && !names.some(ns => getDebugJsInstance(ns).enabled)) {\n return false\n }\n return skips.every(ns => !getDebugJsInstance(ns).enabled)\n}\n\n/**\n * Debug output for object inspection with caller info.\n */\n/*@__NO_SIDE_EFFECTS__*/\nfunction debugDirNs(\n namespacesOrOpts: NamespacesOrOptions,\n obj: unknown,\n inspectOpts?: InspectOptions | undefined,\n) {\n const options = extractOptions(namespacesOrOpts)\n const { namespaces } = options\n if (!isEnabled(namespaces as string)) {\n return\n }\n // Get caller info with stack offset of 4 (caller -> debugDirNs -> getCallerInfo).\n const callerName = getCallerInfo(4) || 'anonymous'\n\n if (pointingTriangle === undefined) {\n const supported = isUnicodeSupported()\n pointingTriangle = supported ? '\u25B8' : '>'\n }\n\n let opts: InspectOptions | undefined = inspectOpts\n if (opts === undefined) {\n const debugOpts = debugJs.inspectOpts\n if (debugOpts) {\n opts = {\n ...debugOpts,\n showHidden:\n debugOpts.showHidden === null ? undefined : debugOpts.showHidden,\n depth:\n debugOpts.depth === null || typeof debugOpts.depth === 'boolean'\n ? null\n : debugOpts.depth,\n } as InspectOptions\n }\n }\n const spinnerInstance = options.spinner || getSpinner()\n const wasSpinning = spinnerInstance?.isSpinning\n spinnerInstance?.stop()\n logger.info(`[DEBUG] ${callerName} ${pointingTriangle} object inspection:`)\n logger.dir(obj, inspectOpts)\n if (wasSpinning) {\n spinnerInstance?.start()\n }\n}\n\nlet pointingTriangle: string | undefined\n/**\n * Debug output with caller info.\n */\n/*@__NO_SIDE_EFFECTS__*/\nfunction debugNs(namespacesOrOpts: NamespacesOrOptions, ...args: unknown[]) {\n const options = extractOptions(namespacesOrOpts)\n const { namespaces } = options\n if (!isEnabled(namespaces as string)) {\n return\n }\n // Get caller info with stack offset of 4 (caller -> debugNs -> getCallerInfo).\n const name = getCallerInfo(4) || 'anonymous'\n if (pointingTriangle === undefined) {\n const supported = isUnicodeSupported()\n pointingTriangle = supported ? '\u25B8' : '>'\n }\n const text = args.at(0)\n const logArgs =\n typeof text === 'string'\n ? [\n applyLinePrefix(\n `${name ? `${name} ${pointingTriangle} ` : ''}${text}`,\n { prefix: '[DEBUG] ' },\n ),\n ...args.slice(1),\n ]\n : args\n const spinnerInstance = options.spinner || getSpinner()\n const wasSpinning = spinnerInstance?.isSpinning\n spinnerInstance?.stop()\n ReflectApply(logger.info, logger, logArgs)\n if (wasSpinning) {\n spinnerInstance?.start()\n }\n}\n\n/**\n * Debug logging function with caller info.\n */\n/*@__NO_SIDE_EFFECTS__*/\nfunction debugLogNs(namespacesOrOpts: NamespacesOrOptions, ...args: unknown[]) {\n const options = extractOptions(namespacesOrOpts)\n const { namespaces } = options\n if (!isEnabled(namespaces as string)) {\n return\n }\n // Get caller info with stack offset of 4 (caller -> debugLogNs -> getCallerInfo).\n const callerName = getCallerInfo(4) || 'anonymous'\n\n if (pointingTriangle === undefined) {\n const supported = isUnicodeSupported()\n pointingTriangle = supported ? '\u25B8' : '>'\n }\n\n const text = args.at(0)\n const logArgs =\n typeof text === 'string'\n ? [\n applyLinePrefix(\n `${callerName ? `${callerName} ${pointingTriangle} ` : ''}${text}`,\n { prefix: '[DEBUG] ' },\n ),\n ...args.slice(1),\n ]\n : [`[DEBUG] ${callerName} ${pointingTriangle}`, ...args]\n\n const spinnerInstance = options.spinner || getSpinner()\n const wasSpinning = spinnerInstance?.isSpinning\n spinnerInstance?.stop()\n ReflectApply(logger.info, logger, logArgs)\n if (wasSpinning) {\n spinnerInstance?.start()\n }\n}\n\n/**\n * Debug output for cache operations with caller info.\n * First argument is the operation type (hit/miss/set/clear).\n * Second argument is the cache key or message.\n * Optional third argument is metadata object.\n */\n/*@__NO_SIDE_EFFECTS__*/\nfunction debugCacheNs(\n namespacesOrOpts: NamespacesOrOptions,\n operation: string,\n key: string,\n meta?: unknown | undefined,\n) {\n const options = extractOptions(namespacesOrOpts)\n const { namespaces } = options\n if (!isEnabled(namespaces as string)) {\n return\n }\n // Get caller info with stack offset of 4 (caller -> debugCacheNs -> getCallerInfo).\n const callerName = getCallerInfo(4) || 'cache'\n\n if (pointingTriangle === undefined) {\n const supported = isUnicodeSupported()\n pointingTriangle = supported ? '\u25B8' : '>'\n }\n\n const prefix = `[CACHE] ${callerName} ${pointingTriangle} ${operation}: ${key}`\n const logArgs = meta !== undefined ? [prefix, meta] : [prefix]\n\n const spinnerInstance = options.spinner || getSpinner()\n const wasSpinning = spinnerInstance?.isSpinning\n spinnerInstance?.stop()\n ReflectApply(logger.info, logger, logArgs)\n if (wasSpinning) {\n spinnerInstance?.start()\n }\n}\n\n/**\n * Cache debug function with caller info.\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function debugCache(\n operation: string,\n key: string,\n meta?: unknown | undefined,\n): void {\n if (!SOCKET_DEBUG) {\n return\n }\n // Get caller info with stack offset of 3 (caller -> debugCache -> getCallerInfo).\n const callerName = getCallerInfo(3) || 'cache'\n\n if (pointingTriangle === undefined) {\n const supported = isUnicodeSupported()\n pointingTriangle = supported ? '\u25B8' : '>'\n }\n\n const prefix = `[CACHE] ${callerName} ${pointingTriangle} ${operation}: ${key}`\n const args = meta !== undefined ? [prefix, meta] : [prefix]\n console.log(...args)\n}\n\n/**\n * Check if debug mode is enabled.\n */\n/*@__NO_SIDE_EFFECTS__*/\nfunction isDebugNs(namespaces: string | undefined): boolean {\n return !!SOCKET_DEBUG && isEnabled(namespaces)\n}\n\n/**\n * Debug output with caller info (wrapper for debugNs with default namespace).\n */\n/*@__NO_SIDE_EFFECTS__*/\nfunction debug(...args: unknown[]): void {\n debugNs('*', ...args)\n}\n\n/**\n * Debug output for object inspection (wrapper for debugDirNs with default namespace).\n */\n/*@__NO_SIDE_EFFECTS__*/\nfunction debugDir(\n obj: unknown,\n inspectOpts?: InspectOptions | undefined,\n): void {\n debugDirNs('*', obj, inspectOpts)\n}\n\n/**\n * Debug logging function (wrapper for debugLogNs with default namespace).\n */\n/*@__NO_SIDE_EFFECTS__*/\nfunction debugLog(...args: unknown[]): void {\n debugLogNs('*', ...args)\n}\n\n/**\n * Check if debug mode is enabled.\n */\n/*@__NO_SIDE_EFFECTS__*/\nfunction isDebug(): boolean {\n return !!SOCKET_DEBUG\n}\n\n/**\n * Create a Node.js util.debuglog compatible function.\n * Returns a function that conditionally writes debug messages to stderr.\n */\n/*@__NO_SIDE_EFFECTS__*/\nfunction debuglog(section: string) {\n const util = getUtil()\n return util.debuglog(section)\n}\n\n/**\n * Create timing functions for measuring code execution time.\n * Returns an object with start() and end() methods, plus a callable function.\n */\n/*@__NO_SIDE_EFFECTS__*/\nfunction debugtime(label: string) {\n const util = getUtil()\n // Node.js util doesn't have debugtime - create a custom implementation\n let startTime: number | undefined\n const impl = () => {\n if (startTime === undefined) {\n startTime = Date.now()\n } else {\n const duration = Date.now() - startTime\n util.debuglog('time')(`${label}: ${duration}ms`)\n startTime = undefined\n }\n }\n impl.start = () => {\n startTime = Date.now()\n }\n impl.end = () => {\n if (startTime !== undefined) {\n const duration = Date.now() - startTime\n util.debuglog('time')(`${label}: ${duration}ms`)\n startTime = undefined\n }\n }\n return impl\n}\n\n// Export main debug functions with caller info.\nexport { debug }\n// debugCache is already exported directly above\nexport { debugCacheNs }\nexport { debugDir }\nexport { debugDirNs }\nexport { debugLog }\nexport { debuglog }\nexport { debugLogNs }\nexport { debugNs }\nexport { debugtime }\nexport { isDebug }\nexport { isDebugNs }\n"],
5
- "mappings": "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",
6
- "names": ["debug_exports", "__export", "debug", "debugCache", "debugCacheNs", "debugDir", "debugDirNs", "debugLog", "debugLogNs", "debugNs", "debuglog", "debugtime", "isDebug", "isDebugNs", "__toCommonJS", "import_process", "import_debug", "import_socket_debug", "import_is_unicode_supported", "import_logger", "import_objects", "import_strings", "ReflectApply", "debugByNamespace", "getDebugJsInstance", "namespace", "inst", "debugJs", "customLog", "_util", "getUtil", "getCallerInfo", "stackOffset", "name", "captureStackTrace", "obj", "stack", "lineCount", "lineStart", "i", "length", "line", "match", "afterDot", "args", "util", "inspectOpts", "extractOptions", "namespaces", "isEnabled", "split", "names", "skips", "ns", "namespacesOrOpts", "options", "callerName", "pointingTriangle", "isUnicodeSupported", "opts", "debugOpts", "spinnerInstance", "wasSpinning", "text", "logArgs", "operation", "key", "meta", "prefix", "section", "label", "startTime", "impl", "duration"]
4
+ "sourcesContent": ["/**\n * @fileoverview Debug logging utilities with lazy loading and environment-based control.\n * Provides Socket CLI specific debug functionality and logging formatters.\n */\n\nimport { getSpinner } from '#constants/process'\nimport { getDebug } from '#env/debug'\nimport { getSocketDebug } from '#env/socket'\nimport isUnicodeSupported from './external/@socketregistry/is-unicode-supported'\nimport debugJs from './external/debug'\n\nimport { logger } from './logger'\nimport { hasOwn } from './objects'\nimport { applyLinePrefix } from './strings'\n\n// IMPORTANT: Do not use destructuring here - use direct assignment instead.\n// tsgo has a bug that incorrectly transpiles destructured exports, resulting in\n// `exports.SomeName = void 0;` which causes runtime errors.\n// See: https://github.com/SocketDev/socket-packageurl-js/issues/3\nconst ReflectApply = Reflect.apply\n\n// Type definitions\ninterface DebugOptions {\n namespaces?: string\n spinner?: { isSpinning: boolean; stop(): void; start(): void }\n [key: string]: unknown\n}\n\ntype NamespacesOrOptions = string | DebugOptions\n\ninterface InspectOptions {\n depth?: number | null\n colors?: boolean\n [key: string]: unknown\n}\n\nexport type { DebugOptions, NamespacesOrOptions, InspectOptions }\n\nconst debugByNamespace = new Map()\n/**\n * Get or create a debug instance for a namespace.\n * @private\n */\n/*@__NO_SIDE_EFFECTS__*/\nfunction getDebugJsInstance(namespace: string) {\n let inst = debugByNamespace.get(namespace)\n if (inst) {\n return inst\n }\n if (\n !getDebug() &&\n getSocketDebug() &&\n (namespace === 'error' || namespace === 'notice')\n ) {\n debugJs.enable(namespace)\n }\n inst = debugJs(namespace)\n inst.log = customLog\n debugByNamespace.set(namespace, inst)\n return inst\n}\n\nlet _util: typeof import('util') | undefined\n/**\n * Lazily load the util module.\n * @private\n */\n/*@__NO_SIDE_EFFECTS__*/\nfunction getUtil() {\n if (_util === undefined) {\n // Use non-'node:' prefixed require to avoid Webpack errors.\n\n _util = /*@__PURE__*/ require('node:util')\n }\n return _util as typeof import('util')\n}\n\n/**\n * Extract caller information from the stack trace.\n * @private\n */\n/*@__NO_SIDE_EFFECTS__*/\nfunction getCallerInfo(stackOffset: number = 3): string {\n let name = ''\n const captureStackTrace = Error.captureStackTrace\n if (typeof captureStackTrace === 'function') {\n const obj: { stack?: unknown } = {}\n captureStackTrace(obj, getCallerInfo)\n const stack = obj.stack\n if (typeof stack === 'string') {\n let lineCount = 0\n let lineStart = 0\n for (let i = 0, { length } = stack; i < length; i += 1) {\n if (stack[i] === '\\n') {\n lineCount += 1\n if (lineCount < stackOffset) {\n // Store the start index of the next line.\n lineStart = i + 1\n } else {\n // Extract the full line and trim it.\n const line = stack.slice(lineStart, i).trimStart()\n // Match the function name portion (e.g., \"async runFix\").\n const match = /(?<=^at\\s+).*?(?=\\s+\\(|$)/.exec(line)?.[0]\n if (match) {\n name = match\n // Strip known V8 invocation prefixes to get the name.\n .replace(/^(?:async|bound|get|new|set)\\s+/, '')\n if (name.startsWith('Object.')) {\n // Strip leading 'Object.' if not an own property of Object.\n const afterDot = name.slice(7 /*'Object.'.length*/)\n if (!hasOwn(Object, afterDot)) {\n name = afterDot\n }\n }\n }\n break\n }\n }\n }\n }\n }\n return name\n}\n\n/**\n * Custom log function for debug output.\n * @private\n */\n/*@__NO_SIDE_EFFECTS__*/\nfunction customLog(...args: unknown[]) {\n const util = getUtil()\n const inspectOpts = debugJs.inspectOpts\n ? {\n ...debugJs.inspectOpts,\n showHidden:\n debugJs.inspectOpts.showHidden === null\n ? undefined\n : debugJs.inspectOpts.showHidden,\n depth:\n debugJs.inspectOpts.depth === null ||\n typeof debugJs.inspectOpts.depth === 'boolean'\n ? undefined\n : debugJs.inspectOpts.depth,\n }\n : {}\n ReflectApply(logger.info, logger, [\n util.formatWithOptions(inspectOpts, ...args),\n ])\n}\n\n/**\n * Extract options from namespaces parameter.\n * @private\n */\n/*@__NO_SIDE_EFFECTS__*/\nfunction extractOptions(namespaces: NamespacesOrOptions): DebugOptions {\n return namespaces !== null && typeof namespaces === 'object'\n ? ({ __proto__: null, ...namespaces } as DebugOptions)\n : ({ __proto__: null, namespaces } as DebugOptions)\n}\n\n/**\n * Check if debug is enabled for given namespaces.\n * @private\n */\n/*@__NO_SIDE_EFFECTS__*/\nfunction isEnabled(namespaces: string | undefined) {\n // Check if debugging is enabled at all\n if (!getSocketDebug()) {\n return false\n }\n if (typeof namespaces !== 'string' || !namespaces || namespaces === '*') {\n return true\n }\n // Namespace splitting logic is based the 'debug' package implementation:\n // https://github.com/debug-js/debug/blob/4.4.1/src/common.js#L169-L173.\n const split = namespaces\n .trim()\n .replace(/\\s+/g, ',')\n .split(',')\n .filter(Boolean)\n const names = []\n const skips = []\n for (const ns of split) {\n if (ns.startsWith('-')) {\n skips.push(ns.slice(1))\n } else {\n names.push(ns)\n }\n }\n if (names.length && !names.some(ns => getDebugJsInstance(ns).enabled)) {\n return false\n }\n return skips.every(ns => !getDebugJsInstance(ns).enabled)\n}\n\n/**\n * Debug output for object inspection with caller info.\n */\nfunction debugDirNs(\n namespacesOrOpts: NamespacesOrOptions,\n obj: unknown,\n inspectOpts?: InspectOptions | undefined,\n) {\n const options = extractOptions(namespacesOrOpts)\n const { namespaces } = options\n if (!isEnabled(namespaces as string)) {\n return\n }\n // Get caller info with stack offset of 4 (caller -> debugDirNs -> getCallerInfo).\n const callerName = getCallerInfo(4) || 'anonymous'\n\n if (pointingTriangle === undefined) {\n const supported = isUnicodeSupported()\n pointingTriangle = supported ? '\u25B8' : '>'\n }\n\n let opts: InspectOptions | undefined = inspectOpts\n if (opts === undefined) {\n const debugOpts = debugJs.inspectOpts\n if (debugOpts) {\n opts = {\n ...debugOpts,\n showHidden:\n debugOpts.showHidden === null ? undefined : debugOpts.showHidden,\n depth:\n debugOpts.depth === null || typeof debugOpts.depth === 'boolean'\n ? null\n : debugOpts.depth,\n } as InspectOptions\n }\n }\n const spinnerInstance = options.spinner || getSpinner()\n const wasSpinning = spinnerInstance?.isSpinning\n spinnerInstance?.stop()\n logger.info(`[DEBUG] ${callerName} ${pointingTriangle} object inspection:`)\n logger.dir(obj, inspectOpts)\n if (wasSpinning) {\n spinnerInstance?.start()\n }\n}\n\nlet pointingTriangle: string | undefined\n/**\n * Debug output with caller info.\n */\nfunction debugNs(namespacesOrOpts: NamespacesOrOptions, ...args: unknown[]) {\n const options = extractOptions(namespacesOrOpts)\n const { namespaces } = options\n if (!isEnabled(namespaces as string)) {\n return\n }\n // Get caller info with stack offset of 4 (caller -> debugNs -> getCallerInfo).\n const name = getCallerInfo(4) || 'anonymous'\n if (pointingTriangle === undefined) {\n const supported = isUnicodeSupported()\n pointingTriangle = supported ? '\u25B8' : '>'\n }\n const text = args.at(0)\n const logArgs =\n typeof text === 'string'\n ? [\n applyLinePrefix(\n `${name ? `${name} ${pointingTriangle} ` : ''}${text}`,\n { prefix: '[DEBUG] ' },\n ),\n ...args.slice(1),\n ]\n : args\n const spinnerInstance = options.spinner || getSpinner()\n const wasSpinning = spinnerInstance?.isSpinning\n spinnerInstance?.stop()\n ReflectApply(logger.info, logger, logArgs)\n if (wasSpinning) {\n spinnerInstance?.start()\n }\n}\n\n/**\n * Debug logging function with caller info.\n */\nfunction debugLogNs(namespacesOrOpts: NamespacesOrOptions, ...args: unknown[]) {\n const options = extractOptions(namespacesOrOpts)\n const { namespaces } = options\n if (!isEnabled(namespaces as string)) {\n return\n }\n // Get caller info with stack offset of 4 (caller -> debugLogNs -> getCallerInfo).\n const callerName = getCallerInfo(4) || 'anonymous'\n\n if (pointingTriangle === undefined) {\n const supported = isUnicodeSupported()\n pointingTriangle = supported ? '\u25B8' : '>'\n }\n\n const text = args.at(0)\n const logArgs =\n typeof text === 'string'\n ? [\n applyLinePrefix(\n `${callerName ? `${callerName} ${pointingTriangle} ` : ''}${text}`,\n { prefix: '[DEBUG] ' },\n ),\n ...args.slice(1),\n ]\n : [`[DEBUG] ${callerName} ${pointingTriangle}`, ...args]\n\n const spinnerInstance = options.spinner || getSpinner()\n const wasSpinning = spinnerInstance?.isSpinning\n spinnerInstance?.stop()\n ReflectApply(logger.info, logger, logArgs)\n if (wasSpinning) {\n spinnerInstance?.start()\n }\n}\n\n/**\n * Debug output for cache operations with caller info.\n * First argument is the operation type (hit/miss/set/clear).\n * Second argument is the cache key or message.\n * Optional third argument is metadata object.\n */\nfunction debugCacheNs(\n namespacesOrOpts: NamespacesOrOptions,\n operation: string,\n key: string,\n meta?: unknown | undefined,\n) {\n const options = extractOptions(namespacesOrOpts)\n const { namespaces } = options\n if (!isEnabled(namespaces as string)) {\n return\n }\n // Get caller info with stack offset of 4 (caller -> debugCacheNs -> getCallerInfo).\n const callerName = getCallerInfo(4) || 'cache'\n\n if (pointingTriangle === undefined) {\n const supported = isUnicodeSupported()\n pointingTriangle = supported ? '\u25B8' : '>'\n }\n\n const prefix = `[CACHE] ${callerName} ${pointingTriangle} ${operation}: ${key}`\n const logArgs = meta !== undefined ? [prefix, meta] : [prefix]\n\n const spinnerInstance = options.spinner || getSpinner()\n const wasSpinning = spinnerInstance?.isSpinning\n spinnerInstance?.stop()\n ReflectApply(logger.info, logger, logArgs)\n if (wasSpinning) {\n spinnerInstance?.start()\n }\n}\n\n/**\n * Cache debug function with caller info.\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function debugCache(\n operation: string,\n key: string,\n meta?: unknown | undefined,\n): void {\n if (!getSocketDebug()) {\n return\n }\n // Get caller info with stack offset of 3 (caller -> debugCache -> getCallerInfo).\n const callerName = getCallerInfo(3) || 'cache'\n\n if (pointingTriangle === undefined) {\n const supported = isUnicodeSupported()\n pointingTriangle = supported ? '\u25B8' : '>'\n }\n\n const prefix = `[CACHE] ${callerName} ${pointingTriangle} ${operation}: ${key}`\n const args = meta !== undefined ? [prefix, meta] : [prefix]\n console.log(...args)\n}\n\n/**\n * Check if debug mode is enabled.\n */\n/*@__NO_SIDE_EFFECTS__*/\nfunction isDebugNs(namespaces: string | undefined): boolean {\n return !!getSocketDebug() && isEnabled(namespaces)\n}\n\n/**\n * Debug output with caller info (wrapper for debugNs with default namespace).\n */\nfunction debug(...args: unknown[]): void {\n debugNs('*', ...args)\n}\n\n/**\n * Debug output for object inspection (wrapper for debugDirNs with default namespace).\n */\nfunction debugDir(\n obj: unknown,\n inspectOpts?: InspectOptions | undefined,\n): void {\n debugDirNs('*', obj, inspectOpts)\n}\n\n/**\n * Debug logging function (wrapper for debugLogNs with default namespace).\n */\nfunction debugLog(...args: unknown[]): void {\n debugLogNs('*', ...args)\n}\n\n/**\n * Check if debug mode is enabled.\n */\n/*@__NO_SIDE_EFFECTS__*/\nfunction isDebug(): boolean {\n return !!getSocketDebug()\n}\n\n/**\n * Create a Node.js util.debuglog compatible function.\n * Returns a function that conditionally writes debug messages to stderr.\n */\n/*@__NO_SIDE_EFFECTS__*/\nfunction debuglog(section: string) {\n const util = getUtil()\n return util.debuglog(section)\n}\n\n/**\n * Create timing functions for measuring code execution time.\n * Returns an object with start() and end() methods, plus a callable function.\n */\n/*@__NO_SIDE_EFFECTS__*/\nfunction debugtime(label: string) {\n const util = getUtil()\n // Node.js util doesn't have debugtime - create a custom implementation\n let startTime: number | undefined\n const impl = () => {\n if (startTime === undefined) {\n startTime = Date.now()\n } else {\n const duration = Date.now() - startTime\n util.debuglog('time')(`${label}: ${duration}ms`)\n startTime = undefined\n }\n }\n impl.start = () => {\n startTime = Date.now()\n }\n impl.end = () => {\n if (startTime !== undefined) {\n const duration = Date.now() - startTime\n util.debuglog('time')(`${label}: ${duration}ms`)\n startTime = undefined\n }\n }\n return impl\n}\n\n// Export main debug functions with caller info.\nexport { debug }\n// debugCache is already exported directly above\nexport { debugCacheNs }\nexport { debugDir }\nexport { debugDirNs }\nexport { debugLog }\nexport { debuglog }\nexport { debugLogNs }\nexport { debugNs }\nexport { debugtime }\nexport { isDebug }\nexport { isDebugNs }\n"],
5
+ "mappings": "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",
6
+ "names": ["debug_exports", "__export", "debug", "debugCache", "debugCacheNs", "debugDir", "debugDirNs", "debugLog", "debugLogNs", "debugNs", "debuglog", "debugtime", "isDebug", "isDebugNs", "__toCommonJS", "import_process", "import_debug", "import_socket", "import_is_unicode_supported", "import_logger", "import_objects", "import_strings", "ReflectApply", "debugByNamespace", "getDebugJsInstance", "namespace", "inst", "debugJs", "customLog", "_util", "getUtil", "getCallerInfo", "stackOffset", "name", "captureStackTrace", "obj", "stack", "lineCount", "lineStart", "i", "length", "line", "match", "afterDot", "args", "util", "inspectOpts", "extractOptions", "namespaces", "isEnabled", "split", "names", "skips", "ns", "namespacesOrOpts", "options", "callerName", "pointingTriangle", "isUnicodeSupported", "opts", "debugOpts", "spinnerInstance", "wasSpinning", "text", "logArgs", "operation", "key", "meta", "prefix", "section", "label", "startTime", "impl", "duration"]
7
7
  }
@@ -1,3 +1,3 @@
1
1
  /* Socket Lib - Built with esbuild */
2
- var H=Object.create;var x=Object.defineProperty;var N=Object.getOwnPropertyDescriptor;var z=Object.getOwnPropertyNames;var F=Object.getPrototypeOf,L=Object.prototype.hasOwnProperty;var q=(t,n)=>{for(var e in n)x(t,e,{get:n[e],enumerable:!0})},C=(t,n,e,a)=>{if(n&&typeof n=="object"||typeof n=="function")for(let r of z(n))!L.call(t,r)&&r!==e&&x(t,r,{get:()=>n[r],enumerable:!(a=N(n,r))||a.enumerable});return t};var O=(t,n,e)=>(e=t!=null?H(F(t)):{},C(n||!t||!t.__esModule?x(e,"default",{value:t,enumerable:!0}):e,t)),I=t=>C(x({},"__esModule",{value:!0}),t);var G={};q(G,{cleanDlxCache:()=>X,dlxBinary:()=>Y,getDlxCachePath:()=>P,listDlxCache:()=>V});module.exports=I(G);var j=require("node:crypto"),s=require("node:fs"),D=O(require("node:os")),l=O(require("node:path")),A=require("#constants/platform"),m=require("./fs"),R=require("./http-request"),S=require("./objects"),$=require("./path"),T=require("./paths"),_=require("./spawn");function J(t){return(0,j.createHash)("sha256").update(t).digest("hex")}function g(t){return l.default.join(t,".dlx-metadata.json")}async function K(t,n){try{const e=g(t);if(!(0,s.existsSync)(e))return!1;const a=await(0,m.readJson)(e,{throws:!1});return(0,S.isObjectObject)(a)?Date.now()-(a.timestamp||0)<n:!1}catch{return!1}}async function M(t,n,e){const a=await(0,R.httpRequest)(t);if(!a.ok)throw new Error(`Failed to download binary: ${a.status} ${a.statusText}`);const r=`${n}.download`,c=(0,j.createHash)("sha256");try{await s.promises.mkdir(l.default.dirname(n),{recursive:!0});const i=a.body;c.update(i);const o=c.digest("hex");if(e&&o!==e)throw new Error(`Checksum mismatch: expected ${e}, got ${o}`);return await s.promises.writeFile(r,i),A.WIN32||await s.promises.chmod(r,493),await s.promises.rename(r,n),o}catch(i){try{await(0,m.safeDelete)(r)}catch{}throw i}}async function W(t,n,e){const a=g(t),r={arch:D.default.arch(),checksum:e,platform:D.default.platform(),timestamp:Date.now(),url:n,version:"1.0.0"};await s.promises.writeFile(a,JSON.stringify(r,null,2))}async function X(t=require("./constants/time").DLX_BINARY_CACHE_TTL){const n=P();if(!(0,s.existsSync)(n))return 0;let e=0;const a=Date.now(),r=await s.promises.readdir(n);for(const c of r){const i=l.default.join(n,c),o=g(i);try{if(!await(0,m.isDir)(i))continue;const u=await(0,m.readJson)(o,{throws:!1});if(!u||typeof u!="object"||Array.isArray(u))continue;a-(u.timestamp||0)>t&&(await(0,m.safeDelete)(i,{force:!0,recursive:!0}),e+=1)}catch{try{(await s.promises.readdir(i)).length||(await(0,m.safeDelete)(i),e+=1)}catch{}}}return e}async function Y(t,n,e){const{cacheTtl:a=require("./constants/time").DLX_BINARY_CACHE_TTL,checksum:r,force:c=!1,name:i,spawnOptions:o,url:u}={__proto__:null,...n},h=P(),p=J(u),f=l.default.join(h,p),d=i||`binary-${process.platform}-${D.default.arch()}`,b=(0,$.normalizePath)(l.default.join(f,d));let w=!1,k=r;if(!c&&(0,s.existsSync)(f)&&await K(f,a))try{const E=g(f),y=await(0,m.readJson)(E,{throws:!1});y&&typeof y=="object"&&!Array.isArray(y)&&typeof y.checksum=="string"?k=y.checksum:w=!0}catch{w=!0}else w=!0;w&&(await s.promises.mkdir(f,{recursive:!0}),k=await M(u,b,r),await W(f,u,k||""));const B=A.WIN32&&/\.(?:bat|cmd|ps1)$/i.test(b)?{...o,env:{...o?.env,PATH:`${f}${l.default.delimiter}${process.env.PATH||""}`},shell:!0}:o,v=(0,_.spawn)(b,t,B,e);return{binaryPath:b,downloaded:w,spawnPromise:v}}function P(){return(0,T.getSocketDlxDir)()}async function V(){const t=P();if(!(0,s.existsSync)(t))return[];const n=[],e=Date.now(),a=await s.promises.readdir(t);for(const r of a){const c=l.default.join(t,r);try{if(!await(0,m.isDir)(c))continue;const i=g(c),o=await(0,m.readJson)(i,{throws:!1});if(!o||typeof o!="object"||Array.isArray(o))continue;const h=(await s.promises.readdir(c)).find(p=>!p.startsWith("."));if(h){const p=l.default.join(c,h),f=await s.promises.stat(p),d=o;n.push({age:e-(d.timestamp||0),arch:d.arch||"unknown",checksum:d.checksum||"",name:h,platform:d.platform||"unknown",size:f.size,url:d.url||""})}}catch{}}return n}0&&(module.exports={cleanDlxCache,dlxBinary,getDlxCachePath,listDlxCache});
2
+ var I=Object.create;var b=Object.defineProperty;var N=Object.getOwnPropertyDescriptor;var F=Object.getOwnPropertyNames;var H=Object.getPrototypeOf,z=Object.prototype.hasOwnProperty;var L=(t,n)=>{for(var e in n)b(t,e,{get:n[e],enumerable:!0})},O=(t,n,e,a)=>{if(n&&typeof n=="object"||typeof n=="function")for(let r of F(n))!z.call(t,r)&&r!==e&&b(t,r,{get:()=>n[r],enumerable:!(a=N(n,r))||a.enumerable});return t};var $=(t,n,e)=>(e=t!=null?I(H(t)):{},O(n||!t||!t.__esModule?b(e,"default",{value:t,enumerable:!0}):e,t)),q=t=>O(b({},"__esModule",{value:!0}),t);var G={};L(G,{cleanDlxCache:()=>V,dlxBinary:()=>W,getDlxCachePath:()=>P,listDlxCache:()=>X});module.exports=q(G);var j=require("node:crypto"),s=require("node:fs"),x=$(require("node:os")),p=$(require("node:path")),A=require("#constants/platform"),u=require("./fs"),C=require("./http-request"),S=require("./objects"),T=require("./path"),R=require("./paths"),_=require("./spawn");function Y(t,n){return(0,j.createHash)("sha256").update(`${t}:${n}`).digest("hex")}function y(t){return p.default.join(t,".dlx-metadata.json")}async function J(t,n){try{const e=y(t);if(!(0,s.existsSync)(e))return!1;const a=await(0,u.readJson)(e,{throws:!1});if(!(0,S.isObjectObject)(a))return!1;const r=Date.now(),i=a.timestamp;return typeof i!="number"||i<=0?!1:r-i<n}catch{return!1}}async function K(t,n,e){const a=await(0,C.httpRequest)(t);if(!a.ok)throw new Error(`Failed to download binary: ${a.status} ${a.statusText}`);const r=`${n}.download`,i=(0,j.createHash)("sha256");try{await s.promises.mkdir(p.default.dirname(n),{recursive:!0});const o=a.body;i.update(o);const c=i.digest("hex");if(e&&c!==e)throw new Error(`Checksum mismatch: expected ${e}, got ${c}`);return await s.promises.writeFile(r,o),A.WIN32||await s.promises.chmod(r,493),await s.promises.rename(r,n),c}catch(o){try{await(0,u.safeDelete)(r)}catch{}throw o}}async function M(t,n,e){const a=y(t),r={arch:x.default.arch(),checksum:e,platform:x.default.platform(),timestamp:Date.now(),url:n,version:"1.0.0"};await s.promises.writeFile(a,JSON.stringify(r,null,2))}async function V(t=require("#constants/time").DLX_BINARY_CACHE_TTL){const n=P();if(!(0,s.existsSync)(n))return 0;let e=0;const a=Date.now(),r=await s.promises.readdir(n);for(const i of r){const o=p.default.join(n,i),c=y(o);try{if(!await(0,u.isDir)(o))continue;const f=await(0,u.readJson)(c,{throws:!1});if(!f||typeof f!="object"||Array.isArray(f))continue;const l=f.timestamp;(typeof l=="number"&&l>0?a-l:Number.POSITIVE_INFINITY)>t&&(await(0,u.safeDelete)(o,{force:!0,recursive:!0}),e+=1)}catch{try{(await s.promises.readdir(o)).length||(await(0,u.safeDelete)(o),e+=1)}catch{}}}return e}async function W(t,n,e){const{cacheTtl:a=require("#constants/time").DLX_BINARY_CACHE_TTL,checksum:r,force:i=!1,name:o,spawnOptions:c,url:f}={__proto__:null,...n},l=P(),d=o||`binary-${process.platform}-${x.default.arch()}`,D=Y(f,d),m=p.default.join(l,D),g=(0,T.normalizePath)(p.default.join(m,d));let h=!1,k=r;if(!i&&(0,s.existsSync)(m)&&await J(m,a))try{const E=y(m),w=await(0,u.readJson)(E,{throws:!1});w&&typeof w=="object"&&!Array.isArray(w)&&typeof w.checksum=="string"?k=w.checksum:h=!0}catch{h=!0}else h=!0;h&&(await s.promises.mkdir(m,{recursive:!0}),k=await K(f,g,r),await M(m,f,k||""));const B=A.WIN32&&/\.(?:bat|cmd|ps1)$/i.test(g)?{...c,env:{...c?.env,PATH:`${m}${p.default.delimiter}${process.env.PATH||""}`},shell:!0}:c,v=(0,_.spawn)(g,t,B,e);return{binaryPath:g,downloaded:h,spawnPromise:v}}function P(){return(0,R.getSocketDlxDir)()}async function X(){const t=P();if(!(0,s.existsSync)(t))return[];const n=[],e=Date.now(),a=await s.promises.readdir(t);for(const r of a){const i=p.default.join(t,r);try{if(!await(0,u.isDir)(i))continue;const o=y(i),c=await(0,u.readJson)(o,{throws:!1});if(!c||typeof c!="object"||Array.isArray(c))continue;const l=(await s.promises.readdir(i)).find(d=>!d.startsWith("."));if(l){const d=p.default.join(i,l),D=await s.promises.stat(d),m=c;n.push({age:e-(m.timestamp||0),arch:m.arch||"unknown",checksum:m.checksum||"",name:l,platform:m.platform||"unknown",size:D.size,url:m.url||""})}}catch{}}return n}0&&(module.exports={cleanDlxCache,dlxBinary,getDlxCachePath,listDlxCache});
3
3
  //# sourceMappingURL=dlx-binary.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/dlx-binary.ts"],
4
- "sourcesContent": ["/** @fileoverview DLX binary execution utilities for Socket ecosystem. */\n\nimport { createHash } from 'node:crypto'\nimport { existsSync, promises as fs } from 'node:fs'\nimport os from 'node:os'\nimport path from 'node:path'\n\nimport { WIN32 } from '#constants/platform'\n\nimport { isDir, readJson, safeDelete } from './fs'\nimport { httpRequest } from './http-request'\nimport { isObjectObject } from './objects'\nimport { normalizePath } from './path'\nimport { getSocketDlxDir } from './paths'\nimport type { SpawnExtra, SpawnOptions } from './spawn'\nimport { spawn } from './spawn'\n\nexport interface DlxBinaryOptions {\n /** URL to download the binary from. */\n url: string\n /** Optional name for the cached binary (defaults to URL hash). */\n name?: string | undefined\n /** Expected checksum (sha256) for verification. */\n checksum?: string | undefined\n /** Cache TTL in milliseconds (default: 7 days). */\n cacheTtl?: number | undefined\n /** Force re-download even if cached. */\n force?: boolean | undefined\n /** Additional spawn options. */\n spawnOptions?: SpawnOptions | undefined\n}\n\nexport interface DlxBinaryResult {\n /** Path to the cached binary. */\n binaryPath: string\n /** Whether the binary was newly downloaded. */\n downloaded: boolean\n /** The spawn promise for the running process. */\n spawnPromise: ReturnType<typeof spawn>\n}\n\n/**\n * Generate a cache directory name from URL, similar to pnpm/npx.\n * Uses SHA256 hash to create content-addressed storage.\n */\nfunction generateCacheKey(url: string): string {\n return createHash('sha256').update(url).digest('hex')\n}\n\n/**\n * Get metadata file path for a cached binary.\n */\nfunction getMetadataPath(cacheEntryPath: string): string {\n return path.join(cacheEntryPath, '.dlx-metadata.json')\n}\n\n/**\n * Check if a cached binary is still valid.\n */\nasync function isCacheValid(\n cacheEntryPath: string,\n cacheTtl: number,\n): Promise<boolean> {\n try {\n const metaPath = getMetadataPath(cacheEntryPath)\n if (!existsSync(metaPath)) {\n return false\n }\n\n const metadata = await readJson(metaPath, { throws: false })\n if (!isObjectObject(metadata)) {\n return false\n }\n const now = Date.now()\n const age =\n now -\n (((metadata as Record<string, unknown>)['timestamp'] as number) || 0)\n\n return age < cacheTtl\n } catch {\n return false\n }\n}\n\n/**\n * Download a file from a URL with integrity checking.\n */\nasync function downloadBinary(\n url: string,\n destPath: string,\n checksum?: string | undefined,\n): Promise<string> {\n const response = await httpRequest(url)\n if (!response.ok) {\n throw new Error(\n `Failed to download binary: ${response.status} ${response.statusText}`,\n )\n }\n\n // Create a temporary file first.\n const tempPath = `${destPath}.download`\n const hasher = createHash('sha256')\n\n try {\n // Ensure directory exists.\n await fs.mkdir(path.dirname(destPath), { recursive: true })\n\n // Get the response as a buffer and compute hash.\n const buffer = response.body\n\n // Compute hash.\n hasher.update(buffer)\n const actualChecksum = hasher.digest('hex')\n\n // Verify checksum if provided.\n if (checksum && actualChecksum !== checksum) {\n throw new Error(\n `Checksum mismatch: expected ${checksum}, got ${actualChecksum}`,\n )\n }\n\n // Write to temp file.\n await fs.writeFile(tempPath, buffer)\n\n // Make executable on POSIX systems.\n if (!WIN32) {\n await fs.chmod(tempPath, 0o755)\n }\n\n // Move temp file to final location.\n await fs.rename(tempPath, destPath)\n\n return actualChecksum\n } catch (e) {\n // Clean up temp file on error.\n try {\n await safeDelete(tempPath)\n } catch {\n // Ignore cleanup errors.\n }\n throw e\n }\n}\n\n/**\n * Write metadata for a cached binary.\n */\nasync function writeMetadata(\n cacheEntryPath: string,\n url: string,\n checksum: string,\n): Promise<void> {\n const metaPath = getMetadataPath(cacheEntryPath)\n const metadata = {\n arch: os.arch(),\n checksum,\n platform: os.platform(),\n timestamp: Date.now(),\n url,\n version: '1.0.0',\n }\n await fs.writeFile(metaPath, JSON.stringify(metadata, null, 2))\n}\n\n/**\n * Clean expired entries from the DLX cache.\n */\nexport async function cleanDlxCache(\n maxAge: number = /*@__INLINE__*/ require('../constants/time').DLX_BINARY_CACHE_TTL,\n): Promise<number> {\n const cacheDir = getDlxCachePath()\n\n if (!existsSync(cacheDir)) {\n return 0\n }\n\n let cleaned = 0\n const now = Date.now()\n const entries = await fs.readdir(cacheDir)\n\n for (const entry of entries) {\n const entryPath = path.join(cacheDir, entry)\n const metaPath = getMetadataPath(entryPath)\n\n try {\n // eslint-disable-next-line no-await-in-loop\n if (!(await isDir(entryPath))) {\n continue\n }\n\n // eslint-disable-next-line no-await-in-loop\n const metadata = await readJson(metaPath, { throws: false })\n if (\n !metadata ||\n typeof metadata !== 'object' ||\n Array.isArray(metadata)\n ) {\n continue\n }\n const age =\n now -\n (((metadata as Record<string, unknown>)['timestamp'] as number) || 0)\n\n if (age > maxAge) {\n // Remove entire cache entry directory.\n // eslint-disable-next-line no-await-in-loop\n await safeDelete(entryPath, { force: true, recursive: true })\n cleaned += 1\n }\n } catch {\n // If we can't read metadata, check if directory is empty or corrupted.\n try {\n // eslint-disable-next-line no-await-in-loop\n const contents = await fs.readdir(entryPath)\n if (!contents.length) {\n // Remove empty directory.\n // eslint-disable-next-line no-await-in-loop\n await safeDelete(entryPath)\n cleaned += 1\n }\n } catch {}\n }\n }\n\n return cleaned\n}\n\n/**\n * Download and execute a binary from a URL with caching.\n */\nexport async function dlxBinary(\n args: readonly string[] | string[],\n options?: DlxBinaryOptions | undefined,\n spawnExtra?: SpawnExtra | undefined,\n): Promise<DlxBinaryResult> {\n const {\n cacheTtl = /*@__INLINE__*/ require('../constants/time').DLX_BINARY_CACHE_TTL,\n checksum,\n force = false,\n name,\n spawnOptions,\n url,\n } = { __proto__: null, ...options } as DlxBinaryOptions\n\n // Generate cache paths similar to pnpm/npx structure.\n const cacheDir = getDlxCachePath()\n const cacheKey = generateCacheKey(url)\n const cacheEntryDir = path.join(cacheDir, cacheKey)\n const binaryName = name || `binary-${process.platform}-${os.arch()}`\n const binaryPath = normalizePath(path.join(cacheEntryDir, binaryName))\n\n let downloaded = false\n let computedChecksum = checksum\n\n // Check if we need to download.\n if (\n !force &&\n existsSync(cacheEntryDir) &&\n (await isCacheValid(cacheEntryDir, cacheTtl))\n ) {\n // Binary is cached and valid, read the checksum from metadata.\n try {\n const metaPath = getMetadataPath(cacheEntryDir)\n const metadata = await readJson(metaPath, { throws: false })\n if (\n metadata &&\n typeof metadata === 'object' &&\n !Array.isArray(metadata) &&\n typeof (metadata as Record<string, unknown>)['checksum'] === 'string'\n ) {\n computedChecksum = (metadata as Record<string, unknown>)[\n 'checksum'\n ] as string\n } else {\n // If metadata is invalid, re-download.\n downloaded = true\n }\n } catch {\n // If we can't read metadata, re-download.\n downloaded = true\n }\n } else {\n downloaded = true\n }\n\n if (downloaded) {\n // Ensure cache directory exists.\n await fs.mkdir(cacheEntryDir, { recursive: true })\n\n // Download the binary.\n computedChecksum = await downloadBinary(url, binaryPath, checksum)\n await writeMetadata(cacheEntryDir, url, computedChecksum || '')\n }\n\n // Execute the binary.\n // On Windows, script files (.bat, .cmd, .ps1) require shell: true because\n // they are not executable on their own and must be run through cmd.exe.\n // Note: .exe files are actual binaries and don't need shell mode.\n const needsShell = WIN32 && /\\.(?:bat|cmd|ps1)$/i.test(binaryPath)\n // Windows cmd.exe PATH resolution behavior:\n // When shell: true on Windows with .cmd/.bat/.ps1 files, spawn will automatically\n // strip the full path down to just the basename without extension (e.g.,\n // C:\\cache\\test.cmd becomes just \"test\"). Windows cmd.exe then searches for \"test\"\n // in directories listed in PATH, trying each extension from PATHEXT environment\n // variable (.COM, .EXE, .BAT, .CMD, etc.) until it finds a match.\n //\n // Since our binaries are downloaded to a custom cache directory that's not in PATH\n // (unlike system package managers like npm/pnpm/yarn which are already in PATH),\n // we must prepend the cache directory to PATH so cmd.exe can locate the binary.\n //\n // This approach is consistent with how other tools handle Windows command execution:\n // - npm's promise-spawn: uses which.sync() to find commands in PATH\n // - cross-spawn: spawns cmd.exe with escaped arguments\n // - Node.js spawn with shell: true: delegates to cmd.exe which uses PATH\n const finalSpawnOptions = needsShell\n ? {\n ...spawnOptions,\n env: {\n ...spawnOptions?.env,\n PATH: `${cacheEntryDir}${path.delimiter}${process.env['PATH'] || ''}`,\n },\n shell: true,\n }\n : spawnOptions\n const spawnPromise = spawn(binaryPath, args, finalSpawnOptions, spawnExtra)\n\n return {\n binaryPath,\n downloaded,\n spawnPromise,\n }\n}\n\n/**\n * Get the DLX binary cache directory path.\n * Returns normalized path for cross-platform compatibility.\n * Uses same directory as dlx-package for unified DLX storage.\n */\nexport function getDlxCachePath(): string {\n return getSocketDlxDir()\n}\n\n/**\n * Get information about cached binaries.\n */\nexport async function listDlxCache(): Promise<\n Array<{\n age: number\n arch: string\n checksum: string\n name: string\n platform: string\n size: number\n url: string\n }>\n> {\n const cacheDir = getDlxCachePath()\n\n if (!existsSync(cacheDir)) {\n return []\n }\n\n const results = []\n const now = Date.now()\n const entries = await fs.readdir(cacheDir)\n\n for (const entry of entries) {\n const entryPath = path.join(cacheDir, entry)\n try {\n // eslint-disable-next-line no-await-in-loop\n if (!(await isDir(entryPath))) {\n continue\n }\n\n const metaPath = getMetadataPath(entryPath)\n // eslint-disable-next-line no-await-in-loop\n const metadata = await readJson(metaPath, { throws: false })\n if (\n !metadata ||\n typeof metadata !== 'object' ||\n Array.isArray(metadata)\n ) {\n continue\n }\n\n // Find the binary file in the directory.\n // eslint-disable-next-line no-await-in-loop\n const files = await fs.readdir(entryPath)\n const binaryFile = files.find(f => !f.startsWith('.'))\n\n if (binaryFile) {\n const binaryPath = path.join(entryPath, binaryFile)\n // eslint-disable-next-line no-await-in-loop\n const binaryStats = await fs.stat(binaryPath)\n\n const metaObj = metadata as Record<string, unknown>\n results.push({\n age: now - ((metaObj['timestamp'] as number) || 0),\n arch: (metaObj['arch'] as string) || 'unknown',\n checksum: (metaObj['checksum'] as string) || '',\n name: binaryFile,\n platform: (metaObj['platform'] as string) || 'unknown',\n size: binaryStats.size,\n url: (metaObj['url'] as string) || '',\n })\n }\n } catch {}\n }\n\n return results\n}\n"],
5
- "mappings": "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",
6
- "names": ["dlx_binary_exports", "__export", "cleanDlxCache", "dlxBinary", "getDlxCachePath", "listDlxCache", "__toCommonJS", "import_node_crypto", "import_node_fs", "import_node_os", "import_node_path", "import_platform", "import_fs", "import_http_request", "import_objects", "import_path", "import_paths", "import_spawn", "generateCacheKey", "url", "getMetadataPath", "cacheEntryPath", "path", "isCacheValid", "cacheTtl", "metaPath", "metadata", "downloadBinary", "destPath", "checksum", "response", "tempPath", "hasher", "fs", "buffer", "actualChecksum", "e", "writeMetadata", "os", "maxAge", "cacheDir", "cleaned", "now", "entries", "entry", "entryPath", "args", "options", "spawnExtra", "force", "name", "spawnOptions", "cacheKey", "cacheEntryDir", "binaryName", "binaryPath", "downloaded", "computedChecksum", "finalSpawnOptions", "spawnPromise", "results", "binaryFile", "f", "binaryStats", "metaObj"]
4
+ "sourcesContent": ["/** @fileoverview DLX binary execution utilities for Socket ecosystem. */\n\nimport { createHash } from 'node:crypto'\nimport { existsSync, promises as fs } from 'node:fs'\nimport os from 'node:os'\nimport path from 'node:path'\n\nimport { WIN32 } from '#constants/platform'\n\nimport { isDir, readJson, safeDelete } from './fs'\nimport { httpRequest } from './http-request'\nimport { isObjectObject } from './objects'\nimport { normalizePath } from './path'\nimport { getSocketDlxDir } from './paths'\nimport type { SpawnExtra, SpawnOptions } from './spawn'\nimport { spawn } from './spawn'\n\nexport interface DlxBinaryOptions {\n /** URL to download the binary from. */\n url: string\n /** Optional name for the cached binary (defaults to URL hash). */\n name?: string | undefined\n /** Expected checksum (sha256) for verification. */\n checksum?: string | undefined\n /** Cache TTL in milliseconds (default: 7 days). */\n cacheTtl?: number | undefined\n /** Force re-download even if cached. */\n force?: boolean | undefined\n /** Additional spawn options. */\n spawnOptions?: SpawnOptions | undefined\n}\n\nexport interface DlxBinaryResult {\n /** Path to the cached binary. */\n binaryPath: string\n /** Whether the binary was newly downloaded. */\n downloaded: boolean\n /** The spawn promise for the running process. */\n spawnPromise: ReturnType<typeof spawn>\n}\n\n/**\n * Generate a cache directory name from URL and binary name.\n * Uses SHA256 hash to create content-addressed storage.\n * Includes binary name to prevent collisions when multiple binaries\n * are downloaded from the same URL with different names.\n */\nfunction generateCacheKey(url: string, name: string): string {\n return createHash('sha256').update(`${url}:${name}`).digest('hex')\n}\n\n/**\n * Get metadata file path for a cached binary.\n */\nfunction getMetadataPath(cacheEntryPath: string): string {\n return path.join(cacheEntryPath, '.dlx-metadata.json')\n}\n\n/**\n * Check if a cached binary is still valid.\n */\nasync function isCacheValid(\n cacheEntryPath: string,\n cacheTtl: number,\n): Promise<boolean> {\n try {\n const metaPath = getMetadataPath(cacheEntryPath)\n if (!existsSync(metaPath)) {\n return false\n }\n\n const metadata = await readJson(metaPath, { throws: false })\n if (!isObjectObject(metadata)) {\n return false\n }\n const now = Date.now()\n const timestamp = (metadata as Record<string, unknown>)['timestamp']\n // If timestamp is missing or invalid, cache is invalid\n if (typeof timestamp !== 'number' || timestamp <= 0) {\n return false\n }\n const age = now - timestamp\n\n return age < cacheTtl\n } catch {\n return false\n }\n}\n\n/**\n * Download a file from a URL with integrity checking.\n */\nasync function downloadBinary(\n url: string,\n destPath: string,\n checksum?: string | undefined,\n): Promise<string> {\n const response = await httpRequest(url)\n if (!response.ok) {\n throw new Error(\n `Failed to download binary: ${response.status} ${response.statusText}`,\n )\n }\n\n // Create a temporary file first.\n const tempPath = `${destPath}.download`\n const hasher = createHash('sha256')\n\n try {\n // Ensure directory exists.\n await fs.mkdir(path.dirname(destPath), { recursive: true })\n\n // Get the response as a buffer and compute hash.\n const buffer = response.body\n\n // Compute hash.\n hasher.update(buffer)\n const actualChecksum = hasher.digest('hex')\n\n // Verify checksum if provided.\n if (checksum && actualChecksum !== checksum) {\n throw new Error(\n `Checksum mismatch: expected ${checksum}, got ${actualChecksum}`,\n )\n }\n\n // Write to temp file.\n await fs.writeFile(tempPath, buffer)\n\n // Make executable on POSIX systems.\n if (!WIN32) {\n await fs.chmod(tempPath, 0o755)\n }\n\n // Move temp file to final location.\n await fs.rename(tempPath, destPath)\n\n return actualChecksum\n } catch (e) {\n // Clean up temp file on error.\n try {\n await safeDelete(tempPath)\n } catch {\n // Ignore cleanup errors.\n }\n throw e\n }\n}\n\n/**\n * Write metadata for a cached binary.\n */\nasync function writeMetadata(\n cacheEntryPath: string,\n url: string,\n checksum: string,\n): Promise<void> {\n const metaPath = getMetadataPath(cacheEntryPath)\n const metadata = {\n arch: os.arch(),\n checksum,\n platform: os.platform(),\n timestamp: Date.now(),\n url,\n version: '1.0.0',\n }\n await fs.writeFile(metaPath, JSON.stringify(metadata, null, 2))\n}\n\n/**\n * Clean expired entries from the DLX cache.\n */\nexport async function cleanDlxCache(\n maxAge: number = /*@__INLINE__*/ require('#constants/time').DLX_BINARY_CACHE_TTL,\n): Promise<number> {\n const cacheDir = getDlxCachePath()\n\n if (!existsSync(cacheDir)) {\n return 0\n }\n\n let cleaned = 0\n const now = Date.now()\n const entries = await fs.readdir(cacheDir)\n\n for (const entry of entries) {\n const entryPath = path.join(cacheDir, entry)\n const metaPath = getMetadataPath(entryPath)\n\n try {\n // eslint-disable-next-line no-await-in-loop\n if (!(await isDir(entryPath))) {\n continue\n }\n\n // eslint-disable-next-line no-await-in-loop\n const metadata = await readJson(metaPath, { throws: false })\n if (\n !metadata ||\n typeof metadata !== 'object' ||\n Array.isArray(metadata)\n ) {\n continue\n }\n const timestamp = (metadata as Record<string, unknown>)['timestamp']\n // If timestamp is missing or invalid, treat as expired (age = infinity)\n const age =\n typeof timestamp === 'number' && timestamp > 0\n ? now - timestamp\n : Number.POSITIVE_INFINITY\n\n if (age > maxAge) {\n // Remove entire cache entry directory.\n // eslint-disable-next-line no-await-in-loop\n await safeDelete(entryPath, { force: true, recursive: true })\n cleaned += 1\n }\n } catch {\n // If we can't read metadata, check if directory is empty or corrupted.\n try {\n // eslint-disable-next-line no-await-in-loop\n const contents = await fs.readdir(entryPath)\n if (!contents.length) {\n // Remove empty directory.\n // eslint-disable-next-line no-await-in-loop\n await safeDelete(entryPath)\n cleaned += 1\n }\n } catch {}\n }\n }\n\n return cleaned\n}\n\n/**\n * Download and execute a binary from a URL with caching.\n */\nexport async function dlxBinary(\n args: readonly string[] | string[],\n options?: DlxBinaryOptions | undefined,\n spawnExtra?: SpawnExtra | undefined,\n): Promise<DlxBinaryResult> {\n const {\n cacheTtl = /*@__INLINE__*/ require('#constants/time').DLX_BINARY_CACHE_TTL,\n checksum,\n force = false,\n name,\n spawnOptions,\n url,\n } = { __proto__: null, ...options } as DlxBinaryOptions\n\n // Generate cache paths similar to pnpm/npx structure.\n const cacheDir = getDlxCachePath()\n const binaryName = name || `binary-${process.platform}-${os.arch()}`\n const cacheKey = generateCacheKey(url, binaryName)\n const cacheEntryDir = path.join(cacheDir, cacheKey)\n const binaryPath = normalizePath(path.join(cacheEntryDir, binaryName))\n\n let downloaded = false\n let computedChecksum = checksum\n\n // Check if we need to download.\n if (\n !force &&\n existsSync(cacheEntryDir) &&\n (await isCacheValid(cacheEntryDir, cacheTtl))\n ) {\n // Binary is cached and valid, read the checksum from metadata.\n try {\n const metaPath = getMetadataPath(cacheEntryDir)\n const metadata = await readJson(metaPath, { throws: false })\n if (\n metadata &&\n typeof metadata === 'object' &&\n !Array.isArray(metadata) &&\n typeof (metadata as Record<string, unknown>)['checksum'] === 'string'\n ) {\n computedChecksum = (metadata as Record<string, unknown>)[\n 'checksum'\n ] as string\n } else {\n // If metadata is invalid, re-download.\n downloaded = true\n }\n } catch {\n // If we can't read metadata, re-download.\n downloaded = true\n }\n } else {\n downloaded = true\n }\n\n if (downloaded) {\n // Ensure cache directory exists.\n await fs.mkdir(cacheEntryDir, { recursive: true })\n\n // Download the binary.\n computedChecksum = await downloadBinary(url, binaryPath, checksum)\n await writeMetadata(cacheEntryDir, url, computedChecksum || '')\n }\n\n // Execute the binary.\n // On Windows, script files (.bat, .cmd, .ps1) require shell: true because\n // they are not executable on their own and must be run through cmd.exe.\n // Note: .exe files are actual binaries and don't need shell mode.\n const needsShell = WIN32 && /\\.(?:bat|cmd|ps1)$/i.test(binaryPath)\n // Windows cmd.exe PATH resolution behavior:\n // When shell: true on Windows with .cmd/.bat/.ps1 files, spawn will automatically\n // strip the full path down to just the basename without extension (e.g.,\n // C:\\cache\\test.cmd becomes just \"test\"). Windows cmd.exe then searches for \"test\"\n // in directories listed in PATH, trying each extension from PATHEXT environment\n // variable (.COM, .EXE, .BAT, .CMD, etc.) until it finds a match.\n //\n // Since our binaries are downloaded to a custom cache directory that's not in PATH\n // (unlike system package managers like npm/pnpm/yarn which are already in PATH),\n // we must prepend the cache directory to PATH so cmd.exe can locate the binary.\n //\n // This approach is consistent with how other tools handle Windows command execution:\n // - npm's promise-spawn: uses which.sync() to find commands in PATH\n // - cross-spawn: spawns cmd.exe with escaped arguments\n // - Node.js spawn with shell: true: delegates to cmd.exe which uses PATH\n const finalSpawnOptions = needsShell\n ? {\n ...spawnOptions,\n env: {\n ...spawnOptions?.env,\n PATH: `${cacheEntryDir}${path.delimiter}${process.env['PATH'] || ''}`,\n },\n shell: true,\n }\n : spawnOptions\n const spawnPromise = spawn(binaryPath, args, finalSpawnOptions, spawnExtra)\n\n return {\n binaryPath,\n downloaded,\n spawnPromise,\n }\n}\n\n/**\n * Get the DLX binary cache directory path.\n * Returns normalized path for cross-platform compatibility.\n * Uses same directory as dlx-package for unified DLX storage.\n */\nexport function getDlxCachePath(): string {\n return getSocketDlxDir()\n}\n\n/**\n * Get information about cached binaries.\n */\nexport async function listDlxCache(): Promise<\n Array<{\n age: number\n arch: string\n checksum: string\n name: string\n platform: string\n size: number\n url: string\n }>\n> {\n const cacheDir = getDlxCachePath()\n\n if (!existsSync(cacheDir)) {\n return []\n }\n\n const results = []\n const now = Date.now()\n const entries = await fs.readdir(cacheDir)\n\n for (const entry of entries) {\n const entryPath = path.join(cacheDir, entry)\n try {\n // eslint-disable-next-line no-await-in-loop\n if (!(await isDir(entryPath))) {\n continue\n }\n\n const metaPath = getMetadataPath(entryPath)\n // eslint-disable-next-line no-await-in-loop\n const metadata = await readJson(metaPath, { throws: false })\n if (\n !metadata ||\n typeof metadata !== 'object' ||\n Array.isArray(metadata)\n ) {\n continue\n }\n\n // Find the binary file in the directory.\n // eslint-disable-next-line no-await-in-loop\n const files = await fs.readdir(entryPath)\n const binaryFile = files.find(f => !f.startsWith('.'))\n\n if (binaryFile) {\n const binaryPath = path.join(entryPath, binaryFile)\n // eslint-disable-next-line no-await-in-loop\n const binaryStats = await fs.stat(binaryPath)\n\n const metaObj = metadata as Record<string, unknown>\n results.push({\n age: now - ((metaObj['timestamp'] as number) || 0),\n arch: (metaObj['arch'] as string) || 'unknown',\n checksum: (metaObj['checksum'] as string) || '',\n name: binaryFile,\n platform: (metaObj['platform'] as string) || 'unknown',\n size: binaryStats.size,\n url: (metaObj['url'] as string) || '',\n })\n }\n } catch {}\n }\n\n return results\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["dlx_binary_exports", "__export", "cleanDlxCache", "dlxBinary", "getDlxCachePath", "listDlxCache", "__toCommonJS", "import_node_crypto", "import_node_fs", "import_node_os", "import_node_path", "import_platform", "import_fs", "import_http_request", "import_objects", "import_path", "import_paths", "import_spawn", "generateCacheKey", "url", "name", "getMetadataPath", "cacheEntryPath", "path", "isCacheValid", "cacheTtl", "metaPath", "metadata", "now", "timestamp", "downloadBinary", "destPath", "checksum", "response", "tempPath", "hasher", "fs", "buffer", "actualChecksum", "e", "writeMetadata", "os", "maxAge", "cacheDir", "cleaned", "entries", "entry", "entryPath", "args", "options", "spawnExtra", "force", "spawnOptions", "binaryName", "cacheKey", "cacheEntryDir", "binaryPath", "downloaded", "computedChecksum", "finalSpawnOptions", "spawnPromise", "results", "binaryFile", "f", "binaryStats", "metaObj"]
7
7
  }
@@ -1,5 +1,13 @@
1
1
  import type { SpawnExtra, SpawnOptions } from './spawn';
2
2
  import { spawn } from './spawn';
3
+ export interface DownloadPackageResult {
4
+ /** Path to the installed package directory. */
5
+ packageDir: string;
6
+ /** Path to the binary. */
7
+ binaryPath: string;
8
+ /** Whether the package was newly installed. */
9
+ installed: boolean;
10
+ }
3
11
  export interface DlxPackageOptions {
4
12
  /**
5
13
  * Package to install (e.g., '@cyclonedx/cdxgen@10.0.0').
@@ -31,5 +39,48 @@ export interface DlxPackageResult {
31
39
  * our own cache directory (~/.socket/_dlx) and installation logic.
32
40
  *
33
41
  * Auto-forces reinstall for version ranges to get latest within range.
42
+ *
43
+ * @example
44
+ * ```typescript
45
+ * // Download and execute cdxgen
46
+ * const result = await dlxPackage(
47
+ * ['--version'],
48
+ * { package: '@cyclonedx/cdxgen@10.0.0' }
49
+ * )
50
+ * await result.spawnPromise
51
+ * ```
34
52
  */
35
53
  export declare function dlxPackage(args: readonly string[] | string[], options?: DlxPackageOptions | undefined, spawnExtra?: SpawnExtra | undefined): Promise<DlxPackageResult>;
54
+ /**
55
+ * Download and install a package without executing it.
56
+ * This is useful for self-update or when you need the package files
57
+ * but don't want to run the binary immediately.
58
+ *
59
+ * @example
60
+ * ```typescript
61
+ * // Install @socketsecurity/cli without running it
62
+ * const result = await downloadPackage({
63
+ * package: '@socketsecurity/cli@1.2.0',
64
+ * force: true
65
+ * })
66
+ * console.log('Installed to:', result.packageDir)
67
+ * console.log('Binary at:', result.binaryPath)
68
+ * ```
69
+ */
70
+ export declare function downloadPackage(options: DlxPackageOptions): Promise<DownloadPackageResult>;
71
+ /**
72
+ * Execute a package's binary.
73
+ * The package must already be installed (use downloadPackage first).
74
+ *
75
+ * @example
76
+ * ```typescript
77
+ * // Execute an already-installed package
78
+ * const downloaded = await downloadPackage({ package: 'cowsay@1.5.0' })
79
+ * const result = await executePackage(
80
+ * downloaded.binaryPath,
81
+ * ['Hello World'],
82
+ * { stdio: 'inherit' }
83
+ * )
84
+ * ```
85
+ */
86
+ export declare function executePackage(binaryPath: string, args: readonly string[] | string[], spawnOptions?: SpawnOptions | undefined, spawnExtra?: SpawnExtra | undefined): ReturnType<typeof spawn>;
@@ -1,3 +1,3 @@
1
1
  /* Socket Lib - Built with esbuild */
2
- var O=Object.create;var l=Object.defineProperty;var v=Object.getOwnPropertyDescriptor;var R=Object.getOwnPropertyNames;var _=Object.getPrototypeOf,J=Object.prototype.hasOwnProperty;var $=(n,e)=>{for(var t in e)l(n,t,{get:e[t],enumerable:!0})},k=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of R(e))!J.call(n,o)&&o!==t&&l(n,o,{get:()=>e[o],enumerable:!(r=v(e,o))||r.enumerable});return n};var E=(n,e,t)=>(t=n!=null?O(_(n)):{},k(e||!n||!n.__esModule?l(t,"default",{value:n,enumerable:!0}):t,n)),I=n=>k(l({},"__esModule",{value:!0}),n);var z={};$(z,{dlxPackage:()=>q});module.exports=I(z);var P=require("node:crypto"),f=require("node:fs"),s=E(require("node:path")),h=require("./constants/platform"),x=require("./fs"),p=require("./path"),y=require("./paths"),u=require("./spawn");const N=/[~^><=xX* ]|\|\|/;function A(n){return(0,P.createHash)("sha256").update(n).digest("hex").slice(0,16)}function K(n){if(n.startsWith("@")){const t=n.split("@");return t.length===3?{name:t[1],version:t[2]}:t.length===2?{name:`@${t[1]}`,version:void 0}:{name:`@${t[1]}`,version:t[2]}}const e=n.lastIndexOf("@");return e===-1?{name:n,version:void 0}:{name:n.slice(0,e),version:n.slice(e+1)}}async function V(n,e,t){const r=A(n),o=(0,p.normalizePath)(s.default.join((0,y.getSocketDlxDir)(),r)),c=(0,p.normalizePath)(s.default.join(o,"node_modules",e));if(!t&&(0,f.existsSync)(c)){const i=s.default.join(c,"package.json");if((0,f.existsSync)(i))return{installed:!1,packageDir:o}}return await(0,u.spawn)("npm",["install","--prefix",o,"--no-save","--no-package-lock","--no-audit","--no-fund",n],{stdio:"pipe"}),{installed:!0,packageDir:o}}function W(n,e,t){const r=(0,p.normalizePath)(s.default.join(n,"node_modules",e)),o=s.default.join(r,"package.json"),i=(0,x.readJsonSync)(o).bin;let a;if(typeof i=="string")a=i;else if(typeof i=="object"&&i!==null){const d=t||e.split("/").pop();a=i[d]}if(!a)throw new Error(`No binary found for package "${e}"`);return(0,p.normalizePath)(s.default.join(r,a))}async function q(n,e,t){const{force:r,package:o,spawnOptions:c}={__proto__:null,...e},{name:i,version:a}=K(o),d=a!==void 0&&N.test(a),w=r!==void 0?r:d,D=a?`${i}@${a}`:i,{installed:b,packageDir:m}=await V(D,i,w),g=W(m,i);if(!h.WIN32&&(0,f.existsSync)(g)){const{chmodSync:j}=require("node:fs");try{j(g,493)}catch{}}const S=(0,u.spawn)(g,n,c,t);return{binaryPath:g,installed:b,packageDir:m,spawnPromise:S}}0&&(module.exports={dlxPackage});
2
+ var j=Object.create;var l=Object.defineProperty;var v=Object.getOwnPropertyDescriptor;var _=Object.getOwnPropertyNames;var E=Object.getPrototypeOf,J=Object.prototype.hasOwnProperty;var $=(n,e)=>{for(var t in e)l(n,t,{get:e[t],enumerable:!0})},m=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of _(e))!J.call(n,a)&&a!==t&&l(n,a,{get:()=>e[a],enumerable:!(r=v(e,a))||r.enumerable});return n};var k=(n,e,t)=>(t=n!=null?j(E(n)):{},m(e||!n||!n.__esModule?l(t,"default",{value:n,enumerable:!0}):t,n)),I=n=>m(l({},"__esModule",{value:!0}),n);var W={};$(W,{dlxPackage:()=>V,downloadPackage:()=>S,executePackage:()=>O});module.exports=I(W);var P=require("node:crypto"),p=require("node:fs"),s=k(require("node:path")),h=k(require("./external/pacote")),w=require("./constants/platform"),x=require("./constants/packages"),y=require("./fs"),g=require("./path"),D=require("./paths"),b=require("./spawn");const N=/[~^><=xX* ]|\|\|/;function C(n){return(0,P.createHash)("sha256").update(n).digest("hex").slice(0,16)}function A(n){if(n.startsWith("@")){const t=n.split("@");return t.length===3?{name:t[1],version:t[2]}:t.length===2?{name:`@${t[1]}`,version:void 0}:{name:`@${t[1]}`,version:t[2]}}const e=n.lastIndexOf("@");return e===-1?{name:n,version:void 0}:{name:n.slice(0,e),version:n.slice(e+1)}}async function K(n,e,t){const r=C(n),a=(0,g.normalizePath)(s.default.join((0,D.getSocketDlxDir)(),r)),c=(0,g.normalizePath)(s.default.join(a,"node_modules",e));if(!t&&(0,p.existsSync)(c)){const i=s.default.join(c,"package.json");if((0,p.existsSync)(i))return{installed:!1,packageDir:a}}await p.promises.mkdir(a,{recursive:!0});const o=(0,x.getPacoteCachePath)();return await h.default.extract(n,c,{cache:o||s.default.join(a,".cache")}),{installed:!0,packageDir:a}}function T(n,e,t){const r=(0,g.normalizePath)(s.default.join(n,"node_modules",e)),a=s.default.join(r,"package.json"),o=(0,y.readJsonSync)(a).bin;let i;if(typeof o=="string")i=o;else if(typeof o=="object"&&o!==null){const d=t||e.split("/").pop();i=o[d]}if(!i)throw new Error(`No binary found for package "${e}"`);return(0,g.normalizePath)(s.default.join(r,i))}async function V(n,e,t){const r=await S(e),a=O(r.binaryPath,n,e?.spawnOptions,t);return{...r,spawnPromise:a}}async function S(n){const{force:e,package:t}={__proto__:null,...n},{name:r,version:a}=A(t),c=a!==void 0&&N.test(a),o=e!==void 0?e:c,i=a?`${r}@${a}`:r,{installed:d,packageDir:u}=await K(i,r,o),f=T(u,r);if(!w.WIN32&&(0,p.existsSync)(f)){const{chmodSync:R}=require("node:fs");try{R(f,493)}catch{}}return{binaryPath:f,installed:d,packageDir:u}}function O(n,e,t,r){return(0,b.spawn)(n,e,t,r)}0&&(module.exports={dlxPackage,downloadPackage,executePackage});
3
3
  //# sourceMappingURL=dlx-package.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/dlx-package.ts"],
4
- "sourcesContent": ["/**\n * @fileoverview DLX package execution - Install and execute npm packages.\n *\n * This module provides functionality to install and execute npm packages\n * in the ~/.socket/_dlx directory, similar to npx but with Socket's own cache.\n *\n * Uses content-addressed storage like npm's _npx:\n * - Hash is generated from package spec (name@version)\n * - Each unique spec gets its own directory: ~/.socket/_dlx/<hash>/\n * - Allows caching multiple versions of the same package\n *\n * Version range handling:\n * - Exact versions (1.0.0) use cache if available\n * - Range versions (^1.0.0, ~1.0.0) auto-force to get latest within range\n * - User can override with explicit force: false\n *\n * Key difference from dlx-binary.ts:\n * - dlx-binary.ts: Downloads standalone binaries from URLs\n * - dlx-package.ts: Installs npm packages from registries\n */\n\nimport { createHash } from 'node:crypto'\nimport { existsSync } from 'node:fs'\nimport path from 'node:path'\n\nimport { WIN32 } from './constants/platform'\nimport { readJsonSync } from './fs'\nimport { normalizePath } from './path'\nimport { getSocketDlxDir } from './paths'\nimport type { SpawnExtra, SpawnOptions } from './spawn'\nimport { spawn } from './spawn'\n\n/**\n * Regex to check if a version string contains range operators.\n * Matches any version with range operators: ~, ^, >, <, =, x, X, *, spaces, or ||.\n */\nconst rangeOperatorsRegExp = /[~^><=xX* ]|\\|\\|/\n\nexport interface DlxPackageOptions {\n /**\n * Package to install (e.g., '@cyclonedx/cdxgen@10.0.0').\n */\n package: string\n /**\n * Force reinstallation even if package exists.\n */\n force?: boolean | undefined\n /**\n * Additional spawn options for the execution.\n */\n spawnOptions?: SpawnOptions | undefined\n}\n\nexport interface DlxPackageResult {\n /** Path to the installed package directory. */\n packageDir: string\n /** Path to the binary that was executed. */\n binaryPath: string\n /** Whether the package was newly installed. */\n installed: boolean\n /** The spawn promise for the running process. */\n spawnPromise: ReturnType<typeof spawn>\n}\n\n/**\n * Generate a cache key from package spec, similar to npm's _npx.\n * Uses first 16 hex characters of SHA256 hash.\n */\nfunction generatePackageCacheKey(packageSpec: string): string {\n return createHash('sha256').update(packageSpec).digest('hex').slice(0, 16)\n}\n\n/**\n * Parse package spec into name and version.\n * Examples:\n * - 'lodash@4.17.21' \u2192 { name: 'lodash', version: '4.17.21' }\n * - '@scope/pkg@1.0.0' \u2192 { name: '@scope/pkg', version: '1.0.0' }\n * - 'lodash' \u2192 { name: 'lodash', version: undefined }\n */\nfunction parsePackageSpec(spec: string): {\n name: string\n version: string | undefined\n} {\n // Handle scoped packages (@scope/name@version).\n if (spec.startsWith('@')) {\n const parts = spec.split('@')\n if (parts.length === 3) {\n // @scope@version -> Invalid, but handle gracefully.\n return { name: parts[1], version: parts[2] }\n }\n if (parts.length === 2) {\n // @scope/name with no version.\n return { name: `@${parts[1]}`, version: undefined }\n }\n // @scope/name@version.\n const scopeAndName = `@${parts[1]}`\n return { name: scopeAndName, version: parts[2] }\n }\n\n // Handle unscoped packages (name@version).\n const atIndex = spec.lastIndexOf('@')\n if (atIndex === -1) {\n return { name: spec, version: undefined }\n }\n\n return {\n name: spec.slice(0, atIndex),\n version: spec.slice(atIndex + 1),\n }\n}\n\n/**\n * Install package to ~/.socket/_dlx/<hash>/ if not already installed.\n */\nasync function ensurePackageInstalled(\n packageSpec: string,\n packageName: string,\n force: boolean,\n): Promise<{ installed: boolean; packageDir: string }> {\n const cacheKey = generatePackageCacheKey(packageSpec)\n const packageDir = normalizePath(path.join(getSocketDlxDir(), cacheKey))\n const installedDir = normalizePath(\n path.join(packageDir, 'node_modules', packageName),\n )\n\n // Check if already installed (unless force).\n if (!force && existsSync(installedDir)) {\n // Verify package.json exists.\n const pkgJsonPath = path.join(installedDir, 'package.json')\n if (existsSync(pkgJsonPath)) {\n return { installed: false, packageDir }\n }\n }\n\n // Use npm install --prefix to install to specific directory.\n await spawn(\n 'npm',\n [\n 'install',\n '--prefix',\n packageDir,\n '--no-save',\n '--no-package-lock',\n '--no-audit',\n '--no-fund',\n packageSpec,\n ],\n {\n stdio: 'pipe',\n },\n )\n\n return { installed: true, packageDir }\n}\n\n/**\n * Find the binary path for an installed package.\n */\nfunction findBinaryPath(\n packageDir: string,\n packageName: string,\n binaryName?: string,\n): string {\n const installedDir = normalizePath(\n path.join(packageDir, 'node_modules', packageName),\n )\n const pkgJsonPath = path.join(installedDir, 'package.json')\n\n // Read package.json to find bin entry.\n const pkgJson = readJsonSync(pkgJsonPath) as Record<string, unknown>\n const bin = pkgJson['bin']\n\n let binPath: string | undefined\n\n if (typeof bin === 'string') {\n // Single binary.\n binPath = bin\n } else if (typeof bin === 'object' && bin !== null) {\n // Multiple binaries - use binaryName or package name.\n const binName = binaryName || packageName.split('/').pop()\n binPath = (bin as Record<string, string>)[binName!]\n }\n\n if (!binPath) {\n throw new Error(`No binary found for package \"${packageName}\"`)\n }\n\n return normalizePath(path.join(installedDir, binPath))\n}\n\n/**\n * Execute a package via DLX - install if needed and run its binary.\n *\n * This is the Socket equivalent of npx/pnpm dlx/yarn dlx, but using\n * our own cache directory (~/.socket/_dlx) and installation logic.\n *\n * Auto-forces reinstall for version ranges to get latest within range.\n */\nexport async function dlxPackage(\n args: readonly string[] | string[],\n options?: DlxPackageOptions | undefined,\n spawnExtra?: SpawnExtra | undefined,\n): Promise<DlxPackageResult> {\n const {\n force: userForce,\n package: packageSpec,\n spawnOptions,\n } = { __proto__: null, ...options } as DlxPackageOptions\n\n // Parse package spec.\n const { name: packageName, version: packageVersion } =\n parsePackageSpec(packageSpec)\n\n // Auto-force for version ranges to get latest within range.\n // User can still override with explicit force: false if they want cache.\n const isVersionRange =\n packageVersion !== undefined && rangeOperatorsRegExp.test(packageVersion)\n const force = userForce !== undefined ? userForce : isVersionRange\n\n // Build full package spec for installation.\n const fullPackageSpec = packageVersion\n ? `${packageName}@${packageVersion}`\n : packageName\n\n // Ensure package is installed.\n const { installed, packageDir } = await ensurePackageInstalled(\n fullPackageSpec,\n packageName,\n force,\n )\n\n // Find binary path.\n const binaryPath = findBinaryPath(packageDir, packageName)\n\n // Make binary executable on Unix systems.\n if (!WIN32 && existsSync(binaryPath)) {\n const { chmodSync } = require('node:fs')\n try {\n chmodSync(binaryPath, 0o755)\n } catch {\n // Ignore chmod errors.\n }\n }\n\n // Execute binary.\n const spawnPromise = spawn(binaryPath, args, spawnOptions, spawnExtra)\n\n return {\n binaryPath,\n installed,\n packageDir,\n spawnPromise,\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["dlx_package_exports", "__export", "dlxPackage", "__toCommonJS", "import_node_crypto", "import_node_fs", "import_node_path", "import_platform", "import_fs", "import_path", "import_paths", "import_spawn", "rangeOperatorsRegExp", "generatePackageCacheKey", "packageSpec", "parsePackageSpec", "spec", "parts", "atIndex", "ensurePackageInstalled", "packageName", "force", "cacheKey", "packageDir", "path", "installedDir", "pkgJsonPath", "findBinaryPath", "binaryName", "bin", "binPath", "binName", "args", "options", "spawnExtra", "userForce", "spawnOptions", "packageVersion", "isVersionRange", "fullPackageSpec", "installed", "binaryPath", "chmodSync", "spawnPromise"]
4
+ "sourcesContent": ["/**\n * @fileoverview DLX package execution - Install and execute npm packages.\n *\n * This module provides functionality to install and execute npm packages\n * in the ~/.socket/_dlx directory, similar to npx but with Socket's own cache.\n *\n * Uses content-addressed storage like npm's _npx:\n * - Hash is generated from package spec (name@version)\n * - Each unique spec gets its own directory: ~/.socket/_dlx/<hash>/\n * - Allows caching multiple versions of the same package\n *\n * Version range handling:\n * - Exact versions (1.0.0) use cache if available\n * - Range versions (^1.0.0, ~1.0.0) auto-force to get latest within range\n * - User can override with explicit force: false\n *\n * Key difference from dlx-binary.ts:\n * - dlx-binary.ts: Downloads standalone binaries from URLs\n * - dlx-package.ts: Installs npm packages from registries\n *\n * Implementation:\n * - Uses pacote for package installation (no npm CLI required)\n * - Split into downloadPackage() and executePackage() for flexibility\n * - dlxPackage() combines both for convenience\n */\n\nimport { createHash } from 'node:crypto'\nimport { existsSync, promises as fs } from 'node:fs'\nimport path from 'node:path'\n\nimport pacote from './external/pacote'\nimport { WIN32 } from './constants/platform'\nimport { getPacoteCachePath } from './constants/packages'\nimport { readJsonSync } from './fs'\nimport { normalizePath } from './path'\nimport { getSocketDlxDir } from './paths'\nimport type { SpawnExtra, SpawnOptions } from './spawn'\nimport { spawn } from './spawn'\n\n/**\n * Regex to check if a version string contains range operators.\n * Matches any version with range operators: ~, ^, >, <, =, x, X, *, spaces, or ||.\n */\nconst rangeOperatorsRegExp = /[~^><=xX* ]|\\|\\|/\n\nexport interface DownloadPackageResult {\n /** Path to the installed package directory. */\n packageDir: string\n /** Path to the binary. */\n binaryPath: string\n /** Whether the package was newly installed. */\n installed: boolean\n}\n\nexport interface DlxPackageOptions {\n /**\n * Package to install (e.g., '@cyclonedx/cdxgen@10.0.0').\n */\n package: string\n /**\n * Force reinstallation even if package exists.\n */\n force?: boolean | undefined\n /**\n * Additional spawn options for the execution.\n */\n spawnOptions?: SpawnOptions | undefined\n}\n\nexport interface DlxPackageResult {\n /** Path to the installed package directory. */\n packageDir: string\n /** Path to the binary that was executed. */\n binaryPath: string\n /** Whether the package was newly installed. */\n installed: boolean\n /** The spawn promise for the running process. */\n spawnPromise: ReturnType<typeof spawn>\n}\n\n/**\n * Generate a cache key from package spec, similar to npm's _npx.\n * Uses first 16 hex characters of SHA256 hash.\n */\nfunction generatePackageCacheKey(packageSpec: string): string {\n return createHash('sha256').update(packageSpec).digest('hex').slice(0, 16)\n}\n\n/**\n * Parse package spec into name and version.\n * Examples:\n * - 'lodash@4.17.21' \u2192 { name: 'lodash', version: '4.17.21' }\n * - '@scope/pkg@1.0.0' \u2192 { name: '@scope/pkg', version: '1.0.0' }\n * - 'lodash' \u2192 { name: 'lodash', version: undefined }\n */\nfunction parsePackageSpec(spec: string): {\n name: string\n version: string | undefined\n} {\n // Handle scoped packages (@scope/name@version).\n if (spec.startsWith('@')) {\n const parts = spec.split('@')\n if (parts.length === 3) {\n // @scope@version -> Invalid, but handle gracefully.\n return { name: parts[1], version: parts[2] }\n }\n if (parts.length === 2) {\n // @scope/name with no version.\n return { name: `@${parts[1]}`, version: undefined }\n }\n // @scope/name@version.\n const scopeAndName = `@${parts[1]}`\n return { name: scopeAndName, version: parts[2] }\n }\n\n // Handle unscoped packages (name@version).\n const atIndex = spec.lastIndexOf('@')\n if (atIndex === -1) {\n return { name: spec, version: undefined }\n }\n\n return {\n name: spec.slice(0, atIndex),\n version: spec.slice(atIndex + 1),\n }\n}\n\n/**\n * Install package to ~/.socket/_dlx/<hash>/ if not already installed.\n * Uses pacote for installation (no npm CLI required).\n */\nasync function ensurePackageInstalled(\n packageSpec: string,\n packageName: string,\n force: boolean,\n): Promise<{ installed: boolean; packageDir: string }> {\n const cacheKey = generatePackageCacheKey(packageSpec)\n const packageDir = normalizePath(path.join(getSocketDlxDir(), cacheKey))\n const installedDir = normalizePath(\n path.join(packageDir, 'node_modules', packageName),\n )\n\n // Check if already installed (unless force).\n if (!force && existsSync(installedDir)) {\n // Verify package.json exists.\n const pkgJsonPath = path.join(installedDir, 'package.json')\n if (existsSync(pkgJsonPath)) {\n return { installed: false, packageDir }\n }\n }\n\n // Ensure package directory exists.\n await fs.mkdir(packageDir, { recursive: true })\n\n // Use pacote to extract the package.\n // Pacote leverages npm cache when available but doesn't require npm CLI.\n const pacoteCachePath = getPacoteCachePath()\n await pacote.extract(packageSpec, installedDir, {\n // Use consistent pacote cache path (respects npm cache locations when available).\n cache: pacoteCachePath || path.join(packageDir, '.cache'),\n })\n\n return { installed: true, packageDir }\n}\n\n/**\n * Find the binary path for an installed package.\n */\nfunction findBinaryPath(\n packageDir: string,\n packageName: string,\n binaryName?: string,\n): string {\n const installedDir = normalizePath(\n path.join(packageDir, 'node_modules', packageName),\n )\n const pkgJsonPath = path.join(installedDir, 'package.json')\n\n // Read package.json to find bin entry.\n const pkgJson = readJsonSync(pkgJsonPath) as Record<string, unknown>\n const bin = pkgJson['bin']\n\n let binPath: string | undefined\n\n if (typeof bin === 'string') {\n // Single binary.\n binPath = bin\n } else if (typeof bin === 'object' && bin !== null) {\n // Multiple binaries - use binaryName or package name.\n const binName = binaryName || packageName.split('/').pop()\n binPath = (bin as Record<string, string>)[binName!]\n }\n\n if (!binPath) {\n throw new Error(`No binary found for package \"${packageName}\"`)\n }\n\n return normalizePath(path.join(installedDir, binPath))\n}\n\n/**\n * Execute a package via DLX - install if needed and run its binary.\n *\n * This is the Socket equivalent of npx/pnpm dlx/yarn dlx, but using\n * our own cache directory (~/.socket/_dlx) and installation logic.\n *\n * Auto-forces reinstall for version ranges to get latest within range.\n *\n * @example\n * ```typescript\n * // Download and execute cdxgen\n * const result = await dlxPackage(\n * ['--version'],\n * { package: '@cyclonedx/cdxgen@10.0.0' }\n * )\n * await result.spawnPromise\n * ```\n */\nexport async function dlxPackage(\n args: readonly string[] | string[],\n options?: DlxPackageOptions | undefined,\n spawnExtra?: SpawnExtra | undefined,\n): Promise<DlxPackageResult> {\n // Download the package.\n const downloadResult = await downloadPackage(options!)\n\n // Execute the binary.\n const spawnPromise = executePackage(\n downloadResult.binaryPath,\n args,\n options?.spawnOptions,\n spawnExtra,\n )\n\n return {\n ...downloadResult,\n spawnPromise,\n }\n}\n\n/**\n * Download and install a package without executing it.\n * This is useful for self-update or when you need the package files\n * but don't want to run the binary immediately.\n *\n * @example\n * ```typescript\n * // Install @socketsecurity/cli without running it\n * const result = await downloadPackage({\n * package: '@socketsecurity/cli@1.2.0',\n * force: true\n * })\n * console.log('Installed to:', result.packageDir)\n * console.log('Binary at:', result.binaryPath)\n * ```\n */\nexport async function downloadPackage(\n options: DlxPackageOptions,\n): Promise<DownloadPackageResult> {\n const { force: userForce, package: packageSpec } = {\n __proto__: null,\n ...options,\n } as DlxPackageOptions\n\n // Parse package spec.\n const { name: packageName, version: packageVersion } =\n parsePackageSpec(packageSpec)\n\n // Auto-force for version ranges to get latest within range.\n // User can still override with explicit force: false if they want cache.\n const isVersionRange =\n packageVersion !== undefined && rangeOperatorsRegExp.test(packageVersion)\n const force = userForce !== undefined ? userForce : isVersionRange\n\n // Build full package spec for installation.\n const fullPackageSpec = packageVersion\n ? `${packageName}@${packageVersion}`\n : packageName\n\n // Ensure package is installed.\n const { installed, packageDir } = await ensurePackageInstalled(\n fullPackageSpec,\n packageName,\n force,\n )\n\n // Find binary path.\n const binaryPath = findBinaryPath(packageDir, packageName)\n\n // Make binary executable on Unix systems.\n if (!WIN32 && existsSync(binaryPath)) {\n const { chmodSync } = require('node:fs')\n try {\n chmodSync(binaryPath, 0o755)\n } catch {\n // Ignore chmod errors.\n }\n }\n\n return {\n binaryPath,\n installed,\n packageDir,\n }\n}\n\n/**\n * Execute a package's binary.\n * The package must already be installed (use downloadPackage first).\n *\n * @example\n * ```typescript\n * // Execute an already-installed package\n * const downloaded = await downloadPackage({ package: 'cowsay@1.5.0' })\n * const result = await executePackage(\n * downloaded.binaryPath,\n * ['Hello World'],\n * { stdio: 'inherit' }\n * )\n * ```\n */\nexport function executePackage(\n binaryPath: string,\n args: readonly string[] | string[],\n spawnOptions?: SpawnOptions | undefined,\n spawnExtra?: SpawnExtra | undefined,\n): ReturnType<typeof spawn> {\n return spawn(binaryPath, args, spawnOptions, spawnExtra)\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["dlx_package_exports", "__export", "dlxPackage", "downloadPackage", "executePackage", "__toCommonJS", "import_node_crypto", "import_node_fs", "import_node_path", "import_pacote", "import_platform", "import_packages", "import_fs", "import_path", "import_paths", "import_spawn", "rangeOperatorsRegExp", "generatePackageCacheKey", "packageSpec", "parsePackageSpec", "spec", "parts", "atIndex", "ensurePackageInstalled", "packageName", "force", "cacheKey", "packageDir", "path", "installedDir", "pkgJsonPath", "fs", "pacoteCachePath", "pacote", "findBinaryPath", "binaryName", "bin", "binPath", "binName", "args", "options", "spawnExtra", "downloadResult", "spawnPromise", "userForce", "packageVersion", "isVersionRange", "fullPackageSpec", "installed", "binaryPath", "chmodSync", "spawnOptions"]
7
7
  }
package/dist/dlx.d.ts CHANGED
@@ -38,6 +38,21 @@ export declare function getDlxPackageJsonPath(packageName: string): string;
38
38
  * Get the node_modules directory for a DLX package installation.
39
39
  */
40
40
  export declare function getDlxPackageNodeModulesDir(packageName: string): string;
41
+ /**
42
+ * Check if a file path is within the Socket DLX directory.
43
+ * This is useful for determining if a binary or file is managed by Socket's DLX system.
44
+ *
45
+ * @param filePath - Absolute or relative path to check
46
+ * @returns true if the path is within ~/.socket/_dlx/, false otherwise
47
+ *
48
+ * @example
49
+ * ```typescript
50
+ * isInSocketDlx('/home/user/.socket/_dlx/abc123/bin/socket') // true
51
+ * isInSocketDlx('/usr/local/bin/socket') // false
52
+ * isInSocketDlx(process.argv[0]) // Check if current binary is in DLX
53
+ * ```
54
+ */
55
+ export declare function isInSocketDlx(filePath: string): boolean;
41
56
  /**
42
57
  * Check if a package is installed in DLX.
43
58
  */
package/dist/dlx.js CHANGED
@@ -1,3 +1,3 @@
1
1
  /* Socket Lib - Built with esbuild */
2
- var x=Object.defineProperty;var P=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var v=Object.prototype.hasOwnProperty;var w=(r,t)=>{for(var e in t)x(r,e,{get:t[e],enumerable:!0})},S=(r,t,e,c)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of k(t))!v.call(r,i)&&i!==e&&x(r,i,{get:()=>t[i],enumerable:!(c=P(t,i))||c.enumerable});return r};var j=r=>S(x({},"__esModule",{value:!0}),r);var $={};w($,{clearDlx:()=>E,clearDlxSync:()=>b,dlxDirExists:()=>q,dlxDirExistsAsync:()=>A,ensureDlxDir:()=>F,ensureDlxDirSync:()=>I,getDlxInstalledPackageDir:()=>l,getDlxPackageDir:()=>p,getDlxPackageJsonPath:()=>L,getDlxPackageNodeModulesDir:()=>D,isDlxPackageInstalled:()=>X,isDlxPackageInstalledAsync:()=>_,listDlxPackages:()=>m,listDlxPackagesAsync:()=>d,removeDlxPackage:()=>y,removeDlxPackageSync:()=>h});module.exports=j($);var n=require("node:fs"),s=require("./fs"),a=require("./path"),o=require("./paths"),g=require("./promises");let f;function u(){return f===void 0&&(f=require("node:path")),f}async function E(){const r=await d();await(0,g.pEach)(r,t=>y(t))}function b(){const r=m();for(const t of r)h(t)}function q(){return(0,n.existsSync)((0,o.getSocketDlxDir)())}async function A(){try{return await n.promises.access((0,o.getSocketDlxDir)()),!0}catch{return!1}}async function F(){await n.promises.mkdir((0,o.getSocketDlxDir)(),{recursive:!0})}function I(){const{mkdirSync:r}=require("node:fs");r((0,o.getSocketDlxDir)(),{recursive:!0})}function l(r){return(0,a.normalizePath)(u().join(D(r),r))}function p(r){return(0,a.normalizePath)(u().join((0,o.getSocketDlxDir)(),r))}function L(r){return(0,a.normalizePath)(u().join(l(r),"package.json"))}function D(r){return(0,a.normalizePath)(u().join(p(r),"node_modules"))}function X(r){return(0,n.existsSync)(l(r))}async function _(r){try{return await n.promises.access(l(r)),!0}catch{return!1}}function m(){try{return(0,s.readDirNamesSync)((0,o.getSocketDlxDir)(),{sort:!0})}catch{return[]}}async function d(){try{return(await n.promises.readdir((0,o.getSocketDlxDir)(),{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name).sort()}catch{return[]}}async function y(r){const t=p(r);try{await(0,s.safeDelete)(t,{recursive:!0,force:!0})}catch(e){throw new Error(`Failed to remove DLX package "${r}"`,{cause:e})}}function h(r){const{rmSync:t}=require("node:fs"),e=p(r);try{t(e,{recursive:!0,force:!0})}catch(c){throw new Error(`Failed to remove DLX package "${r}"`,{cause:c})}}0&&(module.exports={clearDlx,clearDlxSync,dlxDirExists,dlxDirExistsAsync,ensureDlxDir,ensureDlxDirSync,getDlxInstalledPackageDir,getDlxPackageDir,getDlxPackageJsonPath,getDlxPackageNodeModulesDir,isDlxPackageInstalled,isDlxPackageInstalledAsync,listDlxPackages,listDlxPackagesAsync,removeDlxPackage,removeDlxPackageSync});
2
+ var x=Object.defineProperty;var P=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var v=Object.prototype.hasOwnProperty;var w=(t,r)=>{for(var e in r)x(t,e,{get:r[e],enumerable:!0})},S=(t,r,e,i)=>{if(r&&typeof r=="object"||typeof r=="function")for(let s of k(r))!v.call(t,s)&&s!==e&&x(t,s,{get:()=>r[s],enumerable:!(i=P(r,s))||i.enumerable});return t};var b=t=>S(x({},"__esModule",{value:!0}),t);var z={};w(z,{clearDlx:()=>j,clearDlxSync:()=>E,dlxDirExists:()=>I,dlxDirExistsAsync:()=>q,ensureDlxDir:()=>A,ensureDlxDirSync:()=>F,getDlxInstalledPackageDir:()=>l,getDlxPackageDir:()=>p,getDlxPackageJsonPath:()=>L,getDlxPackageNodeModulesDir:()=>D,isDlxPackageInstalled:()=>_,isDlxPackageInstalledAsync:()=>$,isInSocketDlx:()=>X,listDlxPackages:()=>d,listDlxPackagesAsync:()=>m,removeDlxPackage:()=>h,removeDlxPackageSync:()=>y});module.exports=b(z);var o=require("node:fs"),u=require("./fs"),a=require("./path"),n=require("./paths"),g=require("./promises");let f;function c(){return f===void 0&&(f=require("node:path")),f}async function j(){const t=await m();await(0,g.pEach)(t,r=>h(r))}function E(){const t=d();for(const r of t)y(r)}function I(){return(0,o.existsSync)((0,n.getSocketDlxDir)())}async function q(){try{return await o.promises.access((0,n.getSocketDlxDir)()),!0}catch{return!1}}async function A(){await o.promises.mkdir((0,n.getSocketDlxDir)(),{recursive:!0})}function F(){const{mkdirSync:t}=require("node:fs");t((0,n.getSocketDlxDir)(),{recursive:!0})}function l(t){return(0,a.normalizePath)(c().join(D(t),t))}function p(t){return(0,a.normalizePath)(c().join((0,n.getSocketDlxDir)(),t))}function L(t){return(0,a.normalizePath)(c().join(l(t),"package.json"))}function D(t){return(0,a.normalizePath)(c().join(p(t),"node_modules"))}function X(t){if(!t)return!1;const r=c(),e=(0,n.getSocketDlxDir)();return r.resolve(t).startsWith(e+r.sep)}function _(t){return(0,o.existsSync)(l(t))}async function $(t){try{return await o.promises.access(l(t)),!0}catch{return!1}}function d(){try{return(0,u.readDirNamesSync)((0,n.getSocketDlxDir)(),{sort:!0})}catch{return[]}}async function m(){try{return(await o.promises.readdir((0,n.getSocketDlxDir)(),{withFileTypes:!0})).filter(r=>r.isDirectory()).map(r=>r.name).sort()}catch{return[]}}async function h(t){const r=p(t);try{await(0,u.safeDelete)(r,{recursive:!0,force:!0})}catch(e){throw new Error(`Failed to remove DLX package "${t}"`,{cause:e})}}function y(t){const{rmSync:r}=require("node:fs"),e=p(t);try{r(e,{recursive:!0,force:!0})}catch(i){throw new Error(`Failed to remove DLX package "${t}"`,{cause:i})}}0&&(module.exports={clearDlx,clearDlxSync,dlxDirExists,dlxDirExistsAsync,ensureDlxDir,ensureDlxDirSync,getDlxInstalledPackageDir,getDlxPackageDir,getDlxPackageJsonPath,getDlxPackageNodeModulesDir,isDlxPackageInstalled,isDlxPackageInstalledAsync,isInSocketDlx,listDlxPackages,listDlxPackagesAsync,removeDlxPackage,removeDlxPackageSync});
3
3
  //# sourceMappingURL=dlx.js.map
package/dist/dlx.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/dlx.ts"],
4
- "sourcesContent": ["/** @fileoverview DLX (execute package) utilities for Socket ecosystem shared installations. */\n\nimport { existsSync, promises as fs } from 'node:fs'\n\nimport { readDirNamesSync, safeDelete } from './fs'\nimport { normalizePath } from './path'\nimport { getSocketDlxDir } from './paths'\nimport { pEach } from './promises'\n\nlet _path: typeof import('path') | undefined\n/**\n * Lazily load the path module to avoid Webpack errors.\n * @private\n */\n/*@__NO_SIDE_EFFECTS__*/\nfunction getPath() {\n if (_path === undefined) {\n // Use non-'node:' prefixed require to avoid Webpack errors.\n\n _path = /*@__PURE__*/ require('node:path')\n }\n return _path!\n}\n\n/**\n * Clear all DLX package installations.\n */\nexport async function clearDlx(): Promise<void> {\n const packages = await listDlxPackagesAsync()\n await pEach(packages, pkg => removeDlxPackage(pkg))\n}\n\n/**\n * Clear all DLX package installations synchronously.\n */\nexport function clearDlxSync(): void {\n const packages = listDlxPackages()\n for (const pkg of packages) {\n removeDlxPackageSync(pkg)\n }\n}\n\n/**\n * Check if the DLX directory exists.\n */\nexport function dlxDirExists(): boolean {\n return existsSync(getSocketDlxDir())\n}\n\n/**\n * Check if the DLX directory exists asynchronously.\n */\nexport async function dlxDirExistsAsync(): Promise<boolean> {\n try {\n await fs.access(getSocketDlxDir())\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Ensure the DLX directory exists, creating it if necessary.\n */\nexport async function ensureDlxDir(): Promise<void> {\n await fs.mkdir(getSocketDlxDir(), { recursive: true })\n}\n\n/**\n * Ensure the DLX directory exists synchronously, creating it if necessary.\n */\nexport function ensureDlxDirSync(): void {\n const { mkdirSync } = require('node:fs')\n mkdirSync(getSocketDlxDir(), { recursive: true })\n}\n\n/**\n * Get the installed package directory within DLX node_modules.\n */\nexport function getDlxInstalledPackageDir(packageName: string): string {\n const path = getPath()\n return normalizePath(\n path.join(getDlxPackageNodeModulesDir(packageName), packageName),\n )\n}\n\n/**\n * Get the DLX installation directory for a specific package.\n */\nexport function getDlxPackageDir(packageName: string): string {\n const path = getPath()\n return normalizePath(path.join(getSocketDlxDir(), packageName))\n}\n\n/**\n * Get the package.json path for a DLX installed package.\n */\nexport function getDlxPackageJsonPath(packageName: string): string {\n const path = getPath()\n return normalizePath(\n path.join(getDlxInstalledPackageDir(packageName), 'package.json'),\n )\n}\n\n/**\n * Get the node_modules directory for a DLX package installation.\n */\nexport function getDlxPackageNodeModulesDir(packageName: string): string {\n const path = getPath()\n return normalizePath(path.join(getDlxPackageDir(packageName), 'node_modules'))\n}\n\n/**\n * Check if a package is installed in DLX.\n */\nexport function isDlxPackageInstalled(packageName: string): boolean {\n return existsSync(getDlxInstalledPackageDir(packageName))\n}\n\n/**\n * Check if a package is installed in DLX asynchronously.\n */\nexport async function isDlxPackageInstalledAsync(\n packageName: string,\n): Promise<boolean> {\n try {\n await fs.access(getDlxInstalledPackageDir(packageName))\n return true\n } catch {\n return false\n }\n}\n\n/**\n * List all packages installed in DLX.\n */\nexport function listDlxPackages(): string[] {\n try {\n return readDirNamesSync(getSocketDlxDir(), { sort: true })\n } catch {\n return []\n }\n}\n\n/**\n * List all packages installed in DLX asynchronously.\n */\nexport async function listDlxPackagesAsync(): Promise<string[]> {\n try {\n const entries = await fs.readdir(getSocketDlxDir(), {\n withFileTypes: true,\n })\n return entries\n .filter(e => e.isDirectory())\n .map(e => e.name)\n .sort()\n } catch {\n return []\n }\n}\n\n/**\n * Remove a DLX package installation.\n */\nexport async function removeDlxPackage(packageName: string): Promise<void> {\n const packageDir = getDlxPackageDir(packageName)\n try {\n await safeDelete(packageDir, { recursive: true, force: true })\n } catch (e) {\n throw new Error(`Failed to remove DLX package \"${packageName}\"`, {\n cause: e,\n })\n }\n}\n\n/**\n * Remove a DLX package installation synchronously.\n */\nexport function removeDlxPackageSync(packageName: string): void {\n const { rmSync } = require('node:fs')\n const packageDir = getDlxPackageDir(packageName)\n try {\n rmSync(packageDir, { recursive: true, force: true })\n } catch (e) {\n throw new Error(`Failed to remove DLX package \"${packageName}\"`, {\n cause: e,\n })\n }\n}\n"],
5
- "mappings": ";4ZAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,cAAAE,EAAA,iBAAAC,EAAA,iBAAAC,EAAA,sBAAAC,EAAA,iBAAAC,EAAA,qBAAAC,EAAA,8BAAAC,EAAA,qBAAAC,EAAA,0BAAAC,EAAA,gCAAAC,EAAA,0BAAAC,EAAA,+BAAAC,EAAA,oBAAAC,EAAA,yBAAAC,EAAA,qBAAAC,EAAA,yBAAAC,IAAA,eAAAC,EAAAlB,GAEA,IAAAmB,EAA2C,mBAE3CC,EAA6C,gBAC7CC,EAA8B,kBAC9BC,EAAgC,mBAChCC,EAAsB,sBAEtB,IAAIC,EAMJ,SAASC,GAAU,CACjB,OAAID,IAAU,SAGZA,EAAsB,QAAQ,WAAW,GAEpCA,CACT,CAKA,eAAsBtB,GAA0B,CAC9C,MAAMwB,EAAW,MAAMX,EAAqB,EAC5C,QAAM,SAAMW,EAAUC,GAAOX,EAAiBW,CAAG,CAAC,CACpD,CAKO,SAASxB,GAAqB,CACnC,MAAMuB,EAAWZ,EAAgB,EACjC,UAAWa,KAAOD,EAChBT,EAAqBU,CAAG,CAE5B,CAKO,SAASvB,GAAwB,CACtC,SAAO,iBAAW,mBAAgB,CAAC,CACrC,CAKA,eAAsBC,GAAsC,CAC1D,GAAI,CACF,aAAM,EAAAuB,SAAG,UAAO,mBAAgB,CAAC,EAC1B,EACT,MAAQ,CACN,MAAO,EACT,CACF,CAKA,eAAsBtB,GAA8B,CAClD,MAAM,EAAAsB,SAAG,SAAM,mBAAgB,EAAG,CAAE,UAAW,EAAK,CAAC,CACvD,CAKO,SAASrB,GAAyB,CACvC,KAAM,CAAE,UAAAsB,CAAU,EAAI,QAAQ,SAAS,EACvCA,KAAU,mBAAgB,EAAG,CAAE,UAAW,EAAK,CAAC,CAClD,CAKO,SAASrB,EAA0BsB,EAA6B,CAErE,SAAO,iBADML,EAAQ,EAEd,KAAKd,EAA4BmB,CAAW,EAAGA,CAAW,CACjE,CACF,CAKO,SAASrB,EAAiBqB,EAA6B,CAE5D,SAAO,iBADML,EAAQ,EACK,QAAK,mBAAgB,EAAGK,CAAW,CAAC,CAChE,CAKO,SAASpB,EAAsBoB,EAA6B,CAEjE,SAAO,iBADML,EAAQ,EAEd,KAAKjB,EAA0BsB,CAAW,EAAG,cAAc,CAClE,CACF,CAKO,SAASnB,EAA4BmB,EAA6B,CAEvE,SAAO,iBADML,EAAQ,EACK,KAAKhB,EAAiBqB,CAAW,EAAG,cAAc,CAAC,CAC/E,CAKO,SAASlB,EAAsBkB,EAA8B,CAClE,SAAO,cAAWtB,EAA0BsB,CAAW,CAAC,CAC1D,CAKA,eAAsBjB,EACpBiB,EACkB,CAClB,GAAI,CACF,aAAM,EAAAF,SAAG,OAAOpB,EAA0BsB,CAAW,CAAC,EAC/C,EACT,MAAQ,CACN,MAAO,EACT,CACF,CAKO,SAAShB,GAA4B,CAC1C,GAAI,CACF,SAAO,uBAAiB,mBAAgB,EAAG,CAAE,KAAM,EAAK,CAAC,CAC3D,MAAQ,CACN,MAAO,CAAC,CACV,CACF,CAKA,eAAsBC,GAA0C,CAC9D,GAAI,CAIF,OAHgB,MAAM,EAAAa,SAAG,WAAQ,mBAAgB,EAAG,CAClD,cAAe,EACjB,CAAC,GAEE,OAAOG,GAAKA,EAAE,YAAY,CAAC,EAC3B,IAAIA,GAAKA,EAAE,IAAI,EACf,KAAK,CACV,MAAQ,CACN,MAAO,CAAC,CACV,CACF,CAKA,eAAsBf,EAAiBc,EAAoC,CACzE,MAAME,EAAavB,EAAiBqB,CAAW,EAC/C,GAAI,CACF,QAAM,cAAWE,EAAY,CAAE,UAAW,GAAM,MAAO,EAAK,CAAC,CAC/D,OAAS,EAAG,CACV,MAAM,IAAI,MAAM,iCAAiCF,CAAW,IAAK,CAC/D,MAAO,CACT,CAAC,CACH,CACF,CAKO,SAASb,EAAqBa,EAA2B,CAC9D,KAAM,CAAE,OAAAG,CAAO,EAAI,QAAQ,SAAS,EAC9BD,EAAavB,EAAiBqB,CAAW,EAC/C,GAAI,CACFG,EAAOD,EAAY,CAAE,UAAW,GAAM,MAAO,EAAK,CAAC,CACrD,OAASD,EAAG,CACV,MAAM,IAAI,MAAM,iCAAiCD,CAAW,IAAK,CAC/D,MAAOC,CACT,CAAC,CACH,CACF",
6
- "names": ["dlx_exports", "__export", "clearDlx", "clearDlxSync", "dlxDirExists", "dlxDirExistsAsync", "ensureDlxDir", "ensureDlxDirSync", "getDlxInstalledPackageDir", "getDlxPackageDir", "getDlxPackageJsonPath", "getDlxPackageNodeModulesDir", "isDlxPackageInstalled", "isDlxPackageInstalledAsync", "listDlxPackages", "listDlxPackagesAsync", "removeDlxPackage", "removeDlxPackageSync", "__toCommonJS", "import_node_fs", "import_fs", "import_path", "import_paths", "import_promises", "_path", "getPath", "packages", "pkg", "fs", "mkdirSync", "packageName", "e", "packageDir", "rmSync"]
4
+ "sourcesContent": ["/** @fileoverview DLX (execute package) utilities for Socket ecosystem shared installations. */\n\nimport { existsSync, promises as fs } from 'node:fs'\n\nimport { readDirNamesSync, safeDelete } from './fs'\nimport { normalizePath } from './path'\nimport { getSocketDlxDir } from './paths'\nimport { pEach } from './promises'\n\nlet _path: typeof import('path') | undefined\n/**\n * Lazily load the path module to avoid Webpack errors.\n * @private\n */\n/*@__NO_SIDE_EFFECTS__*/\nfunction getPath() {\n if (_path === undefined) {\n // Use non-'node:' prefixed require to avoid Webpack errors.\n\n _path = /*@__PURE__*/ require('node:path')\n }\n return _path!\n}\n\n/**\n * Clear all DLX package installations.\n */\nexport async function clearDlx(): Promise<void> {\n const packages = await listDlxPackagesAsync()\n await pEach(packages, pkg => removeDlxPackage(pkg))\n}\n\n/**\n * Clear all DLX package installations synchronously.\n */\nexport function clearDlxSync(): void {\n const packages = listDlxPackages()\n for (const pkg of packages) {\n removeDlxPackageSync(pkg)\n }\n}\n\n/**\n * Check if the DLX directory exists.\n */\nexport function dlxDirExists(): boolean {\n return existsSync(getSocketDlxDir())\n}\n\n/**\n * Check if the DLX directory exists asynchronously.\n */\nexport async function dlxDirExistsAsync(): Promise<boolean> {\n try {\n await fs.access(getSocketDlxDir())\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Ensure the DLX directory exists, creating it if necessary.\n */\nexport async function ensureDlxDir(): Promise<void> {\n await fs.mkdir(getSocketDlxDir(), { recursive: true })\n}\n\n/**\n * Ensure the DLX directory exists synchronously, creating it if necessary.\n */\nexport function ensureDlxDirSync(): void {\n const { mkdirSync } = require('node:fs')\n mkdirSync(getSocketDlxDir(), { recursive: true })\n}\n\n/**\n * Get the installed package directory within DLX node_modules.\n */\nexport function getDlxInstalledPackageDir(packageName: string): string {\n const path = getPath()\n return normalizePath(\n path.join(getDlxPackageNodeModulesDir(packageName), packageName),\n )\n}\n\n/**\n * Get the DLX installation directory for a specific package.\n */\nexport function getDlxPackageDir(packageName: string): string {\n const path = getPath()\n return normalizePath(path.join(getSocketDlxDir(), packageName))\n}\n\n/**\n * Get the package.json path for a DLX installed package.\n */\nexport function getDlxPackageJsonPath(packageName: string): string {\n const path = getPath()\n return normalizePath(\n path.join(getDlxInstalledPackageDir(packageName), 'package.json'),\n )\n}\n\n/**\n * Get the node_modules directory for a DLX package installation.\n */\nexport function getDlxPackageNodeModulesDir(packageName: string): string {\n const path = getPath()\n return normalizePath(path.join(getDlxPackageDir(packageName), 'node_modules'))\n}\n\n/**\n * Check if a file path is within the Socket DLX directory.\n * This is useful for determining if a binary or file is managed by Socket's DLX system.\n *\n * @param filePath - Absolute or relative path to check\n * @returns true if the path is within ~/.socket/_dlx/, false otherwise\n *\n * @example\n * ```typescript\n * isInSocketDlx('/home/user/.socket/_dlx/abc123/bin/socket') // true\n * isInSocketDlx('/usr/local/bin/socket') // false\n * isInSocketDlx(process.argv[0]) // Check if current binary is in DLX\n * ```\n */\nexport function isInSocketDlx(filePath: string): boolean {\n if (!filePath) {\n return false\n }\n\n const path = getPath()\n const dlxDir = getSocketDlxDir()\n const absolutePath = path.resolve(filePath)\n\n // Check if the absolute path starts with the DLX directory.\n return absolutePath.startsWith(dlxDir + path.sep)\n}\n\n/**\n * Check if a package is installed in DLX.\n */\nexport function isDlxPackageInstalled(packageName: string): boolean {\n return existsSync(getDlxInstalledPackageDir(packageName))\n}\n\n/**\n * Check if a package is installed in DLX asynchronously.\n */\nexport async function isDlxPackageInstalledAsync(\n packageName: string,\n): Promise<boolean> {\n try {\n await fs.access(getDlxInstalledPackageDir(packageName))\n return true\n } catch {\n return false\n }\n}\n\n/**\n * List all packages installed in DLX.\n */\nexport function listDlxPackages(): string[] {\n try {\n return readDirNamesSync(getSocketDlxDir(), { sort: true })\n } catch {\n return []\n }\n}\n\n/**\n * List all packages installed in DLX asynchronously.\n */\nexport async function listDlxPackagesAsync(): Promise<string[]> {\n try {\n const entries = await fs.readdir(getSocketDlxDir(), {\n withFileTypes: true,\n })\n return entries\n .filter(e => e.isDirectory())\n .map(e => e.name)\n .sort()\n } catch {\n return []\n }\n}\n\n/**\n * Remove a DLX package installation.\n */\nexport async function removeDlxPackage(packageName: string): Promise<void> {\n const packageDir = getDlxPackageDir(packageName)\n try {\n await safeDelete(packageDir, { recursive: true, force: true })\n } catch (e) {\n throw new Error(`Failed to remove DLX package \"${packageName}\"`, {\n cause: e,\n })\n }\n}\n\n/**\n * Remove a DLX package installation synchronously.\n */\nexport function removeDlxPackageSync(packageName: string): void {\n const { rmSync } = require('node:fs')\n const packageDir = getDlxPackageDir(packageName)\n try {\n rmSync(packageDir, { recursive: true, force: true })\n } catch (e) {\n throw new Error(`Failed to remove DLX package \"${packageName}\"`, {\n cause: e,\n })\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["dlx_exports", "__export", "clearDlx", "clearDlxSync", "dlxDirExists", "dlxDirExistsAsync", "ensureDlxDir", "ensureDlxDirSync", "getDlxInstalledPackageDir", "getDlxPackageDir", "getDlxPackageJsonPath", "getDlxPackageNodeModulesDir", "isDlxPackageInstalled", "isDlxPackageInstalledAsync", "isInSocketDlx", "listDlxPackages", "listDlxPackagesAsync", "removeDlxPackage", "removeDlxPackageSync", "__toCommonJS", "import_node_fs", "import_fs", "import_path", "import_paths", "import_promises", "_path", "getPath", "packages", "pkg", "fs", "mkdirSync", "packageName", "filePath", "path", "dlxDir", "e", "packageDir", "rmSync"]
7
7
  }