@visulima/vis 1.0.0-alpha.7 → 1.0.0-alpha.9

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 (275) hide show
  1. package/CHANGELOG.md +107 -47
  2. package/LICENSE.md +44 -1
  3. package/README.md +56 -0
  4. package/dist/bin.js +1 -991
  5. package/dist/config.d.ts +1073 -68
  6. package/dist/config.js +1 -1
  7. package/dist/generate/index.d.ts +155 -30
  8. package/dist/packem_chunks/handler.js +1 -0
  9. package/dist/packem_chunks/handler10.js +1 -0
  10. package/dist/packem_chunks/handler11.js +1 -0
  11. package/dist/packem_chunks/handler12.js +153 -0
  12. package/dist/packem_chunks/handler13.js +1 -0
  13. package/dist/packem_chunks/handler14.js +3 -0
  14. package/dist/packem_chunks/handler15.js +1 -0
  15. package/dist/packem_chunks/handler16.js +2 -0
  16. package/dist/packem_chunks/handler17.js +7 -0
  17. package/dist/packem_chunks/handler18.js +1 -0
  18. package/dist/packem_chunks/handler19.js +19 -0
  19. package/dist/packem_chunks/handler2.js +1 -0
  20. package/dist/packem_chunks/handler20.js +428 -0
  21. package/dist/packem_chunks/handler21.js +22 -0
  22. package/dist/packem_chunks/handler22.js +3 -0
  23. package/dist/packem_chunks/handler23.js +5 -0
  24. package/dist/packem_chunks/handler24.js +1 -0
  25. package/dist/packem_chunks/handler25.js +20 -0
  26. package/dist/packem_chunks/handler26.js +1 -0
  27. package/dist/packem_chunks/handler27.js +1 -0
  28. package/dist/packem_chunks/handler28.js +1 -0
  29. package/dist/packem_chunks/handler29.js +2 -0
  30. package/dist/packem_chunks/handler3.js +2 -0
  31. package/dist/packem_chunks/handler30.js +22 -0
  32. package/dist/packem_chunks/handler31.js +1 -0
  33. package/dist/packem_chunks/handler32.js +1 -0
  34. package/dist/packem_chunks/handler33.js +37 -0
  35. package/dist/packem_chunks/handler34.js +3 -0
  36. package/dist/packem_chunks/handler35.js +23 -0
  37. package/dist/packem_chunks/handler36.js +5 -0
  38. package/dist/packem_chunks/handler37.js +27 -0
  39. package/dist/packem_chunks/handler38.js +1 -0
  40. package/dist/packem_chunks/handler39.js +2 -0
  41. package/dist/packem_chunks/handler4.js +5 -0
  42. package/dist/packem_chunks/handler40.js +1 -0
  43. package/dist/packem_chunks/handler41.js +5 -0
  44. package/dist/packem_chunks/handler42.js +1 -0
  45. package/dist/packem_chunks/handler43.js +24 -0
  46. package/dist/packem_chunks/handler44.js +3 -0
  47. package/dist/packem_chunks/handler45.js +1 -0
  48. package/dist/packem_chunks/handler5.js +4 -0
  49. package/dist/packem_chunks/handler6.js +2 -0
  50. package/dist/packem_chunks/handler7.js +24 -0
  51. package/dist/packem_chunks/handler8.js +6 -0
  52. package/dist/packem_chunks/handler9.js +8 -0
  53. package/dist/packem_shared/VisUpdateApp-BBx3idMI.js +1 -0
  54. package/dist/packem_shared/ai-analysis-DDqXRFxY.js +67 -0
  55. package/dist/packem_shared/bin-BaZZ32BK.js +93 -0
  56. package/dist/packem_shared/cache-directory-DL8hfXeG.js +1 -0
  57. package/dist/packem_shared/catalog-CuSpuB_R.js +12 -0
  58. package/dist/packem_shared/dependency-scan-BoLG2Fez.js +1 -0
  59. package/dist/packem_shared/docker-BcfqH4Av.js +2 -0
  60. package/dist/packem_shared/flakiness-DSIHZGBT.js +1 -0
  61. package/dist/packem_shared/otelPlugin-DxyvBcXO.js +1 -0
  62. package/dist/packem_shared/runtime-check-CGHal8SO.js +1 -0
  63. package/dist/packem_shared/selectors-CfH9ZY08.js +3 -0
  64. package/dist/packem_shared/symbols-CIMw60-G.js +1 -0
  65. package/dist/packem_shared/toolchain-C3ZG0o_X.js +5 -0
  66. package/dist/packem_shared/typosquats-Bpq4zcWL.js +1 -0
  67. package/dist/packem_shared/utils-DrNg0XTR.js +1 -0
  68. package/index.js +555 -727
  69. package/package.json +29 -19
  70. package/schemas/project.schema.json +1 -1
  71. package/schemas/vis-config.schema.json +47 -1
  72. package/dist/ai-analysis.d.ts +0 -26
  73. package/dist/ai-cache.d.ts +0 -21
  74. package/dist/ai-types.d.ts +0 -16
  75. package/dist/audit-config.d.ts +0 -24
  76. package/dist/bin.d.ts +0 -1
  77. package/dist/cache-directory.d.ts +0 -73
  78. package/dist/catalog.d.ts +0 -136
  79. package/dist/codeowners.d.ts +0 -30
  80. package/dist/commands/action-graph.d.ts +0 -8
  81. package/dist/commands/add.d.ts +0 -3
  82. package/dist/commands/affected.d.ts +0 -3
  83. package/dist/commands/ai.d.ts +0 -3
  84. package/dist/commands/analyze.d.ts +0 -3
  85. package/dist/commands/approve-builds.d.ts +0 -3
  86. package/dist/commands/audit.d.ts +0 -23
  87. package/dist/commands/cache.d.ts +0 -86
  88. package/dist/commands/check.d.ts +0 -3
  89. package/dist/commands/ci.d.ts +0 -19
  90. package/dist/commands/clean.d.ts +0 -3
  91. package/dist/commands/create/discovery.d.ts +0 -42
  92. package/dist/commands/create/index.d.ts +0 -13
  93. package/dist/commands/create/prompts.d.ts +0 -31
  94. package/dist/commands/create/random-name.d.ts +0 -15
  95. package/dist/commands/create/templates/builtin.d.ts +0 -15
  96. package/dist/commands/create/templates/generator.d.ts +0 -14
  97. package/dist/commands/create/templates/index.d.ts +0 -13
  98. package/dist/commands/create/templates/monorepo.d.ts +0 -16
  99. package/dist/commands/create/templates/remote.d.ts +0 -41
  100. package/dist/commands/create/templates/types.d.ts +0 -46
  101. package/dist/commands/create/utils.d.ts +0 -42
  102. package/dist/commands/dedupe.d.ts +0 -3
  103. package/dist/commands/devcontainer.d.ts +0 -3
  104. package/dist/commands/dlx.d.ts +0 -3
  105. package/dist/commands/docker.d.ts +0 -22
  106. package/dist/commands/doctor.d.ts +0 -15
  107. package/dist/commands/exec.d.ts +0 -3
  108. package/dist/commands/generate.d.ts +0 -10
  109. package/dist/commands/graph.d.ts +0 -3
  110. package/dist/commands/hook/constants.d.ts +0 -8
  111. package/dist/commands/hook/index.d.ts +0 -3
  112. package/dist/commands/hook/install.d.ts +0 -7
  113. package/dist/commands/hook/migrate.d.ts +0 -27
  114. package/dist/commands/hook/uninstall.d.ts +0 -3
  115. package/dist/commands/ignore-helpers.d.ts +0 -157
  116. package/dist/commands/ignore.d.ts +0 -17
  117. package/dist/commands/implode.d.ts +0 -3
  118. package/dist/commands/info.d.ts +0 -3
  119. package/dist/commands/init.d.ts +0 -14
  120. package/dist/commands/install.d.ts +0 -3
  121. package/dist/commands/link.d.ts +0 -3
  122. package/dist/commands/list.d.ts +0 -3
  123. package/dist/commands/migrate/backup.d.ts +0 -8
  124. package/dist/commands/migrate/constants.d.ts +0 -16
  125. package/dist/commands/migrate/deps.d.ts +0 -32
  126. package/dist/commands/migrate/gitleaks.d.ts +0 -29
  127. package/dist/commands/migrate/index.d.ts +0 -3
  128. package/dist/commands/migrate/json.d.ts +0 -22
  129. package/dist/commands/migrate/kingfisher.d.ts +0 -14
  130. package/dist/commands/migrate/lint-staged.d.ts +0 -62
  131. package/dist/commands/migrate/moon.d.ts +0 -5
  132. package/dist/commands/migrate/nano-staged.d.ts +0 -30
  133. package/dist/commands/migrate/nx.d.ts +0 -12
  134. package/dist/commands/migrate/prompt.d.ts +0 -2
  135. package/dist/commands/migrate/secretlint.d.ts +0 -14
  136. package/dist/commands/migrate/shared.d.ts +0 -29
  137. package/dist/commands/migrate/turborepo.d.ts +0 -11
  138. package/dist/commands/migrate/types.d.ts +0 -27
  139. package/dist/commands/migrate/verify.d.ts +0 -12
  140. package/dist/commands/optimize.d.ts +0 -38
  141. package/dist/commands/pm.d.ts +0 -3
  142. package/dist/commands/remove.d.ts +0 -3
  143. package/dist/commands/run.d.ts +0 -16
  144. package/dist/commands/sbom.d.ts +0 -10
  145. package/dist/commands/secrets.d.ts +0 -3
  146. package/dist/commands/sort-package-json.d.ts +0 -3
  147. package/dist/commands/staged.d.ts +0 -10
  148. package/dist/commands/status.d.ts +0 -3
  149. package/dist/commands/sync.d.ts +0 -16
  150. package/dist/commands/task-why.d.ts +0 -3
  151. package/dist/commands/unlink.d.ts +0 -3
  152. package/dist/commands/update.d.ts +0 -3
  153. package/dist/commands/upgrade.d.ts +0 -3
  154. package/dist/commands/why.d.ts +0 -3
  155. package/dist/docker.d.ts +0 -73
  156. package/dist/flakiness.d.ts +0 -40
  157. package/dist/generate/discover.d.ts +0 -29
  158. package/dist/generate/loader.d.ts +0 -15
  159. package/dist/generate/moon-adapter/filename-interp.d.ts +0 -42
  160. package/dist/generate/moon-adapter/filters.d.ts +0 -22
  161. package/dist/generate/moon-adapter/frontmatter.d.ts +0 -39
  162. package/dist/generate/moon-adapter/index.d.ts +0 -19
  163. package/dist/generate/moon-adapter/tera-subset.d.ts +0 -85
  164. package/dist/generate/moon-adapter/util.d.ts +0 -14
  165. package/dist/generate/prompts.d.ts +0 -25
  166. package/dist/generate/remote.d.ts +0 -43
  167. package/dist/generate/runner.d.ts +0 -37
  168. package/dist/generate/types.d.ts +0 -152
  169. package/dist/hooks.d.ts +0 -118
  170. package/dist/native-binding.d.ts +0 -158
  171. package/dist/output.d.ts +0 -40
  172. package/dist/overrides.d.ts +0 -82
  173. package/dist/package-manager.d.ts +0 -23
  174. package/dist/packem_shared/otelPlugin-CJLkguJ8.js +0 -1
  175. package/dist/plugins/config-loader.d.ts +0 -3
  176. package/dist/plugins/otel.d.ts +0 -63
  177. package/dist/plugins/post-command.d.ts +0 -3
  178. package/dist/plugins/security-enforcement.d.ts +0 -3
  179. package/dist/pm-runner.d.ts +0 -44
  180. package/dist/run-report.d.ts +0 -40
  181. package/dist/runtime-check.d.ts +0 -27
  182. package/dist/sbom/cyclonedx.d.ts +0 -39
  183. package/dist/sbom/installed-package.d.ts +0 -49
  184. package/dist/sbom/license.d.ts +0 -31
  185. package/dist/sbom/lockfile.d.ts +0 -34
  186. package/dist/sbom/purl.d.ts +0 -25
  187. package/dist/sbom/resolve-specifier.d.ts +0 -24
  188. package/dist/sbom/types.d.ts +0 -196
  189. package/dist/secrets/baseline.d.ts +0 -20
  190. package/dist/secrets/format.d.ts +0 -14
  191. package/dist/secrets/git.d.ts +0 -6
  192. package/dist/secrets/spinner.d.ts +0 -9
  193. package/dist/security.d.ts +0 -64
  194. package/dist/selectors.d.ts +0 -81
  195. package/dist/shell-history.d.ts +0 -16
  196. package/dist/socket-security.d.ts +0 -129
  197. package/dist/staged/cli-parse.d.ts +0 -18
  198. package/dist/staged/config.d.ts +0 -14
  199. package/dist/staged/errors/apply-empty-commit-error.d.ts +0 -4
  200. package/dist/staged/errors/config-error.d.ts +0 -4
  201. package/dist/staged/errors/get-backup-stash-error.d.ts +0 -4
  202. package/dist/staged/errors/git-error.d.ts +0 -6
  203. package/dist/staged/errors/index.d.ts +0 -12
  204. package/dist/staged/errors/restore-original-state-error.d.ts +0 -4
  205. package/dist/staged/errors/staged-error.d.ts +0 -8
  206. package/dist/staged/errors/task-error.d.ts +0 -6
  207. package/dist/staged/git/diff.d.ts +0 -76
  208. package/dist/staged/git/exec.d.ts +0 -43
  209. package/dist/staged/git/index.d.ts +0 -77
  210. package/dist/staged/git/stash.d.ts +0 -37
  211. package/dist/staged/index.d.ts +0 -13
  212. package/dist/staged/match.d.ts +0 -12
  213. package/dist/staged/renderer/index.d.ts +0 -9
  214. package/dist/staged/renderer/ink/index.d.ts +0 -4
  215. package/dist/staged/renderer/plain.d.ts +0 -12
  216. package/dist/staged/tasks/build.d.ts +0 -13
  217. package/dist/staged/tasks/exec.d.ts +0 -56
  218. package/dist/staged/tasks/run.d.ts +0 -26
  219. package/dist/staged/types.d.ts +0 -173
  220. package/dist/target-discovery.d.ts +0 -59
  221. package/dist/target-options.d.ts +0 -261
  222. package/dist/tips.d.ts +0 -41
  223. package/dist/tui/components/CheckProgressApp.d.ts +0 -6
  224. package/dist/tui/components/CommandSummary.d.ts +0 -17
  225. package/dist/tui/components/Header.d.ts +0 -13
  226. package/dist/tui/components/OutputPanel.d.ts +0 -17
  227. package/dist/tui/components/QuitDialog.d.ts +0 -15
  228. package/dist/tui/components/TaskListPanel.d.ts +0 -19
  229. package/dist/tui/components/TaskRow.d.ts +0 -12
  230. package/dist/tui/components/TaskStore.d.ts +0 -80
  231. package/dist/tui/components/VisTaskRunnerApp.d.ts +0 -17
  232. package/dist/tui/components/devcontainer/DevcontainerStore.d.ts +0 -66
  233. package/dist/tui/components/devcontainer/VisDevcontainerApp.d.ts +0 -9
  234. package/dist/tui/components/devcontainer/catalogs/extensions.d.ts +0 -8
  235. package/dist/tui/components/devcontainer/catalogs/features.d.ts +0 -8
  236. package/dist/tui/components/devcontainer/catalogs/filters.d.ts +0 -4
  237. package/dist/tui/components/devcontainer/catalogs/mount-suggestions.d.ts +0 -19
  238. package/dist/tui/components/devcontainer/catalogs/templates.d.ts +0 -8
  239. package/dist/tui/components/devcontainer/devcontainer-io.d.ts +0 -14
  240. package/dist/tui/components/devcontainer/sections/DockerComposeSection.d.ts +0 -11
  241. package/dist/tui/components/devcontainer/sections/EnvironmentSection.d.ts +0 -16
  242. package/dist/tui/components/devcontainer/sections/ExtensionsSection.d.ts +0 -11
  243. package/dist/tui/components/devcontainer/sections/FeaturesSection.d.ts +0 -11
  244. package/dist/tui/components/devcontainer/sections/GeneralSection.d.ts +0 -12
  245. package/dist/tui/components/devcontainer/sections/LifecycleSection.d.ts +0 -13
  246. package/dist/tui/components/devcontainer/sections/MountsSection.d.ts +0 -16
  247. package/dist/tui/components/devcontainer/sections/PortsSection.d.ts +0 -10
  248. package/dist/tui/components/devcontainer/sections/PreviewPanel.d.ts +0 -11
  249. package/dist/tui/components/devcontainer/types.d.ts +0 -53
  250. package/dist/tui/components/devcontainer/validate.d.ts +0 -16
  251. package/dist/tui/components/graph/GraphStore.d.ts +0 -42
  252. package/dist/tui/components/graph/ProjectDetailPanel.d.ts +0 -10
  253. package/dist/tui/components/graph/ProjectListPanel.d.ts +0 -20
  254. package/dist/tui/components/graph/VisGraphApp.d.ts +0 -8
  255. package/dist/tui/components/optimize/OptimizeDetailPanel.d.ts +0 -9
  256. package/dist/tui/components/optimize/OptimizeListPanel.d.ts +0 -16
  257. package/dist/tui/components/optimize/OptimizeStore.d.ts +0 -50
  258. package/dist/tui/components/optimize/VisOptimizeApp.d.ts +0 -8
  259. package/dist/tui/components/optimize/constants.d.ts +0 -7
  260. package/dist/tui/components/update/PackageDetailPanel.d.ts +0 -12
  261. package/dist/tui/components/update/PackageListPanel.d.ts +0 -21
  262. package/dist/tui/components/update/UpdateStore.d.ts +0 -62
  263. package/dist/tui/components/update/VisUpdateApp.d.ts +0 -18
  264. package/dist/tui/dynamic-life-cycle.d.ts +0 -22
  265. package/dist/tui/formatting-utils.d.ts +0 -17
  266. package/dist/tui/pretty-time.d.ts +0 -8
  267. package/dist/tui/static-life-cycle.d.ts +0 -28
  268. package/dist/tui/status-utils.d.ts +0 -20
  269. package/dist/tui/symbols.d.ts +0 -7
  270. package/dist/tui/types.d.ts +0 -11
  271. package/dist/typosquats.d.ts +0 -70
  272. package/dist/upgrade-check.d.ts +0 -30
  273. package/dist/utils.d.ts +0 -22
  274. package/dist/watch.d.ts +0 -65
  275. package/dist/workspace.d.ts +0 -675
@@ -0,0 +1,3 @@
1
+ var Ve=Object.defineProperty;var y=(n,e)=>Ve(n,"name",{value:e,configurable:!0});import{createRequire as He}from"node:module";import{Box as c,Text as r,TextInput as he,ScrollBar as Oe,ScrollView as Ye,useApp as Ke,useWindowSize as Qe,useInput as H,Dialog as Ze,Tabs as et,Tab as tt,render as rt}from"@visulima/tui";import{C as ot,m as nt,s as it}from"../packem_shared/bin-BaZZ32BK.js";import ct,{useMemo as q,useSyncExternalStore as st,useState as C,useRef as Z,useEffect as le,useCallback as lt}from"react";import{isAccessibleSync as dt,readFileSync as ut,ensureDirSync as ht}from"@visulima/fs";import{stripJsonComments as mt}from"@visulima/fs/utils";import{join as de,dirname as gt}from"@visulima/path";import{jsxs as i,jsx as t}from"react/jsx-runtime";const Je=He(import.meta.url),V=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,qe=y(n=>{if(typeof V<"u"&&V.versions&&V.versions.node){const[e,s]=V.versions.node.split(".").map(Number);if(e>22||e===22&&s>=3||e===20&&s>=16)return V.getBuiltinModule(n)}return Je(n)},"__cjs_getBuiltinModule"),{writeFileSync:at}=qe("node:fs"),z=[{config:{customizations:{vscode:{extensions:["dbaeumer.vscode-eslint","esbenp.prettier-vscode"]}},features:{"ghcr.io/devcontainers/features/git:1":{},"ghcr.io/devcontainers/features/github-cli:1":{}},forwardPorts:[3e3],image:"mcr.microsoft.com/devcontainers/javascript-node:22",name:"Node.js",postCreateCommand:"npm install"},description:"Node.js 22 with Git and GitHub CLI",id:"node",name:"Node.js"},{config:{customizations:{vscode:{extensions:["dbaeumer.vscode-eslint","esbenp.prettier-vscode"]}},features:{"ghcr.io/devcontainers/features/git:1":{},"ghcr.io/devcontainers/features/github-cli:1":{}},forwardPorts:[3e3],image:"mcr.microsoft.com/devcontainers/javascript-node:22",mounts:[{source:"${localWorkspaceFolderBasename}-node_modules",target:"${containerWorkspaceFolder}/node_modules",type:"volume"},{source:"${localWorkspaceFolderBasename}-pnpm-store",target:"/home/node/.local/share/pnpm/store",type:"volume"}],name:"Node.js + pnpm Monorepo",postCreateCommand:"corepack enable && pnpm install",remoteUser:"node",workspaceFolder:"/workspaces/${localWorkspaceFolderBasename}"},description:"Node.js 22 with pnpm, corepack, and optimized volume mounts",id:"node-pnpm",name:"Node.js + pnpm"},{config:{customizations:{vscode:{extensions:["dbaeumer.vscode-eslint","esbenp.prettier-vscode","ms-azuretools.vscode-docker"]}},dockerComposeFile:"docker-compose.yml",forwardPorts:[3e3,5432],name:"Node.js + PostgreSQL",postCreateCommand:"npm install",service:"app",workspaceFolder:"/workspaces/${localWorkspaceFolderBasename}"},description:"Node.js with PostgreSQL via Docker Compose",id:"node-postgres",name:"Node.js + PostgreSQL"},{config:{customizations:{vscode:{extensions:["dbaeumer.vscode-eslint","esbenp.prettier-vscode","ms-azuretools.vscode-docker"]}},features:{"ghcr.io/devcontainers/features/docker-in-docker:2":{},"ghcr.io/devcontainers/features/git:1":{},"ghcr.io/devcontainers/features/github-cli:1":{}},forwardPorts:[3e3],image:"mcr.microsoft.com/devcontainers/javascript-node:22",name:"Node.js + Docker",postCreateCommand:"npm install"},description:"Node.js 22 with Docker-in-Docker for container workflows",id:"node-dind",name:"Node.js + Docker-in-Docker"},{config:{customizations:{vscode:{extensions:["dbaeumer.vscode-eslint","esbenp.prettier-vscode","ms-azuretools.vscode-docker"]}},dockerComposeFile:"docker-compose.yml",features:{"ghcr.io/devcontainers/features/docker-in-docker:2":{}},forwardPorts:[3e3,5432,6379],name:"Full Stack",postCreateCommand:"npm install",service:"app",workspaceFolder:"/workspaces/${localWorkspaceFolderBasename}"},description:"Node.js + PostgreSQL + Redis + Docker via Compose",id:"fullstack",name:"Full Stack"},{config:{customizations:{vscode:{extensions:["ms-python.python","ms-python.vscode-pylance"],settings:{"editor.formatOnSave":!0,"python.defaultInterpreterPath":"/usr/local/bin/python"}}},features:{"ghcr.io/devcontainers/features/git:1":{},"ghcr.io/devcontainers/features/github-cli:1":{},"ghcr.io/devcontainers/features/python:1":{version:"3.12"}},forwardPorts:[8e3],image:"mcr.microsoft.com/devcontainers/python:3.12",name:"Python",postCreateCommand:"pip install -r requirements.txt || true"},description:"Python 3.12 with pip and venv",id:"python",name:"Python"},{config:{customizations:{vscode:{extensions:["golang.go"],settings:{"editor.formatOnSave":!0,"go.toolsManagement.autoUpdate":!0}}},features:{"ghcr.io/devcontainers/features/git:1":{},"ghcr.io/devcontainers/features/go:1":{version:"1.22"}},forwardPorts:[8080],image:"mcr.microsoft.com/devcontainers/go:1.22",name:"Go",postCreateCommand:"go mod download || true"},description:"Go 1.22 development environment",id:"go",name:"Go"},{config:{customizations:{vscode:{extensions:["rust-lang.rust-analyzer","tamasfe.even-better-toml"],settings:{"editor.formatOnSave":!0}}},features:{"ghcr.io/devcontainers/features/git:1":{},"ghcr.io/devcontainers/features/rust:1":{}},image:"mcr.microsoft.com/devcontainers/rust:latest",name:"Rust",postCreateCommand:"cargo build || true"},description:"Rust development with cargo and rust-analyzer",id:"rust",name:"Rust"},{config:{customizations:{vscode:{extensions:["vscjava.vscode-java-pack","vscjava.vscode-maven"]}},features:{"ghcr.io/devcontainers/features/git:1":{},"ghcr.io/devcontainers/features/java:1":{version:"17"}},forwardPorts:[8080],image:"mcr.microsoft.com/devcontainers/java:17",name:"Java",postCreateCommand:"./mvnw install || ./gradlew build || true"},description:"Java 17 with Maven/Gradle support",id:"java",name:"Java"},{config:{customizations:{vscode:{extensions:["ms-azuretools.vscode-docker","ms-kubernetes-tools.vscode-kubernetes-tools","hashicorp.terraform"]}},features:{"ghcr.io/devcontainers/features/aws-cli:1":{},"ghcr.io/devcontainers/features/azure-cli:1":{},"ghcr.io/devcontainers/features/docker-in-docker:2":{},"ghcr.io/devcontainers/features/kubectl-helm-minikube:1":{},"ghcr.io/devcontainers/features/terraform:1":{}},image:"mcr.microsoft.com/devcontainers/base:ubuntu",name:"DevOps"},description:"Docker, Kubernetes, Terraform, AWS & Azure CLIs",id:"devops",name:"DevOps"},{config:{features:{"ghcr.io/devcontainers/features/common-utils:2":{}},image:"mcr.microsoft.com/devcontainers/base:ubuntu",name:"Minimal",remoteUser:"vscode"},description:"Bare Ubuntu with common utilities",id:"minimal",name:"Minimal"},{config:{image:"mcr.microsoft.com/devcontainers/base:ubuntu",name:"Custom"},description:"Minimal Ubuntu base - configure from scratch",id:"custom",name:"Custom (Blank)"}];var ft=Object.defineProperty,Fe=y((n,e)=>ft(n,"name",{value:e,configurable:!0}),"s$5");const pt=Fe(n=>{const e=de(n,".devcontainer","devcontainer.json");if(!dt(e))return null;const s=ut(e),a=mt(s),l=a!==s;let o;try{o=JSON.parse(a)}catch(d){const g=d instanceof Error?d.message:String(d);throw new Error(`Failed to parse ${e}: ${g}`)}return{config:o,hadComments:l}},"readDevcontainerJson"),vt=Fe((n,e,s)=>{const a=s?gt(s):de(n,".devcontainer"),l=s??de(a,"devcontainer.json");ht(a),at(l,`${JSON.stringify(e,null,2)}
2
+ `,"utf8")},"writeDevcontainerJson");var yt=Object.defineProperty,bt=y((n,e)=>yt(n,"name",{value:e,configurable:!0}),"s$4");const wt={bun:[{source:"${localWorkspaceFolderBasename}-node_modules",target:"${containerWorkspaceFolder}/node_modules",type:"volume"},{source:"${localWorkspaceFolderBasename}-bun-cache",target:"/home/node/.bun/install/cache",type:"volume"}],npm:[{source:"${localWorkspaceFolderBasename}-node_modules",target:"${containerWorkspaceFolder}/node_modules",type:"volume"},{source:"${localWorkspaceFolderBasename}-npm-cache",target:"/home/node/.npm",type:"volume"}],pnpm:[{source:"${localWorkspaceFolderBasename}-node_modules",target:"${containerWorkspaceFolder}/node_modules",type:"volume"},{source:"${localWorkspaceFolderBasename}-pnpm-store",target:"/home/node/.local/share/pnpm/store",type:"volume"}],yarn:[{source:"${localWorkspaceFolderBasename}-node_modules",target:"${containerWorkspaceFolder}/node_modules",type:"volume"},{source:"${localWorkspaceFolderBasename}-yarn-cache",target:"/home/node/.yarn/cache",type:"volume"}]},xt=[{featureMatch:"docker-in-docker",mounts:[]},{featureMatch:"docker-outside-of-docker",mounts:[{source:"/var/run/docker.sock",target:"/var/run/docker.sock",type:"bind"}]},{featureMatch:"/features/git:",mounts:[{source:"${localWorkspaceFolderBasename}-git-config",target:"/home/node/.gitconfig",type:"volume"}]}],xe=bt((n,e,s)=>{const a=[],l=new Set(s.map(d=>typeof d=="string"?d:d.target));if(n)for(const d of wt[n])l.has(d.target)||a.push(d);const o=Object.keys(e);for(const{featureMatch:d,mounts:g}of xt)if(o.some(f=>f.includes(d)))for(const f of g)l.has(f.target)||a.push(f);return a},"getSuggestedMounts"),A=["general","features","ports","lifecycle","extensions","environment","mounts","compose"];var Ct=Object.defineProperty,ee=y((n,e)=>Ct(n,"name",{value:e,configurable:!0}),"c$1");const J=ee(n=>structuredClone(n),"deepClone");class kt{static{y(this,"DevcontainerStore")}static{ee(this,"DevcontainerStore")}#o=new Set;#e;constructor(e,s,a=null){const l=e===null,o=e??{name:""},d=J(o);this.#e={config:d,detectedPm:a,extensionSearch:"",featureSearch:"",fieldEditing:!1,fieldIndex:0,hadComments:s,isDirty:!1,mode:l?"create":"edit",originalConfig:l?null:J(o),section:"general",showTemplateSelector:l,suggestedMounts:xe(a,d.features??{},d.mounts??[]),templateIndex:0}}getSnapshot=ee(()=>this.#e,"getSnapshot");subscribe=ee(e=>(this.#o.add(e),()=>{this.#o.delete(e)}),"subscribe");setSection(e){e!==this.#e.section&&this.#t({...this.#e,fieldEditing:!1,fieldIndex:0,section:e})}nextSection(){const e=(A.indexOf(this.#e.section)+1)%A.length;this.setSection(A[e])}previousSection(){const e=(A.indexOf(this.#e.section)-1+A.length)%A.length;this.setSection(A[e])}setFieldIndex(e){e!==this.#e.fieldIndex&&this.#t({...this.#e,fieldIndex:Math.max(0,e)})}setFieldEditing(e){e!==this.#e.fieldEditing&&this.#t({...this.#e,fieldEditing:e})}setTemplateIndex(e){const s=Math.max(0,Math.min(e,z.length-1));s!==this.#e.templateIndex&&this.#t({...this.#e,templateIndex:s})}applyTemplate(e){const s=z.find(a=>a.id===e);s&&this.#t(this.#r({...this.#e,config:J(s.config),isDirty:!0,showTemplateSelector:!1}))}dismissTemplateSelector(){this.#t({...this.#e,showTemplateSelector:!1})}updateConfig(e){this.#t({...this.#e,config:{...this.#e.config,...e},isDirty:!0})}toggleFeature(e){const s={...this.#e.config.features};s[e]===void 0?s[e]={}:delete s[e],this.#t(this.#r({...this.#e,config:{...this.#e.config,features:s},isDirty:!0}))}setFeatureSearch(e){this.#t({...this.#e,featureSearch:e,fieldIndex:0})}addPort(e){const s=this.#e.config.forwardPorts??[];if(s.includes(e))return;const a=[...s,e];this.#t({...this.#e,config:{...this.#e.config,forwardPorts:a},isDirty:!0})}removePort(e){const s=[...this.#e.config.forwardPorts??[]];s.splice(e,1),this.#t({...this.#e,config:{...this.#e.config,forwardPorts:s.length>0?s:void 0},isDirty:!0})}toggleExtension(e){const s={...this.#e.config.customizations},a={...s.vscode},l=[...a.extensions??[]],o=l.indexOf(e);o===-1?l.push(e):l.splice(o,1),a.extensions=l.length>0?l:void 0,s.vscode=a.extensions||a.settings?a:void 0,this.#t({...this.#e,config:{...this.#e.config,customizations:s.vscode||s.jetbrains?s:void 0},isDirty:!0})}setExtensionSearch(e){this.#t({...this.#e,extensionSearch:e,fieldIndex:0})}addEnvVar(e,s,a){const l=e==="container"?"containerEnv":"remoteEnv",o={...this.#e.config[l],[s]:a};this.#t({...this.#e,config:{...this.#e.config,[l]:o},isDirty:!0})}removeEnvVar(e,s){const a=e==="container"?"containerEnv":"remoteEnv",l={...this.#e.config[a]};delete l[s],this.#t({...this.#e,config:{...this.#e.config,[a]:Object.keys(l).length>0?l:void 0},isDirty:!0})}addMount(e){const s=[...this.#e.config.mounts??[],e];this.#t(this.#r({...this.#e,config:{...this.#e.config,mounts:s},isDirty:!0}))}removeMount(e){const s=[...this.#e.config.mounts??[]];s.splice(e,1),this.#t(this.#r({...this.#e,config:{...this.#e.config,mounts:s.length>0?s:void 0},isDirty:!0}))}applySuggestedMounts(){if(this.#e.suggestedMounts.length===0)return;const e=[...this.#e.config.mounts??[],...this.#e.suggestedMounts];this.#t(this.#r({...this.#e,config:{...this.#e.config,mounts:e},isDirty:!0}))}setLifecycleCommand(e,s){this.#t({...this.#e,config:{...this.#e.config,[e]:s||void 0},isDirty:!0})}markClean(){this.#t({...this.#e,isDirty:!1,originalConfig:J(this.#e.config)})}getJsonPreview(){return JSON.stringify(this.#n(),null,2)}cleanConfig(){return this.#n()}#n(){const e=J(this.#e.config);for(const[s,a]of Object.entries(e))(a===""||a===void 0)&&delete e[s];return e.build&&(e.build.dockerfile===""&&delete e.build.dockerfile,e.build.context===""&&delete e.build.context,e.build.args&&Object.keys(e.build.args).length===0&&delete e.build.args,Object.keys(e.build).length===0&&delete e.build),e.forwardPorts?.length===0&&delete e.forwardPorts,e.mounts?.length===0&&delete e.mounts,e.runServices?.length===0&&delete e.runServices,e.capAdd?.length===0&&delete e.capAdd,e.securityOpt?.length===0&&delete e.securityOpt,e.features&&Object.keys(e.features).length===0&&delete e.features,e.customizations?.vscode?.extensions?.length===0&&delete e.customizations.vscode.extensions,e.customizations?.vscode&&Object.keys(e.customizations.vscode).length===0&&delete e.customizations.vscode,e.customizations&&Object.keys(e.customizations).length===0&&delete e.customizations,e.containerEnv&&Object.keys(e.containerEnv).length===0&&delete e.containerEnv,e.remoteEnv&&Object.keys(e.remoteEnv).length===0&&delete e.remoteEnv,e}#r(e){return{...e,suggestedMounts:xe(e.detectedPm,e.config.features??{},e.config.mounts??[])}}#t(e){this.#e=e;for(const s of this.#o)try{s()}catch{}}}const Ce=[{category:"linting",description:"Integrates ESLint into the editor",id:"dbaeumer.vscode-eslint",name:"ESLint"},{category:"linting",description:"Stylelint CSS/SCSS linting",id:"stylelint.vscode-stylelint",name:"Stylelint"},{category:"formatting",description:"Opinionated code formatter",id:"esbenp.prettier-vscode",name:"Prettier"},{category:"formatting",description:"EditorConfig file support",id:"editorconfig.editorconfig",name:"EditorConfig"},{category:"formatting",description:"Fast Rust-based formatter and linter",id:"biomejs.biome",name:"Biome"},{category:"language",description:"Rich TypeScript and JavaScript support",id:"ms-vscode.vscode-typescript-next",name:"TypeScript Nightly"},{category:"language",description:"Tailwind CSS IntelliSense",id:"bradlc.vscode-tailwindcss",name:"Tailwind CSS"},{category:"language",description:"YAML language support with schemas",id:"redhat.vscode-yaml",name:"YAML"},{category:"language",description:"TOML language support",id:"tamasfe.even-better-toml",name:"TOML"},{category:"language",description:"Dockerfile and Docker Compose support",id:"ms-azuretools.vscode-docker",name:"Docker"},{category:"language",description:"Python language support with Pylance",id:"ms-python.python",name:"Python"},{category:"language",description:"Go language support",id:"golang.go",name:"Go"},{category:"language",description:"Rust language support via rust-analyzer",id:"rust-lang.rust-analyzer",name:"rust-analyzer"},{category:"git",description:"Git supercharged: blame, history, stash, etc.",id:"eamodio.gitlens",name:"GitLens"},{category:"git",description:"GitHub Pull Requests and Issues",id:"github.vscode-pull-request-github",name:"GitHub PR"},{category:"testing",description:"Vitest test explorer integration",id:"vitest.explorer",name:"Vitest Explorer"},{category:"testing",description:"Jest test runner and assertions",id:"orta.vscode-jest",name:"Jest"},{category:"debugging",description:"REST client for testing APIs",id:"humao.rest-client",name:"REST Client"},{category:"debugging",description:"Error Lens: inline error highlighting",id:"usernamehw.errorlens",name:"Error Lens"},{category:"other",description:"Intelligent code completion with AI",id:"github.copilot",name:"GitHub Copilot"},{category:"other",description:"Path autocompletion for imports",id:"christian-kohler.path-intellisense",name:"Path Intellisense"},{category:"other",description:"Import cost display in editor",id:"wix.vscode-import-cost",name:"Import Cost"},{category:"other",description:"Todo Tree: highlight and list TODOs",id:"gruntfuggly.todo-tree",name:"Todo Tree"}],ke=[{category:"language",description:"Node.js runtime via nvm with optional pnpm/yarn",id:"ghcr.io/devcontainers/features/node:1",name:"Node.js"},{category:"language",description:"Python runtime with pip and optional tools",id:"ghcr.io/devcontainers/features/python:1",name:"Python"},{category:"language",description:"Go compiler and tools",id:"ghcr.io/devcontainers/features/go:1",name:"Go"},{category:"language",description:"Rust toolchain via rustup",id:"ghcr.io/devcontainers/features/rust:1",name:"Rust"},{category:"language",description:"Java runtime and JDK via SDKMAN",id:"ghcr.io/devcontainers/features/java:1",name:"Java"},{category:"language",description:".NET SDK and runtime",id:"ghcr.io/devcontainers/features/dotnet:2",name:".NET"},{category:"tool",description:"Common utilities: zsh, Oh My Zsh, git, curl, etc.",id:"ghcr.io/devcontainers/features/common-utils:2",name:"Common Utilities"},{category:"tool",description:"Git version control",id:"ghcr.io/devcontainers/features/git:1",name:"Git"},{category:"tool",description:"Git Large File Storage support",id:"ghcr.io/devcontainers/features/git-lfs:1",name:"Git LFS"},{category:"tool",description:"GitHub CLI for repository management",id:"ghcr.io/devcontainers/features/github-cli:1",name:"GitHub CLI"},{category:"tool",description:"Run Docker containers inside the dev container",id:"ghcr.io/devcontainers/features/docker-in-docker:2",name:"Docker-in-Docker"},{category:"tool",description:"Access host Docker daemon from inside the container",id:"ghcr.io/devcontainers/features/docker-outside-of-docker:1",name:"Docker-from-Docker"},{category:"tool",description:"kubectl, Helm, and Minikube for Kubernetes",id:"ghcr.io/devcontainers/features/kubectl-helm-minikube:1",name:"Kubernetes Tools"},{category:"tool",description:"Infrastructure as code with Terraform",id:"ghcr.io/devcontainers/features/terraform:1",name:"Terraform"},{category:"tool",description:"Nix package manager",id:"ghcr.io/devcontainers/features/nix:1",name:"Nix"},{category:"tool",description:"SSH server for remote connections to the container",id:"ghcr.io/devcontainers/features/sshd:1",name:"SSH Server"},{category:"cloud",description:"Amazon Web Services CLI v2",id:"ghcr.io/devcontainers/features/aws-cli:1",name:"AWS CLI"},{category:"cloud",description:"Microsoft Azure CLI",id:"ghcr.io/devcontainers/features/azure-cli:1",name:"Azure CLI"},{category:"cloud",description:"Google Cloud Platform CLI",id:"ghcr.io/devcontainers/features/gcloud:1",name:"Google Cloud CLI"},{category:"database",description:"PostgreSQL client tools",id:"ghcr.io/devcontainers-extra/features/postgres-client:1",name:"PostgreSQL Client"},{category:"database",description:"Redis client tools",id:"ghcr.io/devcontainers-extra/features/redis-client:1",name:"Redis Client"}];var St=Object.defineProperty,Ae=y((n,e)=>St(n,"name",{value:e,configurable:!0}),"r$1");const me=Ae(n=>{if(!n)return ke;const e=n.toLowerCase();return ke.filter(s=>s.name.toLowerCase().includes(e)||s.id.toLowerCase().includes(e)||s.description.toLowerCase().includes(e))},"filterFeatures"),ge=Ae(n=>{if(!n)return Ce;const e=n.toLowerCase();return Ce.filter(s=>s.name.toLowerCase().includes(e)||s.id.toLowerCase().includes(e)||s.description.toLowerCase().includes(e))},"filterExtensions");var Et=Object.defineProperty,It=y((n,e)=>Et(n,"name",{value:e,configurable:!0}),"l$1");const Le=["dockerComposeFile","service"],Tt={dockerComposeFile:"Compose File",service:"Service"},Se={dockerComposeFile:"docker-compose.yml",service:"app"},Dt={dockerComposeFile:"Path to Docker Compose file (relative to .devcontainer/)",service:"Which service in the compose file to connect the IDE to"},Pt=It(({config:n,fieldEditing:e,fieldIndex:s,onUpdate:a})=>{const l=!!n.dockerComposeFile,o=!!(n.image||n.build);return i(c,{flexDirection:"column",paddingX:1,children:[t(c,{marginBottom:1,children:t(r,{bold:!0,color:"cyan",children:"Docker Compose Integration"})}),o&&l&&t(c,{marginBottom:1,children:t(r,{color:"yellow",children:"Note: When using Docker Compose, the image/build settings in General are ignored."})}),Le.map((d,g)=>{const f=g===s,p=n[d]??"",x=Array.isArray(n[d])?n[d].join(", "):p;return i(c,{flexDirection:"column",marginBottom:1,children:[i(c,{children:[t(c,{width:20,children:i(r,{bold:f,color:f?"cyan":"white",children:[f?"❯ ":" ",Tt[d],":"]})}),t(c,{flexGrow:1,children:f&&e?t(he,{defaultValue:x,onChange:y(v=>{a({[d]:v||void 0})},"onChange"),placeholder:Se[d]}):t(r,{color:x?"white":"gray",children:x||Se[d]})})]}),t(c,{paddingLeft:4,children:t(r,{dimColor:!0,children:Dt[d]})})]},d)}),t(c,{marginTop:1,children:i(r,{dimColor:!0,children:[t(r,{bold:!0,color:"white",children:"Enter"})," ","edit field"," ",t(r,{bold:!0,color:"white",children:"↑↓"})," ","navigate"," ",t(r,{bold:!0,color:"white",children:"Esc"})," ","stop editing"]})})]})},"DockerComposeSection"),jt=Le.length;var Ot=Object.defineProperty,Me=y((n,e)=>Ot(n,"name",{value:e,configurable:!0}),"h$3");const Ft=Me(({config:n,fieldIndex:e})=>{const s=n.containerEnv??{},a=n.remoteEnv??{},l=Object.keys(s),o=Object.keys(a),d=l.length,g=l.length+1,f=g+o.length,p=e<=d,x=e>d;return i(c,{flexDirection:"column",paddingX:1,children:[i(c,{borderColor:p?"cyan":"gray",borderStyle:"single",flexDirection:"column",paddingX:1,paddingY:0,children:[i(c,{flexShrink:0,marginBottom:l.length>0?1:0,children:[t(r,{bold:!0,color:p?"cyan":"white",children:"containerEnv"}),t(r,{dimColor:!0,children:" — baked into the container image"})]}),l.map((v,w)=>{const k=w===e;return t(c,{flexShrink:0,children:i(r,{color:k?"cyan":void 0,inverse:k,wrap:"truncate",children:[k?" ❯ ":" ",t(r,{bold:!0,children:v}),t(r,{dimColor:!0,children:" = "}),t(r,{children:s[v]})]})},v)}),t(c,{flexShrink:0,marginTop:l.length>0?1:0,children:i(r,{color:e===d?"cyan":"gray",inverse:e===d,children:[" ","+ Add variable..."]})})]}),i(c,{borderColor:x?"cyan":"gray",borderStyle:"single",flexDirection:"column",marginTop:1,paddingX:1,paddingY:0,children:[i(c,{flexShrink:0,marginBottom:o.length>0?1:0,children:[t(r,{bold:!0,color:x?"cyan":"white",children:"remoteEnv"}),t(r,{dimColor:!0,children:" — set at runtime by the IDE"})]}),o.map((v,w)=>{const k=g+w===e;return t(c,{flexShrink:0,children:i(r,{color:k?"cyan":void 0,inverse:k,wrap:"truncate",children:[k?" ❯ ":" ",t(r,{bold:!0,children:v}),t(r,{dimColor:!0,children:" = "}),t(r,{children:a[v]})]})},v)}),t(c,{flexShrink:0,marginTop:o.length>0?1:0,children:i(r,{color:e===f?"cyan":"gray",inverse:e===f,children:[" ","+ Add variable..."]})})]}),t(c,{flexShrink:0,marginTop:1,children:i(r,{dimColor:!0,wrap:"truncate",children:[t(r,{bold:!0,color:"white",children:"a"}),"/",t(r,{bold:!0,color:"white",children:"Enter"})," ","add on + row"," ",t(r,{bold:!0,color:"white",children:"d"})," ","remove"," ",t(r,{bold:!0,color:"white",children:"↑↓"})," ","navigate"]})})]})},"EnvironmentSection"),At=Me(n=>{const e=Object.keys(n.containerEnv??{}).length,s=Object.keys(n.remoteEnv??{}).length;return e+1+s+1},"getEnvFieldCount");var Lt=Object.defineProperty,Mt=y((n,e)=>Lt(n,"name",{value:e,configurable:!0}),"h$2");const Bt=Mt(({config:n,fieldIndex:e,scrollOffset:s,searchText:a,viewportHeight:l})=>{const o=q(()=>new Set(n.customizations?.vscode?.extensions),[n.customizations?.vscode?.extensions]),d=q(()=>ge(a),[a]),g=d.length,f=g>l&&l>0;return i(c,{flexDirection:"column",flexGrow:1,children:[i(c,{flexShrink:0,gap:1,paddingX:1,children:[i(r,{bold:!0,color:"cyan",children:[o.size," ","selected"]}),a&&i(r,{dimColor:!0,children:["— filter:"," ",t(r,{color:"yellow",children:a})," ","(",d.length," ","results)"]})]}),i(c,{flexDirection:"row",flexGrow:1,overflow:"hidden",children:[t(c,{flexDirection:"column",flexGrow:1,overflow:"hidden",paddingLeft:1,children:t(c,{flexDirection:"column",marginTop:-s,children:d.map((p,x)=>{const v=x===e,w=o.has(p.id);return i(c,{flexShrink:0,height:1,children:[t(r,{children:v?">":" "}),i(r,{color:w?"white":"gray",children:[" ",w?"☑":"☐"," "]}),t(c,{flexGrow:1,children:i(r,{bold:v,inverse:v,wrap:"truncate",children:[p.name,i(r,{dimColor:!0,children:[" ","-",p.id]})]})})]},p.id)})})}),f&&t(c,{flexShrink:0,marginLeft:1,marginRight:1,children:t(Oe,{contentHeight:g,placement:"inset",scrollOffset:s,style:"block",viewportHeight:l})})]}),d.length===0&&t(c,{paddingX:1,children:t(r,{dimColor:!0,children:"No extensions match the search."})})]})},"ExtensionsSection");var Nt=Object.defineProperty,zt=y((n,e)=>Nt(n,"name",{value:e,configurable:!0}),"p$1");const Gt=zt(({config:n,fieldIndex:e,scrollOffset:s,searchText:a,viewportHeight:l})=>{const o=q(()=>new Set(Object.keys(n.features??{})),[n.features]),d=q(()=>me(a),[a]),g=d.length,f=g>l&&l>0;return i(c,{flexDirection:"column",flexGrow:1,children:[i(c,{flexShrink:0,gap:1,paddingX:1,children:[i(r,{bold:!0,color:"cyan",children:[o.size," ","selected"]}),a&&i(r,{dimColor:!0,children:["— filter:"," ",t(r,{color:"yellow",children:a})," ","(",d.length," ","results)"]})]}),i(c,{flexDirection:"row",flexGrow:1,overflow:"hidden",children:[t(c,{flexDirection:"column",flexGrow:1,overflow:"hidden",paddingLeft:1,children:t(c,{flexDirection:"column",marginTop:-s,children:d.map((p,x)=>{const v=x===e,w=o.has(p.id);return i(c,{flexShrink:0,height:1,children:[t(r,{children:v?">":" "}),i(r,{color:w?"white":"gray",children:[" ",w?"☑":"☐"," "]}),t(c,{flexGrow:1,children:i(r,{bold:v,inverse:v,wrap:"truncate",children:[p.name,i(r,{dimColor:!0,children:[" ","-",p.description]})]})})]},p.id)})})}),f&&t(c,{flexShrink:0,marginLeft:1,marginRight:1,children:t(Oe,{contentHeight:g,placement:"inset",scrollOffset:s,style:"block",viewportHeight:l})})]}),d.length===0&&t(c,{paddingX:1,children:t(r,{dimColor:!0,children:"No features match the search."})})]})},"FeaturesSection");var Rt=Object.defineProperty,_t=y((n,e)=>Rt(n,"name",{value:e,configurable:!0}),"u$1");const ue=["name","image","workspaceFolder","workspaceMount","remoteUser","containerUser","shutdownAction"],$t={containerUser:"Container User",image:"Image",name:"Name",remoteUser:"Remote User",shutdownAction:"Shutdown Action",workspaceFolder:"Workspace Folder",workspaceMount:"Workspace Mount"},Ee={containerUser:"root",image:"mcr.microsoft.com/devcontainers/javascript-node:22",name:"My Dev Container",remoteUser:"node",shutdownAction:"none | stopContainer",workspaceFolder:"/workspaces/${localWorkspaceFolderBasename}",workspaceMount:"source=${localWorkspaceFolder},target=...,type=bind"},te=["privileged","overrideCommand"],Ut={overrideCommand:"Override Command",privileged:"Privileged"},Wt=ue.length+te.length,Xt=_t(({config:n,fieldEditing:e,fieldIndex:s,onUpdate:a})=>i(c,{flexDirection:"column",paddingX:1,children:[t(c,{marginBottom:1,children:t(r,{bold:!0,color:"cyan",children:"General Configuration"})}),ue.map((l,o)=>{const d=o===s,g=n[l]??"";return i(c,{marginBottom:1,children:[t(c,{width:20,children:i(r,{bold:d,color:d?"cyan":"white",children:[d?"❯ ":" ",$t[l],":"]})}),t(c,{flexGrow:1,children:d&&e?t(he,{defaultValue:g,onChange:y(f=>{a({[l]:f})},"onChange"),placeholder:Ee[l]}):t(r,{color:g?"white":"gray",children:g||Ee[l]})})]},l)}),te.map((l,o)=>{const d=ue.length+o===s,g=n[l]??!1;return i(c,{marginBottom:o<te.length-1?1:0,children:[t(c,{width:20,children:i(r,{bold:d,color:d?"cyan":"white",children:[d?"❯ ":" ",Ut[l],":"]})}),t(c,{flexGrow:1,children:i(r,{color:g?"green":"gray",children:[g?"yes":"no",d&&t(r,{dimColor:!0,children:" (Space to toggle)"})]})})]},l)}),t(c,{marginTop:1,children:i(r,{dimColor:!0,children:[t(r,{bold:!0,color:"white",children:"Enter"})," ","edit field"," ",t(r,{bold:!0,color:"white",children:"Space"})," ","toggle"," ",t(r,{bold:!0,color:"white",children:"↑↓"})," ","navigate"," ",t(r,{bold:!0,color:"white",children:"Esc"})," ","stop editing"]})})]}),"GeneralSection"),Be=Wt,ae=te;var Vt=Object.defineProperty,Ht=y((n,e)=>Vt(n,"name",{value:e,configurable:!0}),"s$2");const Ne=["postCreateCommand","postStartCommand","postAttachCommand","onCreateCommand"],Jt={onCreateCommand:"On Create",postAttachCommand:"Post Attach",postCreateCommand:"Post Create",postStartCommand:"Post Start"},qt={onCreateCommand:"Runs once when the container is first created",postAttachCommand:"Runs each time the IDE attaches",postCreateCommand:"Runs after the container is created and workspace mounted",postStartCommand:"Runs each time the container starts"},Yt=Ht(({config:n,fieldEditing:e,fieldIndex:s,onSetCommand:a})=>i(c,{flexDirection:"column",paddingX:1,children:[t(c,{marginBottom:1,children:t(r,{bold:!0,color:"cyan",children:"Lifecycle Commands"})}),Ne.map((l,o)=>{const d=o===s,g=n[l],f=Array.isArray(g)?g.join(" && "):g??"";return i(c,{flexDirection:"column",marginBottom:1,children:[t(c,{children:i(r,{bold:d,color:d?"cyan":"white",children:[d?"❯ ":" ",Jt[l]]})}),t(c,{paddingLeft:4,children:t(r,{dimColor:!0,children:qt[l]})}),t(c,{paddingLeft:4,children:d&&e?t(he,{defaultValue:f,onChange:y(p=>{a(l,p)},"onChange"),placeholder:"e.g. npm install"}):t(r,{color:f?"green":"gray",children:f||"(not set)"})})]},l)}),t(c,{marginTop:1,children:i(r,{dimColor:!0,children:[t(r,{bold:!0,color:"white",children:"Enter"})," ","edit command"," ",t(r,{bold:!0,color:"white",children:"↑↓"})," ","navigate"," ",t(r,{bold:!0,color:"white",children:"Esc"})," ","stop editing"]})})]}),"LifecycleSection"),Kt=Ne.length;var Qt=Object.defineProperty,ze=y((n,e)=>Qt(n,"name",{value:e,configurable:!0}),"s$1");const Ie=ze(n=>typeof n=="string"?n:`[${n.type}] ${n.source} → ${n.target}`,"formatMount"),Zt=ze(({addingMount:n,config:e,detectedPm:s,fieldIndex:a,mountPhase:l,mountSource:o,mountTarget:d,mountType:g,suggestedMounts:f})=>{const p=e.mounts??[];return i(c,{flexDirection:"column",paddingX:1,children:[i(c,{flexShrink:0,gap:1,paddingX:1,children:[i(r,{bold:!0,color:"cyan",children:[p.length," ","mounts"]}),s&&i(r,{dimColor:!0,children:["— detected:"," ",t(r,{color:"white",children:s})]})]}),f.length>0&&!n&&i(c,{borderColor:"yellow",borderStyle:"single",flexDirection:"column",marginBottom:1,marginTop:1,paddingX:1,children:[i(c,{flexShrink:0,children:[t(r,{bold:!0,color:"yellow",children:"Suggested mounts"}),i(r,{dimColor:!0,children:[" ","— press"," ",t(r,{bold:!0,color:"white",children:"A"})," ","to add all"]})]}),f.map((x,v)=>t(c,{flexShrink:0,children:i(r,{dimColor:!0,wrap:"truncate",children:[" + ",Ie(x)]})},`suggestion-${String(v)}`))]}),p.length>0&&t(c,{flexDirection:"column",marginBottom:1,children:p.map((x,v)=>{const w=v===a;return i(c,{flexShrink:0,height:1,children:[t(r,{children:w?">":" "}),t(c,{flexGrow:1,children:i(r,{bold:w,inverse:w,wrap:"truncate",children:[" ",Ie(x)]})})]},`mount-${String(v)}`)})}),!n&&t(c,{flexShrink:0,children:i(r,{color:a===p.length?"cyan":"gray",inverse:a===p.length,children:[" ","+ Add mount..."]})}),n&&i(c,{borderColor:"cyan",borderStyle:"single",flexDirection:"column",marginTop:1,paddingX:1,children:[t(c,{flexShrink:0,marginBottom:1,children:t(r,{bold:!0,color:"cyan",children:"New Mount"})}),i(c,{flexShrink:0,children:[t(c,{width:12,children:i(r,{bold:l==="source",color:l==="source"?"cyan":"white",children:[l==="source"?"❯ ":" ","Source:"]})}),t(r,{color:o?"yellow":"gray",children:o||(l==="source"?"_":"(type source, Enter to continue)")})]}),i(c,{flexShrink:0,children:[t(c,{width:12,children:i(r,{bold:l==="target",color:l==="target"?"cyan":"white",children:[l==="target"?"❯ ":" ","Target:"]})}),t(r,{color:d?"yellow":"gray",children:d||(l==="target"?"_":"/container/path")})]}),i(c,{flexShrink:0,children:[t(c,{width:12,children:i(r,{bold:l==="type",color:l==="type"?"cyan":"white",children:[l==="type"?"❯ ":" ","Type:"]})}),l==="type"?i(r,{children:[t(r,{bold:g==="volume",color:g==="volume"?"cyan":"gray",children:"[1] volume"})," ",t(r,{bold:g==="bind",color:g==="bind"?"cyan":"gray",children:"[2] bind"})," ",t(r,{bold:g==="tmpfs",color:g==="tmpfs"?"cyan":"gray",children:"[3] tmpfs"})]}):t(r,{color:"gray",children:g})]}),t(c,{flexShrink:0,marginTop:1,children:t(r,{dimColor:!0,wrap:"truncate",children:l==="type"?"1/2/3 select type, Enter confirm, Esc cancel":"Type text, Enter next step, Esc cancel"})})]}),p.length===0&&!n&&f.length===0&&t(c,{marginTop:1,children:t(r,{dimColor:!0,children:"Tip: Use volume mounts for node_modules and caches to improve performance."})})]})},"MountsSection");var er=Object.defineProperty,tr=y((n,e)=>er(n,"name",{value:e,configurable:!0}),"m$1");const rr=tr(({addingPort:n,addPortValue:e,config:s,fieldIndex:a})=>{const l=s.forwardPorts??[],o=a===l.length;return i(c,{flexDirection:"column",paddingX:1,children:[i(c,{marginBottom:1,children:[t(r,{bold:!0,color:"cyan",children:"Forwarded Ports"}),i(r,{dimColor:!0,children:[" ","(",l.length," ","ports)"]})]}),l.map((d,g)=>{const f=g===a;return t(c,{children:i(r,{color:f?"cyan":void 0,inverse:f,children:[" ",String(d)]})},`port-${String(d)}`)}),t(c,{marginTop:l.length>0?1:0,children:i(r,{color:o?"cyan":"gray",inverse:o,children:[" ",o&&n?i(r,{children:["Enter port:"," ",t(r,{color:"yellow",children:e||"_"})]}):"+ Add port..."]})}),t(c,{marginTop:1,children:i(r,{dimColor:!0,children:[t(r,{bold:!0,color:"white",children:"Enter"})," ",o?"type port number, Enter to confirm":"select"," ",t(r,{bold:!0,color:"white",children:"d"})," ","remove selected"," ",t(r,{bold:!0,color:"white",children:"↑↓"})," ","navigate"]})})]})},"PortsSection");var or=Object.defineProperty,nr=y((n,e)=>or(n,"name",{value:e,configurable:!0}),"a");const ir=nr(({focused:n,hadComments:e,jsonPreview:s,mode:a,scrollRef:l})=>i(c,{borderColor:n?"cyan":"gray",borderStyle:"single",flexDirection:"column",flexGrow:1,children:[i(c,{flexShrink:0,paddingX:1,children:[t(r,{bold:!0,color:n?"cyan":"white",children:"Preview"}),i(r,{dimColor:!0,children:[" ","(",a==="create"?"new":"edit",")"]})]}),e&&a==="edit"&&t(c,{flexShrink:0,paddingX:1,children:t(r,{color:"yellow",children:"Comments will not be preserved."})}),t(Ye,{flexGrow:1,ref:l,scrollbar:!0,scrollbarColor:"gray",children:s.split(`
3
+ `).map((o,d)=>t(r,{color:"green",children:o},`line-${String(d)}`))})]}),"PreviewPanel");var cr=Object.defineProperty,sr=y((n,e)=>cr(n,"name",{value:e,configurable:!0}),"r");const lr=sr(n=>{const e=[],s=[],a=[];if(!n.image&&!n.build&&!n.dockerComposeFile&&e.push({field:"image",message:'One of "image", "build", or "dockerComposeFile" is required'}),n.build&&(n.image&&s.push({field:"image",message:'Both "image" and "build" are set; "build" takes precedence'}),n.build.dockerfile||e.push({field:"build.dockerfile",message:'"build" requires a "dockerfile" path'})),n.dockerComposeFile&&!n.service&&e.push({field:"service",message:'"service" is required when using "dockerComposeFile"'}),n.features!==void 0&&(typeof n.features!="object"||Array.isArray(n.features))&&e.push({field:"features",message:'"features" must be an object mapping feature IDs to options'}),n.forwardPorts)if(Array.isArray(n.forwardPorts))for(const[l,o]of n.forwardPorts.entries())typeof o=="number"&&(o<1||o>65535)&&e.push({field:"forwardPorts",message:`Invalid port ${String(o)} at index ${String(l)}`});else e.push({field:"forwardPorts",message:'"forwardPorts" must be an array'});return n.customizations?.vscode?.extensions&&!Array.isArray(n.customizations.vscode.extensions)&&e.push({field:"customizations.vscode.extensions",message:"Extensions must be an array"}),n.customizations?.vscode?.settings&&typeof n.customizations.vscode.settings!="object"&&e.push({field:"customizations.vscode.settings",message:"Settings must be an object"}),n.name||a.push({field:"name",message:"Consider adding a name for better identification"}),(!n.features||Object.keys(n.features).length===0)&&a.push({field:"features",message:"Consider adding features for common tools"}),(!n.customizations?.vscode?.extensions||n.customizations.vscode.extensions.length===0)&&a.push({field:"extensions",message:"Consider adding VS Code extensions for your stack"}),n.privileged&&s.push({field:"privileged",message:"Running in privileged mode is a security risk"}),{errors:e,suggestions:a,valid:e.length===0,warnings:s}},"validateConfig");var ar=Object.defineProperty,Ge=y((n,e)=>ar(n,"name",{value:e,configurable:!0}),"$");const Te=80,De=15,dr=120,Pe=[{description:"Container name, base image, workspace folder, and user",id:"general",label:"General"},{description:"Installable tools and runtimes (Node, Python, Docker, etc.)",id:"features",label:"Features"},{description:"Ports to forward from the container to your host",id:"ports",label:"Ports"},{description:"Commands to run at different stages of the container lifecycle",id:"lifecycle",label:"Lifecycle"},{description:"VS Code extensions to auto-install in the container",id:"extensions",label:"Extensions"},{description:"Environment variables for the container and IDE",id:"environment",label:"Env"},{description:"Volume and bind mounts for persistent data and caches",id:"mounts",label:"Mounts"},{description:"Docker Compose integration for multi-container setups",id:"compose",label:"Compose"}],ur=Ge((n,e,s,a)=>{switch(n){case"compose":return jt;case"environment":return At(e);case"extensions":return ge(a).length;case"features":return me(s).length;case"general":return Be;case"lifecycle":return Kt;case"mounts":return(e.mounts?.length??0)+1;case"ports":return(e.forwardPorts?.length??0)+1;default:return 0}},"getFieldCount"),hr=Ge(({onSave:n,store:e})=>{const{exit:s}=Ke(),{columns:a,rows:l}=Qe(),o=st(e.subscribe,e.getSnapshot),[d,g]=C(!1),[f,p]=C(!1),[x,v]=C(!1),[w,k]=C(null),[S,P]=C("editor"),[Y,fe]=C(0),[re,oe]=C(!1),[pe,G]=C(""),[R,_]=C(null),[$,j]=C(""),[ve,O]=C(""),[U,L]=C("key"),[ne,K]=C(!1),[ie,M]=C(""),[ce,B]=C(""),[ye,W]=C("volume"),[I,N]=C("source"),se=Z(null),F=Z(null),D=Z(null),Q=Z(!0);le(()=>(Q.current=!0,()=>{Q.current=!1,D.current&&clearTimeout(D.current)}),[]);const be=ur(o.section,o.config,o.featureSearch,o.extensionSearch),X=Math.max(1,l-9);le(()=>{o.section!=="features"&&o.section!=="extensions"||fe(h=>o.fieldIndex>=h+X?o.fieldIndex-X+1:o.fieldIndex<h?o.fieldIndex:h)},[o.fieldIndex,o.section,X]),le(()=>{fe(0)},[o.section,o.featureSearch,o.extensionSearch]);const Re=lt(()=>{const h=e.cleanConfig(),m=lr(h);if(!m.valid){const b=m.errors[0];k(b?`Error: ${b.message}`:"Validation failed"),D.current&&clearTimeout(D.current),D.current=setTimeout(()=>{Q.current&&k(null)},3e3);return}n(h),e.markClean();const u=m.warnings.length;k(u>0?`Saved! (${String(u)} warning${u>1?"s":""})`:"Saved!"),D.current&&clearTimeout(D.current),D.current=setTimeout(()=>{Q.current&&k(null)},2e3)},[n,e]);H((h,m)=>{if(m.downArrow||h==="j")e.setTemplateIndex(o.templateIndex+1);else if(m.upArrow||h==="k")e.setTemplateIndex(o.templateIndex-1);else if(m.return){const u=z[o.templateIndex];u&&e.applyTemplate(u.id)}else m.escape&&e.dismissTemplateSelector()},{isActive:o.showTemplateSelector}),H((h,m)=>{if(m.escape){oe(!1),G("");return}if(m.return){const u=Number.parseInt(pe,10);!Number.isNaN(u)&&u>0&&u<=65535&&e.addPort(u),oe(!1),G("");return}if(m.backspace){G(u=>u.slice(0,-1));return}h&&/^\d$/u.test(h)&&G(u=>u+h)},{isActive:re}),H((h,m)=>{if(m.escape){_(null),j(""),O(""),L("key");return}if(m.return){if(U==="key"&&$){L("value");return}if(U==="value"&&$){e.addEnvVar(R,$,ve),_(null),j(""),O(""),L("key");return}}if(m.backspace){U==="key"?j(u=>u.slice(0,-1)):O(u=>u.slice(0,-1));return}h&&!m.ctrl&&!m.meta&&(U==="key"?j(u=>u+h):O(u=>u+h))},{isActive:R!==null}),H((h,m)=>{if(m.escape){K(!1),M(""),B(""),N("source");return}if(m.return){if(I==="source"&&ie){N("target");return}if(I==="target"&&ce){N("type");return}if(I==="type"){e.addMount({source:ie,target:ce,type:ye}),K(!1),M(""),B(""),N("source");return}}if(I==="type"){switch(h){case"1":{W("volume");break}case"2":{W("bind");break}case"3":{W("tmpfs");break}}return}if(m.backspace){I==="source"?M(u=>u.slice(0,-1)):I==="target"&&B(u=>u.slice(0,-1));return}h&&!m.ctrl&&!m.meta&&(I==="source"?M(u=>u+h):I==="target"&&B(u=>u+h))},{isActive:ne}),H((h,m)=>{if(h==="c"&&m.ctrl){s();return}if(!f){if(d){m.escape||h==="?"?g(!1):m.downArrow||h==="j"?se.current?.scrollBy(1):m.upArrow||h==="k"?se.current?.scrollBy(-1):h==="q"&&(g(!1),p(!0));return}if(x){if(m.escape){v(!1),o.section==="features"?e.setFeatureSearch(""):e.setExtensionSearch("");return}if(m.return){v(!1);return}if(m.backspace){o.section==="features"?e.setFeatureSearch(o.featureSearch.slice(0,-1)):e.setExtensionSearch(o.extensionSearch.slice(0,-1));return}if(h&&!m.ctrl&&!m.meta){o.section==="features"?e.setFeatureSearch(o.featureSearch+h):e.setExtensionSearch(o.extensionSearch+h);return}return}if(o.fieldEditing){if(m.escape){e.setFieldEditing(!1);return}if(m.return){e.setFieldEditing(!1);return}return}if(h==="?"){g(!0);return}if(h==="q"){o.isDirty?p(!0):s();return}if(h==="s"){Re();return}if(m.tab){P(u=>u==="editor"?"preview":"editor");return}if(S==="preview"){if(m.downArrow||h==="j"){F.current?.scrollBy(1);return}if(m.upArrow||h==="k"){F.current?.scrollBy(-1);return}if(m.pageDown){F.current?.scrollBy(10);return}if(m.pageUp){F.current?.scrollBy(-10);return}if(m.home){F.current?.scrollToTop();return}if(m.end){F.current?.scrollToBottom();return}m.escape&&P("editor");return}if(m.downArrow||h==="j"){be>0&&e.setFieldIndex(Math.min(o.fieldIndex+1,be-1));return}if(m.upArrow||h==="k"){e.setFieldIndex(Math.max(o.fieldIndex-1,0));return}if(m.return){switch(o.section){case"compose":case"general":case"lifecycle":{e.setFieldEditing(!0);break}case"environment":{const u=Object.keys(o.config.containerEnv??{}).length,b=u,T=u+1+Object.keys(o.config.remoteEnv??{}).length;o.fieldIndex===b?(_("container"),j(""),O(""),L("key")):o.fieldIndex===T&&(_("remote"),j(""),O(""),L("key"));break}case"mounts":{const u=o.config.mounts??[];o.fieldIndex===u.length&&(K(!0),M(""),B(""),W("volume"),N("source"));break}case"ports":{const u=o.config.forwardPorts??[];o.fieldIndex===u.length&&(oe(!0),G(""));break}}return}if(h===" "){switch(o.section){case"extensions":{const u=ge(o.extensionSearch)[o.fieldIndex];u&&e.toggleExtension(u.id);break}case"features":{const u=me(o.featureSearch)[o.fieldIndex];u&&e.toggleFeature(u.id);break}case"general":{const u=Be-ae.length,b=o.fieldIndex-u;if(b>=0&&b<ae.length){const T=ae[b];e.updateConfig({[T]:!o.config[T]})}break}}return}if(h==="/"){(o.section==="features"||o.section==="extensions")&&v(!0);return}if(h==="A"&&o.section==="mounts"){e.applySuggestedMounts();return}if(h==="a"){if(o.section==="environment"){const u=Object.keys(o.config.containerEnv??{}).length,b=o.fieldIndex<=u?"container":"remote";_(b),j(""),O(""),L("key")}else o.section==="mounts"&&(K(!0),M(""),B(""),W("volume"),N("source"));return}if(h==="d")switch(o.section){case"environment":{const u=Object.keys(o.config.containerEnv??{}),b=Object.keys(o.config.remoteEnv??{});if(o.fieldIndex<u.length)e.removeEnvVar("container",u[o.fieldIndex]),u.length===1||o.fieldIndex>=u.length-1&&e.setFieldIndex(u.length-2);else{const T=o.fieldIndex-u.length-1;T>=0&&T<b.length&&(e.removeEnvVar("remote",b[T]),b.length===1||T>=b.length-1&&e.setFieldIndex(o.fieldIndex-1))}break}case"mounts":{const u=o.config.mounts??[];if(o.fieldIndex<u.length){e.removeMount(o.fieldIndex);const b=u.length-1;o.fieldIndex>=b&&b>0&&e.setFieldIndex(b-1)}break}case"ports":{const u=o.config.forwardPorts??[];if(o.fieldIndex<u.length){e.removePort(o.fieldIndex);const b=u.length-1;o.fieldIndex>=b&&b>0&&e.setFieldIndex(b-1)}break}}}},{isActive:!o.showTemplateSelector&&!re&&R===null&&!ne});const _e=q(()=>e.getJsonPreview(),[o.config]);if(a<Te||l<De)return t(c,{alignItems:"center",height:l,justifyContent:"center",width:a,children:i(r,{color:"yellow",children:["Terminal too small (",a,"x",l,"), need"," ",Te,"x",De]})});if(o.showTemplateSelector)return t(c,{alignItems:"center",flexDirection:"column",height:l,justifyContent:"center",width:a,children:i(c,{borderColor:"cyan",borderStyle:"round",flexDirection:"column",paddingX:2,paddingY:1,width:60,children:[t(c,{justifyContent:"center",marginBottom:1,children:t(r,{bold:!0,color:"cyan",children:"Select a Template"})}),z.map((h,m)=>{const u=m===o.templateIndex;return t(c,{children:i(r,{color:u?"cyan":void 0,inverse:u,children:[u?" ❯ ":" ",t(r,{bold:u,children:h.name}),i(r,{dimColor:!0,children:[" ","-",h.description]})]})},h.id)}),t(c,{justifyContent:"center",marginTop:1,children:i(r,{dimColor:!0,children:[t(r,{bold:!0,color:"white",children:"↑↓"})," ","navigate"," ",t(r,{bold:!0,color:"white",children:"Enter"})," ","select"," ",t(r,{bold:!0,color:"white",children:"Esc"})," ","blank"]})})]})});let E;switch(o.section){case"compose":{E=t(Pt,{config:o.config,fieldEditing:o.fieldEditing,fieldIndex:o.fieldIndex,onUpdate:y(h=>{e.updateConfig(h)},"onUpdate")});break}case"environment":{E=i(c,{flexDirection:"column",children:[t(Ft,{config:o.config,fieldIndex:o.fieldIndex}),R!==null&&t(c,{marginTop:1,paddingX:1,children:i(r,{color:"cyan",children:["Add"," ",R," ","env:"," ",U==="key"?i(r,{children:["key=",t(r,{color:"yellow",children:$||"_"})," ","(Enter to set value)"]}):i(r,{children:[$,"=",t(r,{color:"yellow",children:ve||"_"})," ","(Enter to confirm, Esc to cancel)"]})]})})]});break}case"extensions":{E=t(Bt,{config:o.config,fieldIndex:o.fieldIndex,scrollOffset:Y,searchText:o.extensionSearch,viewportHeight:X});break}case"features":{E=t(Gt,{config:o.config,fieldIndex:o.fieldIndex,scrollOffset:Y,searchText:o.featureSearch,viewportHeight:X});break}case"general":{E=t(Xt,{config:o.config,fieldEditing:o.fieldEditing,fieldIndex:o.fieldIndex,onUpdate:y(h=>{e.updateConfig(h)},"onUpdate")});break}case"lifecycle":{E=t(Yt,{config:o.config,fieldEditing:o.fieldEditing,fieldIndex:o.fieldIndex,onSetCommand:y((h,m)=>{e.setLifecycleCommand(h,m)},"onSetCommand")});break}case"mounts":{E=t(Zt,{addingMount:ne,config:o.config,detectedPm:o.detectedPm,fieldIndex:o.fieldIndex,mountPhase:I,mountSource:ie,mountTarget:ce,mountType:ye,suggestedMounts:o.suggestedMounts});break}case"ports":{E=t(rr,{addingPort:re,addPortValue:pe,config:o.config,fieldIndex:o.fieldIndex});break}default:E=t(r,{children:"Unknown section"})}const $e=i(c,{borderBottom:!1,borderColor:"gray",borderLeft:!1,borderRight:!1,borderStyle:"single",flexShrink:0,children:[i(c,{flexGrow:1,flexWrap:"wrap",gap:2,paddingX:1,children:[i(c,{gap:1,children:[t(r,{bold:!0,color:"white",children:"q"}),t(r,{dimColor:!0,children:"QUIT"})]}),i(c,{gap:1,children:[t(r,{bold:!0,color:"white",children:"?"}),t(r,{dimColor:!0,children:"HELP"})]}),i(c,{gap:1,children:[t(r,{bold:!0,color:"white",children:"↑↓"}),t(r,{dimColor:!0,children:"NAV"})]}),(o.section==="features"||o.section==="extensions")&&i(c,{gap:1,children:[t(r,{bold:!0,color:"white",children:"Space"}),t(r,{dimColor:!0,children:"CHECK"})]}),i(c,{gap:1,children:[t(r,{bold:!0,color:"white",children:"←→"}),t(r,{dimColor:!0,children:"TABS"})]}),i(c,{gap:1,children:[t(r,{bold:!0,color:"white",children:"Tab"}),t(r,{dimColor:!0,children:"PANEL"})]}),(o.section==="features"||o.section==="extensions")&&i(c,{gap:1,children:[t(r,{bold:!0,color:"white",children:"/"}),t(r,{dimColor:!0,children:"FILTER"})]}),i(c,{gap:1,children:[t(r,{bold:!0,color:"white",children:"s"}),t(r,{dimColor:!0,children:"SAVE"})]})]}),i(c,{paddingX:1,children:[w&&i(r,{color:w.startsWith("Error")?"red":"green",children:[w," "]}),o.isDirty&&t(r,{color:"yellow",children:"[modified]"}),!o.isDirty&&!w&&t(r,{dimColor:!0,children:"[saved]"})]})]}),Ue=i(Ze,{footer:i(r,{dimColor:!0,children:[t(r,{bold:!0,color:"white",children:"↑↓"})," ","scroll"," ",t(r,{bold:!0,color:"white",children:"?"}),"/",t(r,{bold:!0,color:"white",children:"Esc"})," ","close"]}),scrollRef:se,title:"KEYBOARD SHORTCUTS",visible:d,width:56,children:[i(c,{flexDirection:"column",marginBottom:1,children:[i(c,{marginBottom:1,children:[t(r,{dimColor:!0,children:"── "}),t(r,{bold:!0,color:"white",children:"NAVIGATION"})]}),i(r,{children:[" ",t(r,{bold:!0,color:"white",children:"←→"}),t(r,{dimColor:!0,children:" Switch tabs"})]}),i(r,{children:[" ",t(r,{bold:!0,color:"white",children:"↑↓"}),"/",t(r,{bold:!0,color:"white",children:"j/k"}),t(r,{dimColor:!0,children:" Navigate within section"})]}),i(r,{children:[" ",t(r,{bold:!0,color:"white",children:"Tab"}),t(r,{dimColor:!0,children:" Switch editor/preview panel"})]}),i(r,{children:[" ",t(r,{bold:!0,color:"white",children:"Enter"}),t(r,{dimColor:!0,children:" Edit selected field"})]}),i(r,{children:[" ",t(r,{bold:!0,color:"white",children:"Esc"}),t(r,{dimColor:!0,children:" Stop editing / cancel"})]})]}),i(c,{flexDirection:"column",marginBottom:1,children:[i(c,{marginBottom:1,children:[t(r,{dimColor:!0,children:"── "}),t(r,{bold:!0,color:"white",children:"FEATURES / EXTENSIONS"})]}),i(r,{children:[" ",t(r,{bold:!0,color:"white",children:"Space"}),t(r,{dimColor:!0,children:" Toggle selection"})]}),i(r,{children:[" ",t(r,{bold:!0,color:"white",children:"/"}),t(r,{dimColor:!0,children:" Search / filter"})]})]}),i(c,{flexDirection:"column",marginBottom:1,children:[i(c,{marginBottom:1,children:[t(r,{dimColor:!0,children:"── "}),t(r,{bold:!0,color:"white",children:"LISTS (Ports, Mounts, Env)"})]}),i(r,{children:[" ",t(r,{bold:!0,color:"white",children:"a"}),t(r,{dimColor:!0,children:" Add new entry"})]}),i(r,{children:[" ",t(r,{bold:!0,color:"white",children:"d"}),t(r,{dimColor:!0,children:" Delete selected entry"})]})]}),i(c,{flexDirection:"column",children:[i(c,{marginBottom:1,children:[t(r,{dimColor:!0,children:"── "}),t(r,{bold:!0,color:"white",children:"ACTIONS"})]}),i(r,{children:[" ",t(r,{bold:!0,color:"white",children:"s"}),t(r,{dimColor:!0,children:" Save configuration"})]}),i(r,{children:[" ",t(r,{bold:!0,color:"white",children:"q"}),t(r,{dimColor:!0,children:" Quit"})]}),i(r,{children:[" ",t(r,{bold:!0,color:"white",children:"?"}),t(r,{dimColor:!0,children:" Toggle help"})]})]})]}),We=t(ir,{focused:S==="preview",hadComments:o.hadComments,jsonPreview:_e,mode:o.mode,scrollRef:F}),we=a>=dr,Xe=we?Math.floor(a*.38):0;return i(c,{flexDirection:"column",height:l,width:a,children:[i(c,{flexShrink:0,gap:1,paddingX:1,children:[t(r,{bold:!0,inverse:!0,children:" VIS "}),i(r,{wrap:"truncate",children:[o.mode==="create"?"Create":"Edit"," ","devcontainer"]})]}),t(c,{flexShrink:0,paddingX:1,paddingY:1,children:t(et,{defaultValue:o.section,keyMap:{useNumbers:!1,useTab:!1},onChange:y(h=>{e.setSection(h),P("editor")},"onChange"),showIndex:!1,children:Pe.map(({id:h,label:m})=>t(tt,{name:h,children:m},h))})}),t(c,{flexShrink:0,paddingRight:2,children:t(r,{dimColor:!0,wrap:"truncate",children:Pe.find(h=>h.id===o.section)?.description??""})}),i(c,{flexDirection:"row",flexGrow:1,overflow:"hidden",children:[t(c,{borderColor:S==="editor"?"white":"gray",borderStyle:"single",flexDirection:"column",flexGrow:1,overflow:"hidden",children:E}),we&&t(c,{flexShrink:0,width:Xe,children:We})]}),$e,t(ot,{autoExitSeconds:3,onCancel:y(()=>{p(!1)},"onCancel"),visible:f}),Ue]})},"VisDevcontainerApp");var mr=Object.defineProperty,je=y((n,e)=>mr(n,"name",{value:e,configurable:!0}),"c");const kr=je(async({logger:n,options:e,workspaceRoot:s})=>{if(!s)throw new Error("Could not determine workspace root. Run this command inside a monorepo or project directory.");const a=s,l=e.template,o=e.output,d=!!process.stdout.isTTY&&!it;let g=null;try{g=nt(a).name}catch{}const f=pt(a);let p=f?.config??null;const x=f?.hadComments??!1;if(l&&!f){const S=z.find(P=>P.id===l);if(!S){const P=z.map(Y=>Y.id).join(", ");throw new Error(`Unknown template "${l}". Valid templates: ${P}`)}p=S.config}if(!d){p?n.info(JSON.stringify(p,null,2)):(n.error("No existing devcontainer.json found. Use --template to generate one in non-TTY mode."),process.exitCode=1);return}process.stdin.isTTY&&typeof process.stdin.setRawMode=="function"&&(process.stdin.setRawMode(!0),process.stdin.ref(),process.stdin.resume());const v=setInterval(()=>{},1e3),w=new kt(p,x,g);l&&!f&&w.dismissTemplateSelector();let k=null;if(await rt(ct.createElement(hr,{onSave:je(S=>{vt(a,S,o),k=S},"onSave"),store:w}),{alternateScreen:!0,exitOnCtrlC:!1,interactive:!0,patchConsole:!0}).waitUntilExit(),clearInterval(v),k){const S=o??".devcontainer/devcontainer.json";n.info(`DevContainer config saved to ${S}`)}},"execute");export{kr as default};
@@ -0,0 +1 @@
1
+ var k=Object.defineProperty;var n=(e,s)=>k(e,"name",{value:s,configurable:!0});import{a as f,t as u}from"../packem_shared/bin-BaZZ32BK.js";var v=Object.defineProperty,h=n((e,s)=>v(e,"name",{value:s,configurable:!0}),"n");const x=h(async({argument:e,logger:s,options:a,visConfig:t,workspaceRoot:i})=>{const o=e;if(!o||o.length===0)throw new Error("No package specified. Usage: vis dlx <package[@version]> [args...]");const[g,...l]=o,r=i??process.cwd(),p=f(r,{configBackend:t?.install?.backend}),d=a.package?Array.isArray(a.package)?a.package:[a.package]:[],c=u(p,{additionalPackages:d,args:l,package:g,shellMode:a.shellMode||!1,silent:a.silent||!1},r,s);c!==0&&(process.exitCode=c)},"execute");export{x as default};
@@ -0,0 +1,2 @@
1
+ var g=Object.defineProperty;var p=(t,o)=>g(t,"name",{value:o,configurable:!0});import{join as d}from"@visulima/path";import{s as k,p as v}from"../packem_shared/docker-BcfqH4Av.js";import{Z as h,e as j}from"../packem_shared/bin-BaZZ32BK.js";var x=Object.defineProperty,E=p((t,o)=>x(t,"name",{value:o,configurable:!0}),"m");const P=E(async({argument:t,logger:o,options:s,visConfig:l,workspaceRoot:e})=>{const n=t[0];if(!n)throw new Error("Missing subcommand. Usage: vis docker <scaffold|prune>");if(!e)throw new Error("Could not determine workspace root. Run inside a monorepo.");const{packageJsons:m,workspace:c}=h(e,l);if(n==="scaffold"){const a=j(e,c,m),r=s.focus;if(!r)throw new Error("Missing --focus. Pass one or more project names, comma-separated.");const i=r.split(",").map(w=>w.trim()).filter(Boolean);if(i.length===0)throw new Error("--focus resolved to an empty list. Provide at least one project name.");const f=d(e,s.out??".vis/docker"),{projects:u}=k({focus:i,includeSources:!!s.includeSources,outDir:f,projectGraph:a,workspace:c,workspaceRoot:e});o.info(`Scaffolded ${u.length} project(s) into ${f}`),o.info(`Focus closure: ${u.sort().join(", ")}`);return}if(n==="prune"){const a=d(e,s.context??".vis/docker"),{removed:r}=v({contextRoot:a,workspace:c,workspaceRoot:e});o.info(`Pruned ${r.length} unfocused project(s)`),r.length>0&&o.debug?.(r.join(`
2
+ `));return}throw new Error(`Unknown subcommand: "${n}". Expected scaffold or prune.`)},"execute");export{P as default};
@@ -0,0 +1,7 @@
1
+ var _=Object.defineProperty;var A=(s,a)=>_(s,"name",{value:a,configurable:!0});import{green as x,red as J,yellow as T,dim as C}from"@visulima/colorize";import{findPackageManagerSync as B}from"@visulima/package";import{join as N,resolve as K}from"@visulima/path";import{o as q,a as G,w as H,m as Q}from"../packem_shared/catalog-CuSpuB_R.js";import{f as W,s as X}from"../packem_shared/dependency-scan-BoLG2Fez.js";import{m as V,J as Y,x as Z,$ as ee,O as e,c as b,E as te,I as j,K as se}from"../packem_shared/bin-BaZZ32BK.js";import{x as D,B as E,A as ae,I as oe,J as ie,_ as ne,F as re,L as le}from"./handler30.js";import{c as ce}from"../packem_shared/runtime-check-CGHal8SO.js";var de=Object.defineProperty,z=A((s,a)=>de(s,"name",{value:a,configurable:!0}),"b");const ue=z(async(s,a,w=!1)=>{const i=V(s),{packageManager:n}=B(s),l=D(N(s,"package.json"),!1),u=E(s),t=new Set(l);for(const c of u){const d=D(N(K(s,c),"package.json"),!1);for(const U of d)t.add(U)}const k=q(s),h=G(s,n),g=Y(a?.security?.socket),$=a?.security?.socket?.acceptedRisks,r=ae(s,i.name),f={exclude:[],ignore:[],include:[],includeLocked:!1,includePrerelease:!1,security:!0,target:"latest"},o=W(s,i.name),[v,m,S,F]=await Promise.all([h.size>0?H(h,f,k,void 0,s,g,$):Promise.resolve({failed:[],ignored:[],outdated:[]}),Promise.resolve(X(s)),Promise.resolve(oe(t)),Promise.resolve(ie(t,r,i,!1))]),L=new Set(S.map(c=>c.packageName)),M=F.filter(c=>!L.has(c.packageName)),P=[...S,...M];w&&await ne(P);let R=0,O=0;if(g&&m.length>0){const c=await Z(m.map(d=>({name:d.name,version:d.version})),g);for(const d of c.values())d.alerts.length>0&&(R+=d.alerts.length),d.score.overall<ee&&O++}let I=0;for(const c of v.outdated)c.vulnerabilities&&c.vulnerabilities.length>0&&(I+=c.vulnerabilities.length);if(m.length>0){const c=await Q(m.map(d=>({name:d.name,version:d.version})));for(const d of c.values())I+=d.length}return{duplicates:o,installedCount:m.length,optimizations:P,outdated:v.outdated,socketIssues:{alerts:R,lowScore:O},vulnCount:I,workspaceCount:u.length}},"runAllScans"),p=z(s=>s?x("✓"):J("✗"),"icon"),y=T("⚠"),pe=z(s=>{const{duplicates:a,installedCount:w,optimizations:i,outdated:n,socketIssues:l,vulnCount:u}=s;if(e(""),e(C("── Dependencies ────────────────────────")),e(` ${p(!0)} ${String(w)} packages installed`),n.length>0){const f=n.filter(S=>S.updateType==="major").length,o=n.filter(S=>S.updateType==="minor").length,v=n.filter(S=>S.updateType==="patch").length,m=[];f>0&&m.push(`${String(f)} major`),o>0&&m.push(`${String(o)} minor`),v>0&&m.push(`${String(v)} patch`),e(` ${y} ${String(n.length)} outdated (${m.join(", ")})`)}else e(` ${p(!0)} All dependencies up to date`);a.length>0?e(` ${y} ${String(a.length)} packages with duplicate versions`):e(` ${p(!0)} No duplicate dependencies`),e(""),e(C("── Security ────────────────────────────")),u>0?e(` ${p(!1)} ${String(u)} vulnerabilit${u===1?"y":"ies"} found`):e(` ${p(!0)} No known vulnerabilities`),l.alerts>0&&e(` ${y} ${String(l.alerts)} Socket.dev security alert${l.alerts===1?"":"s"}`),l.lowScore>0&&e(` ${y} ${String(l.lowScore)} package${l.lowScore===1?"":"s"} with low security score`),l.alerts===0&&l.lowScore===0&&u===0&&e(` ${p(!0)} No security issues detected`),e(""),e(C("── Optimization ────────────────────────"));let t=0,k=0,h=0,g=0;for(const f of i)switch(f.category){case"micro-utility":{h++;break}case"native":{t++;break}case"preferred":{k++;break}case"socket":{g++;break}}i.length>0?(t>0&&e(` ${y} ${String(t)} replaceable with native APIs`),k>0&&e(` ${y} ${String(k)} with lighter alternatives`),h>0&&e(` ${y} ${String(h)} trivial micro-utilities`),g>0&&e(` ${y} ${String(g)} @socketregistry overrides available`)):e(` ${p(!0)} No optimizations available`),e(""),e(C("── Summary ─────────────────────────────"));const $=u,r=n.length+a.length+i.length;$===0&&r===0?b(" Everything looks good!"):($>0&&te(` ${String($)} security issue${$===1?"":"s"}`),r>0&&e(` ${String(r)} improvement${r===1?"":"s"} available`))},"displayResults"),ge=z(s=>{const a=[];if(s.outdated.length>0&&a.push("vis update — update outdated dependencies"),(s.vulnCount>0||s.socketIssues.alerts>0)&&a.push("vis audit — detailed security analysis"),s.optimizations.length>0&&a.push("vis optimize — apply optimizations interactively"),s.duplicates.length>0&&a.push("vis dedupe — reduce duplicate versions"),a.length>0){e(""),j(" Next steps:");for(const w of a)j(` ${w}`)}e("")},"displayActions"),Ce=z(async({logger:s,options:a,visConfig:w,workspaceRoot:i})=>{if(!i)throw new Error("Could not determine workspace root.");const n=V(i);e(`
2
+ ${C("VIS DOCTOR")} — project health check
3
+ `),e(` ${p(!0)} Detected ${n.name} v${n.version}`);const l=E(i);l.length>0&&e(` ${p(!0)} ${String(l.length)} workspace package${l.length===1?"":"s"}`);const u=ce(i);if(u.length===0)e(` ${p(!0)} Runtime: Node.js ${process.versions.node} ${x("✓")}`);else{for(const r of u){const f=r.severity==="error"?J:T;e(` ${p(!1)} Runtime: ${f(r.message)}`)}j(` Run ${x("vis toolchain install")} to install pinned versions, or ${x("vis toolchain status")} for the per-tool breakdown.`)}e(`
4
+ Scanning...`);const t=await ue(i,w,!!a.fix);let k=0,h=0,g=0,$=0;for(const r of t.optimizations)switch(r.category){case"micro-utility":{g++;break}case"native":{k++;break}case"preferred":{h++;break}case"socket":{$++;break}}if(a.format==="json"||a.json){process.stdout.write(`${JSON.stringify({dependencies:{duplicates:t.duplicates.length,installed:t.installedCount,outdated:t.outdated.length},optimizations:{microUtilities:g,native:k,preferred:h,socket:$,total:t.optimizations.length},packageManager:n.name,security:{alerts:t.socketIssues.alerts,lowScorePackages:t.socketIssues.lowScore,vulnerabilities:t.vulnCount},workspaces:t.workspaceCount},void 0,2)}
5
+ `),a.exitCode&&(t.vulnCount>0||t.socketIssues.alerts>0)&&(process.exitCode=1);return}if(pe(t),a.fix&&t.optimizations.length>0){e(""),e(`Applying fixes...
6
+ `);const r=t.optimizations.filter(o=>o.category==="socket"&&o.overrideSpec).map(o=>({original:o.packageName,spec:o.overrideSpec}));if(r.length>0){const o=re(i,N(i,"package.json"),r,n);o.added.length>0&&b(` Added ${String(o.added.length)} security override${o.added.length===1?"":"s"}.`),o.updated.length>0&&b(` Updated ${String(o.updated.length)} override${o.updated.length===1?"":"s"}.`)}const f=t.optimizations.filter(o=>o.category!=="socket"&&o.hasCodemod);for(const o of f){const v=await le(i,o.packageName);v.filesChanged>0&&b(` ${o.packageName}: ${String(v.filesChanged)} file${v.filesChanged===1?"":"s"} updated`)}r.length>0&&(e(`
7
+ Running ${n.name} install to update lockfile...`),se(n,{dev:!1,filter:[],force:!1,frozenLockfile:!1,ignoreScripts:!1,lockfileOnly:!1,noOptional:!1,offline:!1,prod:!1,recursive:!1,silent:!1,workspaceRoot:!1},i,s)),e(""),b("Fixes applied.")}else ge(t);a.exitCode&&(a.strict?t.vulnCount>0||t.socketIssues.alerts>0||t.outdated.length>0||t.duplicates.length>0:t.vulnCount>0||t.socketIssues.alerts>0)&&(process.exitCode=1)},"execute");export{Ce as default};
@@ -0,0 +1 @@
1
+ var p=Object.defineProperty;var c=(o,r)=>p(o,"name",{value:r,configurable:!0});import{a as m,g}from"../packem_shared/bin-BaZZ32BK.js";import{o as u}from"../packem_shared/utils-DrNg0XTR.js";var v=Object.defineProperty,w=c((o,r)=>v(o,"name",{value:r,configurable:!0}),"l");const b=w(async({argument:o,logger:r,options:e,visConfig:t,workspaceRoot:n})=>{const a=o;if(!a||a.length===0)throw new Error("No command specified. Usage: vis exec <command> [args...]");const[i,...f]=a,s=n??process.cwd(),d=m(s,{configBackend:t?.install?.backend}),l=g(d,{args:f,command:i,filter:u(e.filter),parallel:e.parallel||!1,recursive:e.recursive||!1,reverse:e.reverse||!1,shellMode:e.shellMode||!1,workspaceRoot:e.workspaceRoot||!1},s,r);l!==0&&(process.exitCode=l)},"execute");export{b as default};
@@ -0,0 +1,19 @@
1
+ var ce=Object.defineProperty;var v=(t,e)=>ce(t,"name",{value:e,configurable:!0});import{createRequire as le}from"node:module";import{join as O,isAbsolute as V,relative as z,sep as pe,dirname as ue,resolve as de}from"@visulima/path";import{isAccessibleSync as P,walkSync as J,ensureDirSync as Q,writeFileSync as me}from"@visulima/fs";import{f as l,o as b,R as S,O as y,y as j,c as X,I as Z}from"../packem_shared/bin-BaZZ32BK.js";import{downloadTemplate as ye}from"giget";const fe=le(import.meta.url),N=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,D=v(t=>{if(typeof N<"u"&&N.versions&&N.versions.node){const[e,r]=N.versions.node.split(".").map(Number);if(e>22||e===22&&r>=3||e===20&&r>=16)return N.getBuiltinModule(t)}return fe(t)},"__cjs_getBuiltinModule"),{createInterface:he}=D("node:readline"),{mkdtempSync:ge,rmSync:$e}=D("node:fs"),{tmpdir:we}=D("node:os"),{spawnSync:ve}=D("node:child_process");var be=Object.defineProperty,g=v((t,e)=>be(t,"name",{value:e,configurable:!0}),"i");const ee=[".ts",".mts",".cts",".js",".mjs",".cjs"],Se="template.yml",Te=[".d",".test",".spec",".config",".bench",".stories"],Re=[".d.ts",".d.mts",".d.cts",".js.map",".mjs.map",".cjs.map",".ts.map"],te=g(t=>{for(const e of ee)if(t.endsWith(e))return t.slice(0,-e.length);return t},"stripExtension"),Oe=g(t=>{if(Re.some(r=>t.endsWith(r))||!ee.some(r=>t.endsWith(r)))return!1;const e=te(t);return!Te.some(r=>e.endsWith(r))},"isNativeFile"),H=g((t,e)=>{const r=[];if(!P(t))return r;for(const s of J(t,{includeDirs:!1,includeSymlinks:!1,maxDepth:1})){if(!Oe(s.name))continue;const o=te(s.name);r.push({load:g(()=>ke(s.path),"load"),name:o,path:s.path,source:e})}return r},"scanNativeDirectory"),M=g((t,e)=>{const r=[];if(!P(t))return r;for(const s of J(t,{includeFiles:!1,includeSymlinks:!1,maxDepth:1})){if(s.path===t)continue;const o=O(s.path,Se);P(o)&&r.push({load:g(()=>Ee(s.path,s.name),"load"),name:s.name,path:s.path,source:e})}return r},"scanMoonDirectory"),q=g(t=>{const{extraDirectories:e=[],onWarning:r,workspaceRoot:s}=t,o=[];o.push(...H(O(s,".vis","templates"),"native")),o.push(...M(O(s,".vis","templates"),"moon")),o.push(...M(O(s,".moon","templates"),"moon"));for(const n of e)o.push(...M(n,"config")),o.push(...H(n,"config"));const a=new Map;for(const n of o){const i=a.get(n.name);if(!i){a.set(n.name,n);continue}r&&r(`Template "${n.name}" exists in multiple sources — using ${i.source} (${i.path}), ignoring ${n.source} (${n.path}).`)}return[...a.values()].sort((n,i)=>n.name.localeCompare(i.name))},"discoverTemplates"),ke=g(async t=>{const{loadNativeTemplate:e}=await import("./loader.js");return e(t)},"loadNativeFromPath"),Ee=g(async(t,e)=>{const{loadMoonTemplate:r}=await import("./index.js");return r(t,e)},"loadMoonFromPath");var Ne=Object.defineProperty,h=v((t,e)=>Ne(t,"name",{value:e,configurable:!0}),"c");const B=h((t,e)=>new Promise(r=>{t.question(e,s=>{r(s.trim())})}),"ask"),je=h(async(t,e,r)=>{const s=await B(t,` ${e} ${l(r?"[Y/n]":"[y/N]")} `);return s===""?r:s.toLowerCase()==="y"||s.toLowerCase()==="yes"},"confirm"),xe=h(async(t,e,r,s)=>{process.stderr.write(` ${e}
2
+ `);for(const[o,a]of r.entries()){const n=b(S(` ${String(o+1)}.`)),i=a===s?l(" (default)"):"";process.stderr.write(`${n} ${a}${i}
3
+ `)}for(;;){const o=await B(t,`
4
+ ${l(`Enter choice (1-${String(r.length)}):`)} `);if(o===""&&s!==void 0)return s;const a=Number.parseInt(o,10);if(Number.isInteger(a)&&a>=1&&a<=r.length)return r[a-1];const n=r.find(i=>i===o);if(n)return n;process.stderr.write(` ${l("Invalid choice. Try again.")}
5
+ `)}},"selectOne"),_e=h(async(t,e,r,s)=>{process.stderr.write(` ${e} ${l("(comma-separated numbers)")}
6
+ `);for(const[o,a]of r.entries()){const n=b(S(` ${String(o+1)}.`)),i=s.includes(a)?l(" (default)"):"";process.stderr.write(`${n} ${a}${i}
7
+ `)}for(;;){const o=await B(t,`
8
+ ${l("Enter choices:")} `);if(o===""&&s.length>0)return s;const a=o.split(",").map(n=>Number.parseInt(n.trim(),10)).filter(n=>Number.isInteger(n)&&n>=1&&n<=r.length);if(a.length>0)return a.map(n=>r[n-1]);process.stderr.write(` ${l("Invalid choice. Try again.")}
9
+ `)}},"selectMany"),Ie=h(t=>` ${l(`${t}:`)} `,"promptText"),Pe=h((t,e)=>e.prompt??t,"variableLabel"),De=h(t=>Object.entries(t).sort(([e,r],[s,o])=>{const a=r.order??0,n=o.order??0;return a!==n?a-n:e.localeCompare(s)}),"sortVariables"),K=h((t,e)=>{switch(t.type){case"array":return e.split(",").map(r=>r.trim()).filter(Boolean);case"boolean":return e==="true"||e==="1"||e==="yes"||e==="y";case"enum":return t.multiple?e.split(",").map(r=>r.trim()).filter(Boolean):e;case"number":{const r=Number(e);if(Number.isNaN(r))throw new TypeError(`Expected a number, got "${e}"`);return r}default:return e}},"parseValue"),F=h((t,e,r)=>{if(e.type==="enum"){const s=Array.isArray(r)?r:[r];for(const o of s)if(typeof o!="string"||!e.values.includes(o))throw new Error(`Variable "${t}" must be one of: ${e.values.join(", ")} (got "${String(o)}")`)}},"validateValue"),Be=h(async t=>{const{defaults:e,interactive:r,overrides:s,variables:o}=t,a={},n=r?he({input:process.stdin,output:process.stderr}):null;try{for(const[i,c]of De(o)){if(Object.hasOwn(s,i)){const m=K(c,s[i]??"");F(i,c,m),a[i]=m;continue}if(e||!r||c.internal){if(c.default!==void 0){F(i,c,c.default),a[i]=c.default;continue}if(c.required)throw new Error(`Required variable "${i}" not provided. Pass --${i}=<value> or remove --defaults.`);continue}const d=Pe(i,c);let f;if(c.type==="boolean")f=await je(n,d,!!(c.default??!1));else if(c.type==="enum")if(c.multiple){const m=Array.isArray(c.default)?c.default:[];f=await _e(n,d,c.values,m)}else{const m=typeof c.default=="string"?c.default:void 0;f=await xe(n,d,c.values,m)}else{const m=c.default===void 0?"":` (${String(c.default)})`,$=await B(n,Ie(`${d}${m}`));if($===""&&c.default!==void 0)f=c.default;else if($===""){if(c.required)throw new Error(`Variable "${i}" is required`);continue}else f=K(c,$)}F(i,c,f),a[i]=f}return a}finally{n?.close()}},"collectOptions");var We=Object.defineProperty,C=v((t,e)=>We(t,"name",{value:e,configurable:!0}),"o");const Ae=["git://","npm://","https://","github:","gitlab:","bitbucket:","sourcehut:"],Me=C(t=>Ae.some(e=>t.startsWith(e)),"isRemoteSource"),qe=C(async(t,e={})=>{const r=e.targetDirectory===void 0,s=e.targetDirectory??ge(O(we(),"vis-generate-")),o=C(()=>{if(r)try{$e(s,{force:!0,recursive:!0})}catch{}},"cleanup");y(`Downloading ${t}…`);try{const a=await ye(t,{auth:e.auth||process.env.GIGET_AUTH||process.env.GITHUB_TOKEN||process.env.GH_TOKEN||void 0,dir:s,force:!0,preferOffline:e.preferOffline});return{cleanup:o,directory:a.dir}}catch(a){o();const n=a instanceof Error?a.message:String(a);throw j(`Failed to download template: ${n}`),a}},"fetchRemoteTemplate");var Fe=Object.defineProperty,T=v((t,e)=>Fe(t,"name",{value:e,configurable:!0}),"a");const re=T((t,e="")=>{const r=[];for(const[s,o]of Object.entries(t)){const a=e?`${e}/${s}`:s;typeof o=="string"||Buffer.isBuffer(o)?r.push({content:o,path:a}):o&&typeof o=="object"&&r.push(...re(o,a))}return r},"flattenTree"),Ve=T(t=>t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`,"formatSize"),Ce=T((t,e)=>{if(V(e))throw new Error(`Refusing to write outside destination: template produced absolute path "${e}".`);const r=O(t,e),s=z(t,r);if(s===".."||s.startsWith(`..${pe}`)||V(s))throw new Error(`Refusing to write outside destination: "${e}" resolves to "${r}" which escapes "${t}".`);return r},"safeJoinDestination"),Le=T((t,e)=>{Q(ue(t)),me(t,e)},"writeOne"),Ge=T((t,e,r=!1)=>{const s=typeof t=="string"?[t]:t.commands,o=typeof t=="string"?r:t.silent??r;for(const a of s){o||y(`$ ${a}`);const n=ve(a,{cwd:e,shell:!0,stdio:o?"ignore":"inherit"});if(n.status!==0)return j(`Script failed (exit ${String(n.status)}): ${a}`),!1}return!0},"runScript"),Ue=T(t=>{const e=new Map;for(const r of t){const s=typeof r=="string"?0:r.phase??0,o=e.get(s);o?o.push(r):e.set(s,[r])}return[...e.entries()].sort(([r],[s])=>r-s)},"groupByPhase"),Ye=T(async(t,e)=>{const r={builtins:{dest_dir:e.destination,dest_rel_dir:z(e.workspaceRoot,e.destination)||".",working_dir:e.cwd,workspace_root:e.workspaceRoot},options:e.options},s=await t.produce(r),o=s.files?re(s.files):[],a=s.filesMeta??{},n=[];for(const i of o){const c=Ce(e.destination,i.path);n.push({file:i,meta:a[i.path]??{},target:c})}if(e.dryRun){y(`${b(S("Plan"))} ${l("(dry-run, no files written)")}`);for(const i of n){const c=Buffer.isBuffer(i.file.content)?i.file.content.length:Buffer.byteLength(i.file.content,"utf8");process.stderr.write(` ${l("write")} ${i.file.path} ${l(`(${Ve(c)})`)}
10
+ `)}}else{Q(e.destination);let i=0,c=0;for(const d of n){const{file:f,meta:m,target:$}=d,A=P($),w=e.force||m.force===!0;if(A&&!w){j(`Skipped existing file: ${f.path} (use --force or set frontmatter force: true to overwrite)`),c+=1;continue}Le($,f.content),i+=1}X(`Wrote ${String(i)} file${i===1?"":"s"}${c>0?`, skipped ${String(c)}`:""}`)}if(!e.dryRun&&!e.skipScripts&&s.scripts&&s.scripts.length>0){const i=Ue(s.scripts);y(`Running ${String(s.scripts.length)} script${s.scripts.length===1?"":"s"} across ${String(i.length)} phase${i.length===1?"":"s"}…`);for(const[,c]of i)if((await Promise.all(c.map(d=>Promise.resolve(Ge(d,e.destination))))).includes(!1))throw new Error("Script failed — aborting.")}if(s.suggestions&&s.suggestions.length>0){process.stderr.write(`
11
+ `),Z("Next steps:");for(const i of s.suggestions)process.stderr.write(` ${l("•")} ${i}
12
+ `)}},"runTemplate");var He=Object.defineProperty,W=v((t,e)=>He(t,"name",{value:e,configurable:!0}),"u");const Ke=W(t=>{if(t.length===0){y("No templates found."),Z("Create one at .vis/templates/<name>.ts (programmatic) or .vis/templates/<name>/ (moon-format with template.yml).");return}y("Available templates:");for(const e of t){const r=l(`(${e.source})`);process.stderr.write(` ${b(S(e.name))} ${r}
13
+ `)}},"printList"),ze=W(t=>{const e={},r=[];for(const s of t){if(!s.startsWith("--")){r.push(s);continue}const o=s.indexOf("=");if(o===-1){const i=s.slice(2);i.startsWith("no-")?e[i.slice(3)]="false":e[i]="true";continue}const a=s.slice(2,o),n=s.slice(o+1);e[a]=n}return{overrides:e,remaining:r}},"parsePassthroughOverrides"),Je=W(async t=>{const{createInterface:e}=await import("node:readline"),r=e({input:process.stdin,output:process.stderr});try{process.stderr.write(` ${b(S("vis generate"))} ${l("— pick a template")}
14
+
15
+ `);for(const[s,o]of t.entries()){const a=b(S(` ${String(s+1)}.`));process.stderr.write(`${a} ${o.name} ${l(`(${o.source})`)}
16
+ `)}return new Promise((s,o)=>{r.question(`
17
+ ${l(`Enter choice (1-${String(t.length)}):`)} `,a=>{const n=Number.parseInt(a.trim(),10);Number.isInteger(n)&&n>=1&&n<=t.length?s(t[n-1].name):o(new Error("Invalid choice."))})})}finally{r.close()}},"pickInteractive"),st=W(async({argument:t,options:e,rawUnknown:r,visConfig:s,workspaceRoot:o})=>{const a=e.cwd||o||process.cwd(),n=o??a,i=s?.generator,c=Array.isArray(t)?t:t?[t]:[];if(e.list){const p=q({extraDirectories:i?.templates??[],onWarning:j,workspaceRoot:n});Ke(p);return}let d=[...r??[]];if(d.length===0){const p=process.argv.slice(2),u=p.indexOf("--");u!==-1&&(d=p.slice(u+1))}const f=c.indexOf("--"),m=f===-1?[]:c.slice(f+1),$=f===-1?c:c.slice(0,f),{overrides:A}=ze([...m,...d]);let w,x,_;const k=$[0];let I;if(k&&Me(k)){const p=await qe(k,{auth:i?.auth,preferOffline:!!e.preferOffline||i?.preferOffline});I=p.cleanup;try{const u=q({extraDirectories:[p.directory],workspaceRoot:n}).find(E=>E.path.startsWith(p.directory));if(!u)throw new Error(`Downloaded template at ${p.directory} contains no template.yml or *.ts entrypoint.`);w=await u.load(),x=u.name,_=w.destination}catch(u){throw I(),I=void 0,u}}else{const p=q({extraDirectories:i?.templates??[],onWarning:j,workspaceRoot:n});if(p.length===0)throw new Error("No templates found. Create one at .vis/templates/<name>.ts or .vis/templates/<name>/template.yml.");let u;if(k)u=k;else{if(e.noInteractive||!process.stdin.isTTY)throw new Error("No template specified. Pass a template name (see `vis generate --list`) or run interactively in a terminal.");u=await Je(p)}const E=p.find(ae=>ae.name===u);if(!E)throw new Error(`Template "${u}" not found. Run 'vis generate --list' to see available templates.`);w=await E.load(),x=E.name,_=w.destination}const L=e.to,G=!!e.dryRun,se=!!e.force,U=!!e.defaults,oe=!!e.skipScripts,ne=!e.noInteractive&&!!process.stdin.isTTY&&!U;let R;L?R=L:_?R=_:R=".";const Y=V(R)?R:de(a,R);y(`Template: ${b(S(x))}`),y(`Target: ${l(Y)}`),process.stderr.write(`
18
+ `);const ie=await Be({defaults:U,interactive:ne,overrides:A,variables:w.options??{}});try{await Ye(w,{cwd:a,destination:Y,dryRun:G,force:se,options:ie,skipScripts:oe,workspaceRoot:n}),G||(process.stderr.write(`
19
+ `),X(`Template '${x}' applied.`))}finally{I?.()}},"execute");export{st as default};
@@ -0,0 +1 @@
1
+ var b=Object.defineProperty;var y=(r,a)=>b(r,"name",{value:a,configurable:!0});import{createRequire as C}from"node:module";import R from"@visulima/colorize";import{coerce as T}from"semver";import{N as x,S as w,V as M,O as g,W as $,y as d,A as P,I as k,q as A,x as L,J as N,$ as I,a as V,Q as B}from"../packem_shared/bin-BaZZ32BK.js";import{r as O}from"../packem_shared/typosquats-Bpq4zcWL.js";import{d as S,o as U}from"../packem_shared/utils-DrNg0XTR.js";const _=C(import.meta.url),v=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,j=y(r=>{if(typeof v<"u"&&v.versions&&v.versions.node){const[a,e]=v.versions.node.split(".").map(Number);if(a>22||a===22&&e>=3||a===20&&e>=16)return v.getBuiltinModule(r)}return _(r)},"__cjs_getBuiltinModule"),{createInterface:q}=j("node:readline");var z=Object.defineProperty,h=y((r,a)=>z(r,"name",{value:a,configurable:!0}),"f");const{dim:D,green:J,red:E,yellow:F}=R,H=h(async(r,a=1e4)=>{const e=new Map,l=new AbortController,n=setTimeout(()=>{l.abort()},a);try{const s=r.map(async p=>{try{const t=await fetch(`https://registry.npmjs.org/${p}/latest`,{headers:{Accept:"application/json"},signal:l.signal});if(t.ok){const c=await t.json();c.version&&e.set(p,c.version)}}catch{}});await Promise.all(s)}finally{clearTimeout(n)}return e},"resolveLatestVersions"),Q=h((r,a,e)=>{const l=[];for(const n of r.values()){const{overall:s}=n.score,p=x(s),t=`${String(Math.round(s*100))}%`,c=n.alerts.length,i=w(n),f=M(i,n.version,e),o=p==="red"?E:p==="yellow"?F:J;if(f?g(` ${o(t)} ${$(n)} ${D(`[accepted: ${f.reason}]`)}`):g(` ${o(t)} ${$(n)}`),c>0){const u=n.alerts.filter(m=>m.severity==="critical"||m.severity==="high").length;u>0&&d(` ${String(u)} critical/high alert${u===1?"":"s"}`)}s<a&&!f&&l.push(n)}return l},"displaySecurityReports"),W=h(async(r,a)=>{const e=q({input:process.stdin,output:process.stdout}),l=h(t=>new Promise(c=>{e.question(t,i=>{c(i.trim())})}),"ask"),n=String(Math.round(a*100));d(""),d(`${String(r.length)} package${r.length===1?"":"s"} scored below the minimum threshold (${n}%):`);for(const t of r){const c=w(t),i=`${String(Math.round(t.score.overall*100))}%`;d(` • ${c}@${t.version} — score: ${i} (${P(t.score.overall)})`)}d("");const s=await l("Continue adding these packages? [y/N] ");if(s.toLowerCase()!=="y"&&s.toLowerCase()!=="yes")return e.close(),!1;const p=await l("Remember this decision? (prints config snippet) [y/N] ");if(e.close(),p.toLowerCase()==="y"||p.toLowerCase()==="yes"){k(""),k("Add the following to security.socket.acceptedRisks in vis.config.ts:"),k("");for(const t of r){const c=w(t),i=A(c,t.version,t.score.overall,"Reviewed and accepted");k(i)}k("")}return!0},"confirmLowScorePackages"),Y=h(async(r,a,e,l)=>{const n=r.map(S),s=new Map;for(const o of n)if(o.versionSpec){const u=T(o.versionSpec);u&&s.set(o.name,u.version)}const p=n.filter(o=>!s.has(o.name)).map(o=>o.name),t=p.length>0?await H(p):new Map,c=[];for(const o of n){const u=s.get(o.name)??t.get(o.name);u&&c.push({name:o.name,version:u})}if(c.length===0)return!0;g(""),g("Socket.dev security check:");const i=await L(c,a);if(i.size===0)return g(" Could not fetch security data. Proceeding."),!0;const f=Q(i,e,l);return f.length===0?(g(""),!0):process.stdin.isTTY?W(f,e):(d(`Aborting: ${String(f.length)} package${f.length===1?"":"s"} below minimum score. Use --no-socket-check to skip.`),!1)},"runSocketPreCheck"),te=h(async({argument:r,logger:a,options:e,visConfig:l,workspaceRoot:n})=>{let s=r;if(!s||s.length===0)throw new Error("No packages specified. Usage: vis add <packages...>");if(!e.noTyposquatCheck){const i=s.map(o=>S(o)),f=await O(i.map(o=>o.name),l?.security?.typosquatAllowlist);if(!f.ok){process.exitCode=1;return}s=i.map((o,u)=>{const m=f.packages[u];return m!==o.name?o.versionSpec?`${m}@${o.versionSpec}`:m??"":s[u]??""})}if(!e.noSocketCheck){const i=N(l?.security?.socket);if(i){const f=i.minimumScore??I;if(!await Y(s,i,f,l?.security?.socket?.acceptedRisks)){process.exitCode=1;return}}}const p=process.cwd(),t=V(n??p,{configBackend:l?.install?.backend}),c=B(t,{exact:e.exact||!1,filter:U(e.filter),global:e.global||!1,optional:e.saveOptional||!1,packages:s,peer:e.savePeer||!1,saveDev:e.saveDev||!1,workspace:e.workspace||!1,workspaceRoot:e.workspaceRoot||!1},p,a);c!==0&&(process.exitCode=c)},"execute");export{te as default};