@socketsecurity/lib 3.0.1 → 3.0.3

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 (259) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/abort.js +60 -1
  3. package/dist/abort.js.map +2 -2
  4. package/dist/agent.js +289 -1
  5. package/dist/agent.js.map +2 -2
  6. package/dist/ansi.js +60 -1
  7. package/dist/ansi.js.map +2 -2
  8. package/dist/argv/flags.js +282 -1
  9. package/dist/argv/flags.js.map +2 -2
  10. package/dist/argv/parse.js +171 -1
  11. package/dist/argv/parse.js.map +2 -2
  12. package/dist/arrays.js +85 -1
  13. package/dist/arrays.js.map +2 -2
  14. package/dist/bin.js +419 -5
  15. package/dist/bin.js.map +2 -2
  16. package/dist/cacache.js +139 -1
  17. package/dist/cacache.js.map +2 -2
  18. package/dist/cache-with-ttl.js +223 -1
  19. package/dist/cache-with-ttl.js.map +2 -2
  20. package/dist/constants/agents.js +126 -1
  21. package/dist/constants/agents.js.map +2 -2
  22. package/dist/constants/core.d.ts +1 -1
  23. package/dist/constants/core.js +57 -2
  24. package/dist/constants/core.js.map +3 -3
  25. package/dist/constants/encoding.js +48 -1
  26. package/dist/constants/encoding.js.map +2 -2
  27. package/dist/constants/github.js +30 -1
  28. package/dist/constants/github.js.map +2 -2
  29. package/dist/constants/licenses.js +66 -1
  30. package/dist/constants/licenses.js.map +2 -2
  31. package/dist/constants/node.js +185 -1
  32. package/dist/constants/node.js.map +2 -2
  33. package/dist/constants/packages.js +128 -1
  34. package/dist/constants/packages.js.map +2 -2
  35. package/dist/constants/paths.js +150 -1
  36. package/dist/constants/paths.js.map +2 -2
  37. package/dist/constants/platform.js +41 -1
  38. package/dist/constants/platform.js.map +2 -2
  39. package/dist/constants/process.js +52 -1
  40. package/dist/constants/process.js.map +2 -2
  41. package/dist/constants/socket.js +102 -1
  42. package/dist/constants/socket.js.map +2 -2
  43. package/dist/constants/testing.js +36 -1
  44. package/dist/constants/testing.js.map +2 -2
  45. package/dist/constants/time.js +39 -1
  46. package/dist/constants/time.js.map +2 -2
  47. package/dist/constants/typescript.js +54 -1
  48. package/dist/constants/typescript.js.map +2 -2
  49. package/dist/cover/code.js +135 -1
  50. package/dist/cover/code.js.map +2 -2
  51. package/dist/cover/formatters.js +101 -11
  52. package/dist/cover/formatters.js.map +2 -2
  53. package/dist/cover/type.js +63 -1
  54. package/dist/cover/type.js.map +2 -2
  55. package/dist/cover/types.js +15 -1
  56. package/dist/cover/types.js.map +2 -2
  57. package/dist/debug.js +337 -2
  58. package/dist/debug.js.map +2 -2
  59. package/dist/dlx-binary.js +408 -7
  60. package/dist/dlx-binary.js.map +2 -2
  61. package/dist/dlx-package.js +278 -7
  62. package/dist/dlx-package.js.map +2 -2
  63. package/dist/dlx.js +214 -7
  64. package/dist/dlx.js.map +3 -3
  65. package/dist/effects/pulse-frames.js +64 -1
  66. package/dist/effects/pulse-frames.js.map +2 -2
  67. package/dist/effects/text-shimmer.js +174 -1
  68. package/dist/effects/text-shimmer.js.map +2 -2
  69. package/dist/effects/types.js +15 -1
  70. package/dist/effects/types.js.map +2 -2
  71. package/dist/effects/ultra.js +61 -1
  72. package/dist/effects/ultra.js.map +2 -2
  73. package/dist/env/ci.js +31 -1
  74. package/dist/env/ci.js.map +2 -2
  75. package/dist/env/debug.js +30 -1
  76. package/dist/env/debug.js.map +2 -2
  77. package/dist/env/github.js +65 -1
  78. package/dist/env/github.js.map +2 -2
  79. package/dist/env/helpers.js +47 -1
  80. package/dist/env/helpers.js.map +2 -2
  81. package/dist/env/home.js +30 -1
  82. package/dist/env/home.js.map +2 -2
  83. package/dist/env/locale.js +40 -1
  84. package/dist/env/locale.js.map +2 -2
  85. package/dist/env/node-auth-token.js +30 -1
  86. package/dist/env/node-auth-token.js.map +2 -2
  87. package/dist/env/node-env.js +30 -1
  88. package/dist/env/node-env.js.map +2 -2
  89. package/dist/env/npm.js +50 -1
  90. package/dist/env/npm.js.map +2 -2
  91. package/dist/env/package-manager.js +73 -1
  92. package/dist/env/package-manager.js.map +2 -2
  93. package/dist/env/path.js +30 -1
  94. package/dist/env/path.js.map +2 -2
  95. package/dist/env/pre-commit.js +31 -1
  96. package/dist/env/pre-commit.js.map +2 -2
  97. package/dist/env/rewire.js +72 -1
  98. package/dist/env/rewire.js.map +2 -2
  99. package/dist/env/shell.js +30 -1
  100. package/dist/env/shell.js.map +2 -2
  101. package/dist/env/socket-cli-shadow.js +51 -1
  102. package/dist/env/socket-cli-shadow.js.map +2 -2
  103. package/dist/env/socket-cli.js +86 -1
  104. package/dist/env/socket-cli.js.map +2 -2
  105. package/dist/env/socket.js +101 -1
  106. package/dist/env/socket.js.map +2 -2
  107. package/dist/env/temp-dir.js +40 -1
  108. package/dist/env/temp-dir.js.map +2 -2
  109. package/dist/env/term.js +30 -1
  110. package/dist/env/term.js.map +2 -2
  111. package/dist/env/test.js +43 -1
  112. package/dist/env/test.js.map +2 -2
  113. package/dist/env/windows.js +45 -1
  114. package/dist/env/windows.js.map +2 -2
  115. package/dist/env/xdg.js +40 -1
  116. package/dist/env/xdg.js.map +2 -2
  117. package/dist/env.js +170 -1
  118. package/dist/env.js.map +2 -2
  119. package/dist/fs.js +670 -7
  120. package/dist/fs.js.map +2 -2
  121. package/dist/functions.js +68 -1
  122. package/dist/functions.js.map +2 -2
  123. package/dist/git.js +329 -2
  124. package/dist/git.js.map +2 -2
  125. package/dist/github.js +202 -1
  126. package/dist/github.js.map +2 -2
  127. package/dist/globs.js +149 -1
  128. package/dist/globs.js.map +3 -3
  129. package/dist/http-request.js +335 -3
  130. package/dist/http-request.js.map +2 -2
  131. package/dist/index.js +69 -1
  132. package/dist/index.js.map +2 -2
  133. package/dist/ipc.js +244 -1
  134. package/dist/ipc.js.map +2 -2
  135. package/dist/json.js +73 -1
  136. package/dist/json.js.map +2 -2
  137. package/dist/links/index.js +60 -1
  138. package/dist/links/index.js.map +2 -2
  139. package/dist/logger.js +1384 -1
  140. package/dist/logger.js.map +2 -2
  141. package/dist/maintained-node-versions.js +35 -1
  142. package/dist/maintained-node-versions.js.map +2 -2
  143. package/dist/memoization.js +210 -1
  144. package/dist/memoization.js.map +2 -2
  145. package/dist/objects.js +311 -1
  146. package/dist/objects.js.map +2 -2
  147. package/dist/packages/editable.js +356 -9
  148. package/dist/packages/editable.js.map +2 -2
  149. package/dist/packages/exports.js +162 -1
  150. package/dist/packages/exports.js.map +2 -2
  151. package/dist/packages/isolation.js +187 -1
  152. package/dist/packages/isolation.js.map +2 -2
  153. package/dist/packages/licenses.js +214 -1
  154. package/dist/packages/licenses.js.map +2 -2
  155. package/dist/packages/manifest.js +190 -1
  156. package/dist/packages/manifest.js.map +2 -2
  157. package/dist/packages/normalize.js +132 -1
  158. package/dist/packages/normalize.js.map +2 -2
  159. package/dist/packages/operations.js +320 -1
  160. package/dist/packages/operations.js.map +2 -2
  161. package/dist/packages/paths.js +53 -1
  162. package/dist/packages/paths.js.map +2 -2
  163. package/dist/packages/provenance.js +178 -1
  164. package/dist/packages/provenance.js.map +2 -2
  165. package/dist/packages/specs.js +83 -1
  166. package/dist/packages/specs.js.map +2 -2
  167. package/dist/packages/validation.js +51 -1
  168. package/dist/packages/validation.js.map +2 -2
  169. package/dist/packages.js +129 -1
  170. package/dist/packages.js.map +2 -2
  171. package/dist/path.js +446 -1
  172. package/dist/path.js.map +2 -2
  173. package/dist/paths/rewire.js +79 -1
  174. package/dist/paths/rewire.js.map +2 -2
  175. package/dist/paths.js +190 -1
  176. package/dist/paths.js.map +2 -2
  177. package/dist/performance.js +216 -15
  178. package/dist/performance.js.map +2 -2
  179. package/dist/process-lock.js +287 -8
  180. package/dist/process-lock.js.map +2 -2
  181. package/dist/promise-queue.js +109 -1
  182. package/dist/promise-queue.js.map +2 -2
  183. package/dist/promises.js +267 -1
  184. package/dist/promises.js.map +2 -2
  185. package/dist/prompts/index.js +45 -1
  186. package/dist/prompts/index.js.map +2 -2
  187. package/dist/prompts.js +58 -1
  188. package/dist/prompts.js.map +2 -2
  189. package/dist/regexps.js +30 -1
  190. package/dist/regexps.js.map +2 -2
  191. package/dist/sea.js +44 -1
  192. package/dist/sea.js.map +2 -2
  193. package/dist/shadow.js +58 -1
  194. package/dist/shadow.js.map +2 -2
  195. package/dist/signal-exit.js +248 -1
  196. package/dist/signal-exit.js.map +3 -3
  197. package/dist/sorts.js +94 -1
  198. package/dist/sorts.js.map +3 -3
  199. package/dist/spawn.js +200 -1
  200. package/dist/spawn.js.map +2 -2
  201. package/dist/spinner.js +961 -1
  202. package/dist/spinner.js.map +2 -2
  203. package/dist/ssri.js +71 -1
  204. package/dist/ssri.js.map +2 -2
  205. package/dist/stdio/clear.js +82 -1
  206. package/dist/stdio/clear.js.map +2 -2
  207. package/dist/stdio/divider.js +89 -3
  208. package/dist/stdio/divider.js.map +2 -2
  209. package/dist/stdio/footer.js +94 -2
  210. package/dist/stdio/footer.js.map +2 -2
  211. package/dist/stdio/header.js +100 -2
  212. package/dist/stdio/header.js.map +2 -2
  213. package/dist/stdio/mask.js +207 -5
  214. package/dist/stdio/mask.js.map +2 -2
  215. package/dist/stdio/progress.js +209 -2
  216. package/dist/stdio/progress.js.map +2 -2
  217. package/dist/stdio/prompts.js +88 -1
  218. package/dist/stdio/prompts.js.map +2 -2
  219. package/dist/stdio/stderr.js +89 -2
  220. package/dist/stdio/stderr.js.map +2 -2
  221. package/dist/stdio/stdout.js +103 -2
  222. package/dist/stdio/stdout.js.map +2 -2
  223. package/dist/streams.js +78 -1
  224. package/dist/streams.js.map +2 -2
  225. package/dist/strings.js +251 -3
  226. package/dist/strings.js.map +2 -2
  227. package/dist/suppress-warnings.js +98 -1
  228. package/dist/suppress-warnings.js.map +2 -2
  229. package/dist/tables.js +128 -3
  230. package/dist/tables.js.map +2 -2
  231. package/dist/temporary-executor.js +53 -1
  232. package/dist/temporary-executor.js.map +2 -2
  233. package/dist/themes/context.js +71 -1
  234. package/dist/themes/context.js.map +2 -2
  235. package/dist/themes/index.js +57 -1
  236. package/dist/themes/index.js.map +2 -2
  237. package/dist/themes/themes.js +195 -1
  238. package/dist/themes/themes.js.map +2 -2
  239. package/dist/themes/types.js +15 -1
  240. package/dist/themes/types.js.map +2 -2
  241. package/dist/themes/utils.js +116 -1
  242. package/dist/themes/utils.js.map +2 -2
  243. package/dist/types.js +59 -1
  244. package/dist/types.js.map +2 -2
  245. package/dist/url.js +142 -1
  246. package/dist/url.js.map +2 -2
  247. package/dist/utils/get-ipc.js +58 -1
  248. package/dist/utils/get-ipc.js.map +2 -2
  249. package/dist/validation/json-parser.js +127 -1
  250. package/dist/validation/json-parser.js.map +2 -2
  251. package/dist/validation/types.js +15 -1
  252. package/dist/validation/types.js.map +2 -2
  253. package/dist/versions.js +154 -1
  254. package/dist/versions.js.map +2 -2
  255. package/dist/words.js +50 -1
  256. package/dist/words.js.map +2 -2
  257. package/dist/zod.js +27 -1
  258. package/dist/zod.js.map +2 -2
  259. package/package.json +1 -1
package/dist/dlx.js CHANGED
@@ -1,13 +1,220 @@
1
1
  /* Socket Lib - Built with esbuild */
2
- var p=Object.defineProperty;var v=Object.getOwnPropertyDescriptor;var w=Object.getOwnPropertyNames;var E=Object.prototype.hasOwnProperty;var S=(e,r)=>{for(var t in r)p(e,t,{get:r[t],enumerable:!0})},b=(e,r,t,s)=>{if(r&&typeof r=="object"||typeof r=="function")for(let n of w(r))!E.call(e,n)&&n!==t&&p(e,n,{get:()=>r[n],enumerable:!(s=v(r,n))||s.enumerable});return e};var $=e=>b(p({},"__esModule",{value:!0}),e);var J={};S(J,{clearDlx:()=>j,clearDlxSync:()=>F,dlxDirExists:()=>M,dlxDirExistsAsync:()=>A,ensureDlxDir:()=>I,ensureDlxDirSync:()=>L,generateCacheKey:()=>C,getDlxInstalledPackageDir:()=>f,getDlxPackageDir:()=>l,getDlxPackageJsonPath:()=>T,getDlxPackageNodeModulesDir:()=>m,isDlxPackageInstalled:()=>_,isDlxPackageInstalledAsync:()=>q,isInSocketDlx:()=>X,listDlxPackages:()=>h,listDlxPackagesAsync:()=>D,removeDlxPackage:()=>P,removeDlxPackageSync:()=>k});module.exports=$(J);var x=require("crypto"),i=require("./fs"),c=require("./path"),o=require("./paths"),y=require("./promises");let g;function a(){return g===void 0&&(g=require("node:fs")),g}function C(e){return(0,x.createHash)("sha512").update(e).digest("hex").substring(0,16)}let d;function u(){return d===void 0&&(d=require("node:path")),d}async function j(){const e=await D();await(0,y.pEach)(e,r=>P(r))}function F(){const e=h();for(const r of e)k(r)}function M(){return a().existsSync((0,o.getSocketDlxDir)())}async function A(){const e=a();try{return await e.promises.access((0,o.getSocketDlxDir)()),!0}catch{return!1}}async function I(){await(0,i.safeMkdir)((0,o.getSocketDlxDir)(),{recursive:!0})}function L(){(0,i.safeMkdirSync)((0,o.getSocketDlxDir)(),{recursive:!0})}function f(e){return(0,c.normalizePath)(u().join(m(e),e))}function l(e){return(0,c.normalizePath)(u().join((0,o.getSocketDlxDir)(),e))}function T(e){return(0,c.normalizePath)(u().join(f(e),"package.json"))}function m(e){return(0,c.normalizePath)(u().join(l(e),"node_modules"))}function X(e){if(!e)return!1;const r=u(),t=(0,o.getSocketDlxDir)();return r.resolve(e).startsWith(t+r.sep)}function _(e){return a().existsSync(f(e))}async function q(e){const r=a();try{return await r.promises.access(f(e)),!0}catch{return!1}}function h(){try{return(0,i.readDirNamesSync)((0,o.getSocketDlxDir)(),{sort:!0})}catch{return[]}}async function D(){const e=a();try{return(await e.promises.readdir((0,o.getSocketDlxDir)(),{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name).sort()}catch{return[]}}async function P(e){const r=l(e);try{await(0,i.safeDelete)(r,{recursive:!0,force:!0})}catch(t){throw new Error(`Failed to remove DLX package "${e}"`,{cause:t})}}function k(e){const r=a(),t=l(e);try{r.rmSync(t,{recursive:!0,force:!0})}catch(s){const n=s.code;throw n==="EACCES"||n==="EPERM"?new Error(`Permission denied removing DLX package "${e}"
3
- Directory: ${t}
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var dlx_exports = {};
20
+ __export(dlx_exports, {
21
+ clearDlx: () => clearDlx,
22
+ clearDlxSync: () => clearDlxSync,
23
+ dlxDirExists: () => dlxDirExists,
24
+ dlxDirExistsAsync: () => dlxDirExistsAsync,
25
+ ensureDlxDir: () => ensureDlxDir,
26
+ ensureDlxDirSync: () => ensureDlxDirSync,
27
+ generateCacheKey: () => generateCacheKey,
28
+ getDlxInstalledPackageDir: () => getDlxInstalledPackageDir,
29
+ getDlxPackageDir: () => getDlxPackageDir,
30
+ getDlxPackageJsonPath: () => getDlxPackageJsonPath,
31
+ getDlxPackageNodeModulesDir: () => getDlxPackageNodeModulesDir,
32
+ isDlxPackageInstalled: () => isDlxPackageInstalled,
33
+ isDlxPackageInstalledAsync: () => isDlxPackageInstalledAsync,
34
+ isInSocketDlx: () => isInSocketDlx,
35
+ listDlxPackages: () => listDlxPackages,
36
+ listDlxPackagesAsync: () => listDlxPackagesAsync,
37
+ removeDlxPackage: () => removeDlxPackage,
38
+ removeDlxPackageSync: () => removeDlxPackageSync
39
+ });
40
+ module.exports = __toCommonJS(dlx_exports);
41
+ var import_crypto = require("crypto");
42
+ var import_fs = require("./fs");
43
+ var import_path = require("./path");
44
+ var import_paths = require("./paths");
45
+ var import_promises = require("./promises");
46
+ let _fs;
47
+ // @__NO_SIDE_EFFECTS__
48
+ function getFs() {
49
+ if (_fs === void 0) {
50
+ _fs = require("node:fs");
51
+ }
52
+ return _fs;
53
+ }
54
+ function generateCacheKey(spec) {
55
+ return (0, import_crypto.createHash)("sha512").update(spec).digest("hex").substring(0, 16);
56
+ }
57
+ let _path;
58
+ // @__NO_SIDE_EFFECTS__
59
+ function getPath() {
60
+ if (_path === void 0) {
61
+ _path = require("node:path");
62
+ }
63
+ return _path;
64
+ }
65
+ async function clearDlx() {
66
+ const packages = await listDlxPackagesAsync();
67
+ await (0, import_promises.pEach)(packages, (pkg) => removeDlxPackage(pkg));
68
+ }
69
+ function clearDlxSync() {
70
+ const packages = listDlxPackages();
71
+ for (const pkg of packages) {
72
+ removeDlxPackageSync(pkg);
73
+ }
74
+ }
75
+ function dlxDirExists() {
76
+ const fs = /* @__PURE__ */ getFs();
77
+ return fs.existsSync((0, import_paths.getSocketDlxDir)());
78
+ }
79
+ async function dlxDirExistsAsync() {
80
+ const fs = /* @__PURE__ */ getFs();
81
+ try {
82
+ await fs.promises.access((0, import_paths.getSocketDlxDir)());
83
+ return true;
84
+ } catch {
85
+ return false;
86
+ }
87
+ }
88
+ async function ensureDlxDir() {
89
+ await (0, import_fs.safeMkdir)((0, import_paths.getSocketDlxDir)(), { recursive: true });
90
+ }
91
+ function ensureDlxDirSync() {
92
+ (0, import_fs.safeMkdirSync)((0, import_paths.getSocketDlxDir)(), { recursive: true });
93
+ }
94
+ function getDlxInstalledPackageDir(packageName) {
95
+ const path = /* @__PURE__ */ getPath();
96
+ return (0, import_path.normalizePath)(
97
+ path.join(getDlxPackageNodeModulesDir(packageName), packageName)
98
+ );
99
+ }
100
+ function getDlxPackageDir(packageName) {
101
+ const path = /* @__PURE__ */ getPath();
102
+ return (0, import_path.normalizePath)(path.join((0, import_paths.getSocketDlxDir)(), packageName));
103
+ }
104
+ function getDlxPackageJsonPath(packageName) {
105
+ const path = /* @__PURE__ */ getPath();
106
+ return (0, import_path.normalizePath)(
107
+ path.join(getDlxInstalledPackageDir(packageName), "package.json")
108
+ );
109
+ }
110
+ function getDlxPackageNodeModulesDir(packageName) {
111
+ const path = /* @__PURE__ */ getPath();
112
+ return (0, import_path.normalizePath)(path.join(getDlxPackageDir(packageName), "node_modules"));
113
+ }
114
+ function isInSocketDlx(filePath) {
115
+ if (!filePath) {
116
+ return false;
117
+ }
118
+ const path = /* @__PURE__ */ getPath();
119
+ const dlxDir = (0, import_paths.getSocketDlxDir)();
120
+ const absolutePath = (0, import_path.normalizePath)(path.resolve(filePath));
121
+ return absolutePath.startsWith(dlxDir + "/");
122
+ }
123
+ function isDlxPackageInstalled(packageName) {
124
+ const fs = /* @__PURE__ */ getFs();
125
+ return fs.existsSync(getDlxInstalledPackageDir(packageName));
126
+ }
127
+ async function isDlxPackageInstalledAsync(packageName) {
128
+ const fs = /* @__PURE__ */ getFs();
129
+ try {
130
+ await fs.promises.access(getDlxInstalledPackageDir(packageName));
131
+ return true;
132
+ } catch {
133
+ return false;
134
+ }
135
+ }
136
+ function listDlxPackages() {
137
+ try {
138
+ return (0, import_fs.readDirNamesSync)((0, import_paths.getSocketDlxDir)(), { sort: true });
139
+ } catch {
140
+ return [];
141
+ }
142
+ }
143
+ async function listDlxPackagesAsync() {
144
+ const fs = /* @__PURE__ */ getFs();
145
+ try {
146
+ const entries = await fs.promises.readdir((0, import_paths.getSocketDlxDir)(), {
147
+ withFileTypes: true
148
+ });
149
+ return entries.filter((e) => e.isDirectory()).map((e) => e.name).sort();
150
+ } catch {
151
+ return [];
152
+ }
153
+ }
154
+ async function removeDlxPackage(packageName) {
155
+ const packageDir = getDlxPackageDir(packageName);
156
+ try {
157
+ await (0, import_fs.safeDelete)(packageDir, { recursive: true, force: true });
158
+ } catch (e) {
159
+ throw new Error(`Failed to remove DLX package "${packageName}"`, {
160
+ cause: e
161
+ });
162
+ }
163
+ }
164
+ function removeDlxPackageSync(packageName) {
165
+ const fs = /* @__PURE__ */ getFs();
166
+ const packageDir = getDlxPackageDir(packageName);
167
+ try {
168
+ fs.rmSync(packageDir, { recursive: true, force: true });
169
+ } catch (e) {
170
+ const code = e.code;
171
+ if (code === "EACCES" || code === "EPERM") {
172
+ throw new Error(
173
+ `Permission denied removing DLX package "${packageName}"
174
+ Directory: ${packageDir}
4
175
  To resolve:
5
176
  1. Check file/directory permissions
6
177
  2. Close any programs using files in this directory
7
178
  3. Try running with elevated privileges if necessary
8
- 4. Manually remove: rm -rf "${t}"`,{cause:s}):n==="EROFS"?new Error(`Cannot remove DLX package "${e}" from read-only filesystem
9
- Directory: ${t}
10
- The filesystem is mounted read-only.`,{cause:s}):new Error(`Failed to remove DLX package "${e}"
11
- Directory: ${t}
12
- Check permissions and ensure no programs are using this directory.`,{cause:s})}}0&&(module.exports={clearDlx,clearDlxSync,dlxDirExists,dlxDirExistsAsync,ensureDlxDir,ensureDlxDirSync,generateCacheKey,getDlxInstalledPackageDir,getDlxPackageDir,getDlxPackageJsonPath,getDlxPackageNodeModulesDir,isDlxPackageInstalled,isDlxPackageInstalledAsync,isInSocketDlx,listDlxPackages,listDlxPackagesAsync,removeDlxPackage,removeDlxPackageSync});
179
+ 4. Manually remove: rm -rf "${packageDir}"`,
180
+ { cause: e }
181
+ );
182
+ }
183
+ if (code === "EROFS") {
184
+ throw new Error(
185
+ `Cannot remove DLX package "${packageName}" from read-only filesystem
186
+ Directory: ${packageDir}
187
+ The filesystem is mounted read-only.`,
188
+ { cause: e }
189
+ );
190
+ }
191
+ throw new Error(
192
+ `Failed to remove DLX package "${packageName}"
193
+ Directory: ${packageDir}
194
+ Check permissions and ensure no programs are using this directory.`,
195
+ { cause: e }
196
+ );
197
+ }
198
+ }
199
+ // Annotate the CommonJS export names for ESM import in node:
200
+ 0 && (module.exports = {
201
+ clearDlx,
202
+ clearDlxSync,
203
+ dlxDirExists,
204
+ dlxDirExistsAsync,
205
+ ensureDlxDir,
206
+ ensureDlxDirSync,
207
+ generateCacheKey,
208
+ getDlxInstalledPackageDir,
209
+ getDlxPackageDir,
210
+ getDlxPackageJsonPath,
211
+ getDlxPackageNodeModulesDir,
212
+ isDlxPackageInstalled,
213
+ isDlxPackageInstalledAsync,
214
+ isInSocketDlx,
215
+ listDlxPackages,
216
+ listDlxPackagesAsync,
217
+ removeDlxPackage,
218
+ removeDlxPackageSync
219
+ });
13
220
  //# 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 { createHash } from 'crypto'\n\nimport { readDirNamesSync, safeDelete, safeMkdir, safeMkdirSync } from './fs'\nimport { normalizePath } from './path'\nimport { getSocketDlxDir } from './paths'\nimport { pEach } from './promises'\n\nlet _fs: typeof import('fs') | undefined\n/**\n * Lazily load the fs module to avoid Webpack errors.\n * Uses non-'node:' prefixed require to prevent Webpack bundling issues.\n *\n * @returns The Node.js fs module\n * @private\n */\n/*@__NO_SIDE_EFFECTS__*/\nfunction getFs() {\n if (_fs === undefined) {\n // Use non-'node:' prefixed require to avoid Webpack errors.\n\n _fs = /*@__PURE__*/ require('node:fs')\n }\n return _fs as typeof import('fs')\n}\n\n/**\n * Generate a cache directory name using npm/npx approach.\n * Uses first 16 characters of SHA-512 hash (like npm/npx).\n *\n * Rationale for SHA-512 truncated (vs full SHA-256):\n * - Matches npm/npx ecosystem behavior\n * - Shorter paths for Windows MAX_PATH compatibility (260 chars)\n * - 16 hex chars = 64 bits = acceptable collision risk for local cache\n * - Collision probability ~1 in 18 quintillion with 1000 entries\n *\n * Input strategy (aligned with npx):\n * - npx uses package spec strings (e.g., '@scope/pkg@1.0.0', 'prettier@3.0.0')\n * - Caller provides complete spec string with version for accurate cache keying\n * - For package installs: Use PURL-style spec with version\n * Examples: 'npm:prettier@3.0.0', 'pypi:requests@2.31.0', 'gem:rails@7.0.0'\n * Note: Socket uses shorthand format without 'pkg:' prefix\n * (handled by @socketregistry/packageurl-js)\n * - For binary downloads: Use URL:name for uniqueness\n *\n * Reference: npm/cli v11.6.2 libnpmexec/lib/index.js#L233-L244\n * https://github.com/npm/cli/blob/v11.6.2/workspaces/libnpmexec/lib/index.js#L233-L244\n * Implementation: packages.map().sort().join('\\n') \u2192 SHA-512 \u2192 slice(0,16)\n * npx hashes the package spec (name@version), not just name\n */\nexport function generateCacheKey(spec: string): string {\n return createHash('sha512').update(spec).digest('hex').substring(0, 16)\n}\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 const fs = getFs()\n return fs.existsSync(getSocketDlxDir())\n}\n\n/**\n * Check if the DLX directory exists asynchronously.\n */\nexport async function dlxDirExistsAsync(): Promise<boolean> {\n const fs = getFs()\n try {\n await fs.promises.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 safeMkdir(getSocketDlxDir(), { recursive: true })\n}\n\n/**\n * Ensure the DLX directory exists synchronously, creating it if necessary.\n */\nexport function ensureDlxDirSync(): void {\n safeMkdirSync(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 const fs = getFs()\n return fs.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 const fs = getFs()\n try {\n await fs.promises.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 const fs = getFs()\n try {\n const entries = await fs.promises.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 fs = getFs()\n const packageDir = getDlxPackageDir(packageName)\n try {\n fs.rmSync(packageDir, { recursive: true, force: true })\n } catch (e) {\n const code = (e as NodeJS.ErrnoException).code\n if (code === 'EACCES' || code === 'EPERM') {\n throw new Error(\n `Permission denied removing DLX package \"${packageName}\"\\n` +\n `Directory: ${packageDir}\\n` +\n 'To resolve:\\n' +\n ' 1. Check file/directory permissions\\n' +\n ' 2. Close any programs using files in this directory\\n' +\n ' 3. Try running with elevated privileges if necessary\\n' +\n ` 4. Manually remove: rm -rf \"${packageDir}\"`,\n { cause: e },\n )\n }\n if (code === 'EROFS') {\n throw new Error(\n `Cannot remove DLX package \"${packageName}\" from read-only filesystem\\n` +\n `Directory: ${packageDir}\\n` +\n 'The filesystem is mounted read-only.',\n { cause: e },\n )\n }\n throw new Error(\n `Failed to remove DLX package \"${packageName}\"\\n` +\n `Directory: ${packageDir}\\n` +\n 'Check permissions and ensure no programs are using this directory.',\n { cause: e },\n )\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["dlx_exports", "__export", "clearDlx", "clearDlxSync", "dlxDirExists", "dlxDirExistsAsync", "ensureDlxDir", "ensureDlxDirSync", "generateCacheKey", "getDlxInstalledPackageDir", "getDlxPackageDir", "getDlxPackageJsonPath", "getDlxPackageNodeModulesDir", "isDlxPackageInstalled", "isDlxPackageInstalledAsync", "isInSocketDlx", "listDlxPackages", "listDlxPackagesAsync", "removeDlxPackage", "removeDlxPackageSync", "__toCommonJS", "import_crypto", "import_fs", "import_path", "import_paths", "import_promises", "_fs", "getFs", "spec", "_path", "getPath", "packages", "pkg", "fs", "packageName", "filePath", "path", "dlxDir", "e", "packageDir", "code"]
4
+ "sourcesContent": ["/** @fileoverview DLX (execute package) utilities for Socket ecosystem shared installations. */\n\nimport { createHash } from 'crypto'\n\nimport { readDirNamesSync, safeDelete, safeMkdir, safeMkdirSync } from './fs'\nimport { normalizePath } from './path'\nimport { getSocketDlxDir } from './paths'\nimport { pEach } from './promises'\n\nlet _fs: typeof import('fs') | undefined\n/**\n * Lazily load the fs module to avoid Webpack errors.\n * Uses non-'node:' prefixed require to prevent Webpack bundling issues.\n *\n * @returns The Node.js fs module\n * @private\n */\n/*@__NO_SIDE_EFFECTS__*/\nfunction getFs() {\n if (_fs === undefined) {\n // Use non-'node:' prefixed require to avoid Webpack errors.\n\n _fs = /*@__PURE__*/ require('node:fs')\n }\n return _fs as typeof import('fs')\n}\n\n/**\n * Generate a cache directory name using npm/npx approach.\n * Uses first 16 characters of SHA-512 hash (like npm/npx).\n *\n * Rationale for SHA-512 truncated (vs full SHA-256):\n * - Matches npm/npx ecosystem behavior\n * - Shorter paths for Windows MAX_PATH compatibility (260 chars)\n * - 16 hex chars = 64 bits = acceptable collision risk for local cache\n * - Collision probability ~1 in 18 quintillion with 1000 entries\n *\n * Input strategy (aligned with npx):\n * - npx uses package spec strings (e.g., '@scope/pkg@1.0.0', 'prettier@3.0.0')\n * - Caller provides complete spec string with version for accurate cache keying\n * - For package installs: Use PURL-style spec with version\n * Examples: 'npm:prettier@3.0.0', 'pypi:requests@2.31.0', 'gem:rails@7.0.0'\n * Note: Socket uses shorthand format without 'pkg:' prefix\n * (handled by @socketregistry/packageurl-js)\n * - For binary downloads: Use URL:name for uniqueness\n *\n * Reference: npm/cli v11.6.2 libnpmexec/lib/index.js#L233-L244\n * https://github.com/npm/cli/blob/v11.6.2/workspaces/libnpmexec/lib/index.js#L233-L244\n * Implementation: packages.map().sort().join('\\n') \u2192 SHA-512 \u2192 slice(0,16)\n * npx hashes the package spec (name@version), not just name\n */\nexport function generateCacheKey(spec: string): string {\n return createHash('sha512').update(spec).digest('hex').substring(0, 16)\n}\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 const fs = getFs()\n return fs.existsSync(getSocketDlxDir())\n}\n\n/**\n * Check if the DLX directory exists asynchronously.\n */\nexport async function dlxDirExistsAsync(): Promise<boolean> {\n const fs = getFs()\n try {\n await fs.promises.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 safeMkdir(getSocketDlxDir(), { recursive: true })\n}\n\n/**\n * Ensure the DLX directory exists synchronously, creating it if necessary.\n */\nexport function ensureDlxDirSync(): void {\n safeMkdirSync(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 = normalizePath(path.resolve(filePath))\n\n // Check if the absolute path starts with the DLX directory.\n // Both paths are normalized to use forward slashes for consistent comparison.\n return absolutePath.startsWith(dlxDir + '/')\n}\n\n/**\n * Check if a package is installed in DLX.\n */\nexport function isDlxPackageInstalled(packageName: string): boolean {\n const fs = getFs()\n return fs.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 const fs = getFs()\n try {\n await fs.promises.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 const fs = getFs()\n try {\n const entries = await fs.promises.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 fs = getFs()\n const packageDir = getDlxPackageDir(packageName)\n try {\n fs.rmSync(packageDir, { recursive: true, force: true })\n } catch (e) {\n const code = (e as NodeJS.ErrnoException).code\n if (code === 'EACCES' || code === 'EPERM') {\n throw new Error(\n `Permission denied removing DLX package \"${packageName}\"\\n` +\n `Directory: ${packageDir}\\n` +\n 'To resolve:\\n' +\n ' 1. Check file/directory permissions\\n' +\n ' 2. Close any programs using files in this directory\\n' +\n ' 3. Try running with elevated privileges if necessary\\n' +\n ` 4. Manually remove: rm -rf \"${packageDir}\"`,\n { cause: e },\n )\n }\n if (code === 'EROFS') {\n throw new Error(\n `Cannot remove DLX package \"${packageName}\" from read-only filesystem\\n` +\n `Directory: ${packageDir}\\n` +\n 'The filesystem is mounted read-only.',\n { cause: e },\n )\n }\n throw new Error(\n `Failed to remove DLX package \"${packageName}\"\\n` +\n `Directory: ${packageDir}\\n` +\n 'Check permissions and ensure no programs are using this directory.',\n { cause: e },\n )\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
7
  }
@@ -1,3 +1,66 @@
1
1
  /* Socket Lib - Built with esbuild */
2
- var l=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var b=(r,t)=>{for(var s in t)l(r,s,{get:t[s],enumerable:!0})},p=(r,t,s,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let e of c(t))!d.call(r,e)&&e!==s&&l(r,e,{get:()=>t[e],enumerable:!(n=u(t,e))||n.enumerable});return r};var F=r=>p(l({},"__esModule",{value:!0}),r);var E={};b(E,{generateSocketSpinnerFrames:()=>f});module.exports=F(E);function f(r){const s={__proto__:null,...r}.interval??50,n="\x1B[1m",e="\x1B[2m",$="\x1B[0m",a="\u26A1\uFE0E",o="\u2726\uFE0E",i="\u2727\uFE0E",m="\u22C6\uFE0E";return{__proto__:null,frames:[`${e}${i}${$}`,`${e}${i}${$}`,`${e}${m}${$}`,`${o}${$}`,`${o}${$}`,`${n}${o}${$}`,`${n}${o}${$}`,`${n}${a}${$}`,`${n}${a}${$}`,`${n}${a}${$}`,`${n}${a}${$}`,`${n}${a}${$}`,`${n}${o}${$}`,`${n}${o}${$}`,`${o}${$}`,`${o}${$}`,`${e}${m}${$}`,`${e}${i}${$}`],interval:s}}0&&(module.exports={generateSocketSpinnerFrames});
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var pulse_frames_exports = {};
20
+ __export(pulse_frames_exports, {
21
+ generateSocketSpinnerFrames: () => generateSocketSpinnerFrames
22
+ });
23
+ module.exports = __toCommonJS(pulse_frames_exports);
24
+ function generateSocketSpinnerFrames(options) {
25
+ const opts = { __proto__: null, ...options };
26
+ const interval = opts.interval ?? 50;
27
+ const bold = "\x1B[1m";
28
+ const dim = "\x1B[2m";
29
+ const reset = "\x1B[0m";
30
+ const lightning = "\u26A1\uFE0E";
31
+ const starFilled = "\u2726\uFE0E";
32
+ const starOutline = "\u2727\uFE0E";
33
+ const starTiny = "\u22C6\uFE0E";
34
+ const frames = [
35
+ // Build up from dim to bright
36
+ `${dim}${starOutline}${reset}`,
37
+ `${dim}${starOutline}${reset}`,
38
+ `${dim}${starTiny}${reset}`,
39
+ `${starFilled}${reset}`,
40
+ `${starFilled}${reset}`,
41
+ `${bold}${starFilled}${reset}`,
42
+ `${bold}${starFilled}${reset}`,
43
+ `${bold}${lightning}${reset}`,
44
+ `${bold}${lightning}${reset}`,
45
+ `${bold}${lightning}${reset}`,
46
+ // Fade down
47
+ `${bold}${lightning}${reset}`,
48
+ `${bold}${lightning}${reset}`,
49
+ `${bold}${starFilled}${reset}`,
50
+ `${bold}${starFilled}${reset}`,
51
+ `${starFilled}${reset}`,
52
+ `${starFilled}${reset}`,
53
+ `${dim}${starTiny}${reset}`,
54
+ `${dim}${starOutline}${reset}`
55
+ ];
56
+ return {
57
+ __proto__: null,
58
+ frames,
59
+ interval
60
+ };
61
+ }
62
+ // Annotate the CommonJS export names for ESM import in node:
63
+ 0 && (module.exports = {
64
+ generateSocketSpinnerFrames
65
+ });
3
66
  //# sourceMappingURL=pulse-frames.js.map
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/effects/pulse-frames.ts"],
4
4
  "sourcesContent": ["/**\n * @fileoverview Socket pulse animation frames generator.\n * Generates themeable pulsing animation frames using sparkles (\u2727 \u2726) and lightning (\u26A1).\n * Follows the cli-spinners format: https://github.com/sindresorhus/cli-spinners\n */\n\nexport type SocketFramesOptions = {\n readonly baseColor?: readonly [number, number, number] | undefined\n readonly interval?: number | undefined\n}\n\n/**\n * Generate Socket pulse animation frames.\n * Creates a pulsing throbber using Unicode sparkles and lightning symbols.\n * Frames use brightness modifiers (bold/dim) but no embedded colors.\n * Yocto-spinner applies the current spinner color to each frame.\n *\n * Returns a spinner definition compatible with cli-spinners format.\n *\n * @see https://github.com/sindresorhus/cli-spinners/blob/main/spinners.json\n */\nexport function generateSocketSpinnerFrames(\n options?: SocketFramesOptions | undefined,\n): {\n frames: string[]\n interval: number\n} {\n const opts = { __proto__: null, ...options } as SocketFramesOptions\n const interval = opts.interval ?? 50\n\n // ANSI codes for brightness modifiers only (no colors).\n // Yocto-spinner will apply the spinner's current color to each frame.\n const bold = '\\x1b[1m'\n const dim = '\\x1b[2m'\n const reset = '\\x1b[0m'\n\n // Using VS15 (\\uFE0E) to force text-style rendering.\n // Lightning bolt (\u26A1) is wider than stars. To keep consistent spacing:\n // - All frames have NO internal padding\n // - Yocto-spinner adds 1 space after each frame\n // - Success/fail symbols also get 1 space (consistent)\n const lightning = '\u26A1\\uFE0E'\n const starFilled = '\u2726\\uFE0E'\n const starOutline = '\u2727\\uFE0E'\n const starTiny = '\u22C6\\uFE0E'\n\n // Pulse frames with brightness modifiers only.\n // Each frame gets colored by yocto-spinner based on current spinner.color.\n // Yocto-spinner adds 1 space after the frame automatically.\n const frames = [\n // Build up from dim to bright\n `${dim}${starOutline}${reset}`,\n `${dim}${starOutline}${reset}`,\n `${dim}${starTiny}${reset}`,\n `${starFilled}${reset}`,\n `${starFilled}${reset}`,\n `${bold}${starFilled}${reset}`,\n `${bold}${starFilled}${reset}`,\n `${bold}${lightning}${reset}`,\n `${bold}${lightning}${reset}`,\n `${bold}${lightning}${reset}`,\n // Fade down\n `${bold}${lightning}${reset}`,\n `${bold}${lightning}${reset}`,\n `${bold}${starFilled}${reset}`,\n `${bold}${starFilled}${reset}`,\n `${starFilled}${reset}`,\n `${starFilled}${reset}`,\n `${dim}${starTiny}${reset}`,\n `${dim}${starOutline}${reset}`,\n ]\n\n return {\n __proto__: null,\n frames,\n interval,\n } as { frames: string[]; interval: number }\n}\n"],
5
- "mappings": ";4ZAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,iCAAAE,IAAA,eAAAC,EAAAH,GAqBO,SAASE,EACdE,EAIA,CAEA,MAAMC,EADO,CAAE,UAAW,KAAM,GAAGD,CAAQ,EACrB,UAAY,GAI5BE,EAAO,UACPC,EAAM,UACNC,EAAQ,UAORC,EAAY,eACZC,EAAa,eACbC,EAAc,eACdC,EAAW,eA4BjB,MAAO,CACL,UAAW,KACX,OAzBa,CAEb,GAAGL,CAAG,GAAGI,CAAW,GAAGH,CAAK,GAC5B,GAAGD,CAAG,GAAGI,CAAW,GAAGH,CAAK,GAC5B,GAAGD,CAAG,GAAGK,CAAQ,GAAGJ,CAAK,GACzB,GAAGE,CAAU,GAAGF,CAAK,GACrB,GAAGE,CAAU,GAAGF,CAAK,GACrB,GAAGF,CAAI,GAAGI,CAAU,GAAGF,CAAK,GAC5B,GAAGF,CAAI,GAAGI,CAAU,GAAGF,CAAK,GAC5B,GAAGF,CAAI,GAAGG,CAAS,GAAGD,CAAK,GAC3B,GAAGF,CAAI,GAAGG,CAAS,GAAGD,CAAK,GAC3B,GAAGF,CAAI,GAAGG,CAAS,GAAGD,CAAK,GAE3B,GAAGF,CAAI,GAAGG,CAAS,GAAGD,CAAK,GAC3B,GAAGF,CAAI,GAAGG,CAAS,GAAGD,CAAK,GAC3B,GAAGF,CAAI,GAAGI,CAAU,GAAGF,CAAK,GAC5B,GAAGF,CAAI,GAAGI,CAAU,GAAGF,CAAK,GAC5B,GAAGE,CAAU,GAAGF,CAAK,GACrB,GAAGE,CAAU,GAAGF,CAAK,GACrB,GAAGD,CAAG,GAAGK,CAAQ,GAAGJ,CAAK,GACzB,GAAGD,CAAG,GAAGI,CAAW,GAAGH,CAAK,EAC9B,EAKE,SAAAH,CACF,CACF",
6
- "names": ["pulse_frames_exports", "__export", "generateSocketSpinnerFrames", "__toCommonJS", "options", "interval", "bold", "dim", "reset", "lightning", "starFilled", "starOutline", "starTiny"]
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBO,SAAS,4BACd,SAIA;AACA,QAAM,OAAO,EAAE,WAAW,MAAM,GAAG,QAAQ;AAC3C,QAAM,WAAW,KAAK,YAAY;AAIlC,QAAM,OAAO;AACb,QAAM,MAAM;AACZ,QAAM,QAAQ;AAOd,QAAM,YAAY;AAClB,QAAM,aAAa;AACnB,QAAM,cAAc;AACpB,QAAM,WAAW;AAKjB,QAAM,SAAS;AAAA;AAAA,IAEb,GAAG,GAAG,GAAG,WAAW,GAAG,KAAK;AAAA,IAC5B,GAAG,GAAG,GAAG,WAAW,GAAG,KAAK;AAAA,IAC5B,GAAG,GAAG,GAAG,QAAQ,GAAG,KAAK;AAAA,IACzB,GAAG,UAAU,GAAG,KAAK;AAAA,IACrB,GAAG,UAAU,GAAG,KAAK;AAAA,IACrB,GAAG,IAAI,GAAG,UAAU,GAAG,KAAK;AAAA,IAC5B,GAAG,IAAI,GAAG,UAAU,GAAG,KAAK;AAAA,IAC5B,GAAG,IAAI,GAAG,SAAS,GAAG,KAAK;AAAA,IAC3B,GAAG,IAAI,GAAG,SAAS,GAAG,KAAK;AAAA,IAC3B,GAAG,IAAI,GAAG,SAAS,GAAG,KAAK;AAAA;AAAA,IAE3B,GAAG,IAAI,GAAG,SAAS,GAAG,KAAK;AAAA,IAC3B,GAAG,IAAI,GAAG,SAAS,GAAG,KAAK;AAAA,IAC3B,GAAG,IAAI,GAAG,UAAU,GAAG,KAAK;AAAA,IAC5B,GAAG,IAAI,GAAG,UAAU,GAAG,KAAK;AAAA,IAC5B,GAAG,UAAU,GAAG,KAAK;AAAA,IACrB,GAAG,UAAU,GAAG,KAAK;AAAA,IACrB,GAAG,GAAG,GAAG,QAAQ,GAAG,KAAK;AAAA,IACzB,GAAG,GAAG,GAAG,WAAW,GAAG,KAAK;AAAA,EAC9B;AAEA,SAAO;AAAA,IACL,WAAW;AAAA,IACX;AAAA,IACA;AAAA,EACF;AACF;",
6
+ "names": []
7
7
  }
@@ -1,3 +1,176 @@
1
1
  /* Socket Lib - Built with esbuild */
2
- var y=Object.defineProperty;var O=Object.getOwnPropertyDescriptor;var G=Object.getOwnPropertyNames;var M=Object.prototype.hasOwnProperty;var A=(e,r)=>{for(var t in r)y(e,t,{get:r[t],enumerable:!0})},E=(e,r,t,n)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of G(r))!M.call(e,o)&&o!==t&&y(e,o,{get:()=>r[o],enumerable:!(n=O(r,o))||n.enumerable});return e};var N=e=>E(y({},"__esModule",{value:!0}),e);var H={};A(H,{COLOR_INHERIT:()=>j,DIR_LTR:()=>p,DIR_NONE:()=>x,DIR_RANDOM:()=>a,DIR_RTL:()=>u,MODE_BI:()=>_,applyShimmer:()=>B});module.exports=N(H);var l=require("../ansi"),$=require("../arrays"),C=require("#env/ci");function k(e){return{__proto__:null,bold:/\x1b\[1m/.test(e),dim:/\x1b\[2m/.test(e),italic:/\x1b\[3m/.test(e),strikethrough:/\x1b\[9m/.test(e),underline:/\x1b\[4m/.test(e)}}function D(e){let r="";return e.bold&&(r+="\x1B[1m"),e.dim&&(r+="\x1B[2m"),e.italic&&(r+="\x1B[3m"),e.underline&&(r+="\x1B[4m"),e.strikethrough&&(r+="\x1B[9m"),r}const j="inherit",p="ltr",x="none",a="random",u="rtl",_="bi";function w(e,r=2.5){return e>r?0:(1-e/r)**2.5}function z(e,r,t){const n=Math.round(e[0]+(r[0]-e[0])*t),o=Math.round(e[1]+(r[1]-e[1])*t),s=Math.round(e[2]+(r[2]-e[2])*t);return[n,o,s]}function L(e,r,t,n,o){const s=Math.abs(r-t),m=w(s),b=D(o),i=(0,$.isArray)(n[0])?n[r%n.length]??[140,82,255]:n;if(m===0){const h=`\x1B[38;2;${i[0]};${i[1]};${i[2]}m`;return`${b}${h}${e}${l.ANSI_RESET}`}const d=z(i,[255,255,255],m),c=`\x1B[38;2;${d[0]};${d[1]};${d[2]}m`;return`${b}${c}${e}${l.ANSI_RESET}`}function P(e,r,t,n=2.5){const o=e+n+2;return t===u?e-r%o:r%o}function W(e){return e===a?Math.random()<.5?p:u:e===u?u:p}function B(e,r,t){const n={__proto__:null,...t},o=n.direction??x,s=n.shimmerWidth??2.5,m=n.color??[140,82,255],b=n.styles??k(e),i=(0,l.stripAnsi)(e);if((0,C.getCI)()||!i||o===x){const h=D(b),S=(0,$.isArray)(m[0]);return i.split("").map((R,T)=>{const f=S?m[T%m.length]??[140,82,255]:m,I=`\x1B[38;2;${f[0]};${f[1]};${f[2]}m`;return`${h}${I}${R}${l.ANSI_RESET}`}).join("")}const g=P(i.length,r.step,r.currentDir,s),d=i.split("").map((h,S)=>L(h,S,g,m,b)).join("");r.step+=r.speed;const c=i.length+s+2;return r.mode===_?r.step>=c&&(r.step=0,r.currentDir=r.currentDir===p?u:p):r.mode===a?r.step>=c&&(r.step=0,r.currentDir=W(a)):r.step>=c&&(r.step=0),d}0&&(module.exports={COLOR_INHERIT,DIR_LTR,DIR_NONE,DIR_RANDOM,DIR_RTL,MODE_BI,applyShimmer});
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var text_shimmer_exports = {};
20
+ __export(text_shimmer_exports, {
21
+ COLOR_INHERIT: () => COLOR_INHERIT,
22
+ DIR_LTR: () => DIR_LTR,
23
+ DIR_NONE: () => DIR_NONE,
24
+ DIR_RANDOM: () => DIR_RANDOM,
25
+ DIR_RTL: () => DIR_RTL,
26
+ MODE_BI: () => MODE_BI,
27
+ applyShimmer: () => applyShimmer
28
+ });
29
+ module.exports = __toCommonJS(text_shimmer_exports);
30
+ var import_ansi = require("../ansi");
31
+ var import_arrays = require("../arrays");
32
+ var import_ci = require("#env/ci");
33
+ function detectStyles(text) {
34
+ return {
35
+ __proto__: null,
36
+ // biome-ignore lint/suspicious/noControlCharactersInRegex: ANSI escape sequence detection.
37
+ bold: /\x1b\[1m/.test(text),
38
+ // biome-ignore lint/suspicious/noControlCharactersInRegex: ANSI escape sequence detection.
39
+ dim: /\x1b\[2m/.test(text),
40
+ // biome-ignore lint/suspicious/noControlCharactersInRegex: ANSI escape sequence detection.
41
+ italic: /\x1b\[3m/.test(text),
42
+ // biome-ignore lint/suspicious/noControlCharactersInRegex: ANSI escape sequence detection.
43
+ strikethrough: /\x1b\[9m/.test(text),
44
+ // biome-ignore lint/suspicious/noControlCharactersInRegex: ANSI escape sequence detection.
45
+ underline: /\x1b\[4m/.test(text)
46
+ };
47
+ }
48
+ function stylesToAnsi(styles) {
49
+ let codes = "";
50
+ if (styles.bold) {
51
+ codes += "\x1B[1m";
52
+ }
53
+ if (styles.dim) {
54
+ codes += "\x1B[2m";
55
+ }
56
+ if (styles.italic) {
57
+ codes += "\x1B[3m";
58
+ }
59
+ if (styles.underline) {
60
+ codes += "\x1B[4m";
61
+ }
62
+ if (styles.strikethrough) {
63
+ codes += "\x1B[9m";
64
+ }
65
+ return codes;
66
+ }
67
+ const COLOR_INHERIT = "inherit";
68
+ const DIR_LTR = "ltr";
69
+ const DIR_NONE = "none";
70
+ const DIR_RANDOM = "random";
71
+ const DIR_RTL = "rtl";
72
+ const MODE_BI = "bi";
73
+ function shimmerIntensity(distance, shimmerWidth = 2.5) {
74
+ if (distance > shimmerWidth) {
75
+ return 0;
76
+ }
77
+ const normalized = distance / shimmerWidth;
78
+ return (1 - normalized) ** 2.5;
79
+ }
80
+ function blendColors(color1, color2, factor) {
81
+ const r = Math.round(color1[0] + (color2[0] - color1[0]) * factor);
82
+ const g = Math.round(color1[1] + (color2[1] - color1[1]) * factor);
83
+ const b = Math.round(color1[2] + (color2[2] - color1[2]) * factor);
84
+ return [r, g, b];
85
+ }
86
+ function renderChar(char, index, shimmerPos, baseColor, styles) {
87
+ const distance = Math.abs(index - shimmerPos);
88
+ const intensity = shimmerIntensity(distance);
89
+ const styleCode = stylesToAnsi(styles);
90
+ const charColor = (0, import_arrays.isArray)(baseColor[0]) ? baseColor[index % baseColor.length] ?? [
91
+ 140,
92
+ 82,
93
+ 255
94
+ ] : baseColor;
95
+ if (intensity === 0) {
96
+ const base = `\x1B[38;2;${charColor[0]};${charColor[1]};${charColor[2]}m`;
97
+ return `${styleCode}${base}${char}${import_ansi.ANSI_RESET}`;
98
+ }
99
+ const white = [255, 255, 255];
100
+ const blended = blendColors(charColor, white, intensity);
101
+ const color = `\x1B[38;2;${blended[0]};${blended[1]};${blended[2]}m`;
102
+ return `${styleCode}${color}${char}${import_ansi.ANSI_RESET}`;
103
+ }
104
+ function getShimmerPos(textLength, step, currentDir, shimmerWidth = 2.5) {
105
+ const totalSteps = textLength + shimmerWidth + 2;
106
+ if (currentDir === DIR_RTL) {
107
+ return textLength - step % totalSteps;
108
+ }
109
+ return step % totalSteps;
110
+ }
111
+ function pickDirection(direction) {
112
+ if (direction === DIR_RANDOM) {
113
+ return Math.random() < 0.5 ? DIR_LTR : DIR_RTL;
114
+ }
115
+ if (direction === DIR_RTL) {
116
+ return DIR_RTL;
117
+ }
118
+ return DIR_LTR;
119
+ }
120
+ function applyShimmer(text, state, options) {
121
+ const opts = { __proto__: null, ...options };
122
+ const direction = opts.direction ?? DIR_NONE;
123
+ const shimmerWidth = opts.shimmerWidth ?? 2.5;
124
+ const color = opts.color ?? [140, 82, 255];
125
+ const styles = opts.styles ?? detectStyles(text);
126
+ const plainText = (0, import_ansi.stripAnsi)(text);
127
+ if ((0, import_ci.getCI)() || !plainText || direction === DIR_NONE) {
128
+ const styleCode = stylesToAnsi(styles);
129
+ const isGradient = (0, import_arrays.isArray)(color[0]);
130
+ return plainText.split("").map((char, i) => {
131
+ const charColor = isGradient ? color[i % color.length] ?? [
132
+ 140,
133
+ 82,
134
+ 255
135
+ ] : color;
136
+ const base = `\x1B[38;2;${charColor[0]};${charColor[1]};${charColor[2]}m`;
137
+ return `${styleCode}${base}${char}${import_ansi.ANSI_RESET}`;
138
+ }).join("");
139
+ }
140
+ const shimmerPos = getShimmerPos(
141
+ plainText.length,
142
+ state.step,
143
+ state.currentDir,
144
+ shimmerWidth
145
+ );
146
+ const result = plainText.split("").map((char, i) => renderChar(char, i, shimmerPos, color, styles)).join("");
147
+ state.step += state.speed;
148
+ const totalSteps = plainText.length + shimmerWidth + 2;
149
+ if (state.mode === MODE_BI) {
150
+ if (state.step >= totalSteps) {
151
+ state.step = 0;
152
+ state.currentDir = state.currentDir === DIR_LTR ? DIR_RTL : DIR_LTR;
153
+ }
154
+ } else if (state.mode === DIR_RANDOM) {
155
+ if (state.step >= totalSteps) {
156
+ state.step = 0;
157
+ state.currentDir = pickDirection(DIR_RANDOM);
158
+ }
159
+ } else {
160
+ if (state.step >= totalSteps) {
161
+ state.step = 0;
162
+ }
163
+ }
164
+ return result;
165
+ }
166
+ // Annotate the CommonJS export names for ESM import in node:
167
+ 0 && (module.exports = {
168
+ COLOR_INHERIT,
169
+ DIR_LTR,
170
+ DIR_NONE,
171
+ DIR_RANDOM,
172
+ DIR_RTL,
173
+ MODE_BI,
174
+ applyShimmer
175
+ });
3
176
  //# sourceMappingURL=text-shimmer.js.map