@visulima/vis 1.0.0-alpha.10 → 1.0.0-alpha.11

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 (120) hide show
  1. package/CHANGELOG.md +95 -42
  2. package/LICENSE.md +213 -0
  3. package/README.md +8 -4
  4. package/dist/bin.js +9 -1
  5. package/dist/config/index.d.ts +1818 -0
  6. package/dist/config/index.js +2 -0
  7. package/dist/generate/index.d.ts +1 -1
  8. package/dist/generate/index.js +3 -1
  9. package/dist/packem_chunks/applyDefaults.js +336 -0
  10. package/dist/packem_chunks/bin.js +9554 -64
  11. package/dist/packem_chunks/doctor-probe.js +112 -0
  12. package/dist/packem_chunks/fix.js +229 -48
  13. package/dist/packem_chunks/handler.js +99 -1
  14. package/dist/packem_chunks/handler10.js +53 -1
  15. package/dist/packem_chunks/handler11.js +32 -1
  16. package/dist/packem_chunks/handler12.js +100 -2
  17. package/dist/packem_chunks/handler13.js +25 -1
  18. package/dist/packem_chunks/handler14.js +916 -5
  19. package/dist/packem_chunks/handler15.js +206 -1
  20. package/dist/packem_chunks/handler16.js +122 -18
  21. package/dist/packem_chunks/handler17.js +13 -1
  22. package/dist/packem_chunks/handler18.js +106 -1
  23. package/dist/packem_chunks/handler19.js +19 -1
  24. package/dist/packem_chunks/handler2.js +75 -1
  25. package/dist/packem_chunks/handler20.js +29 -1
  26. package/dist/packem_chunks/handler21.js +222 -1
  27. package/dist/packem_chunks/handler22.js +237 -5
  28. package/dist/packem_chunks/handler23.js +101 -1
  29. package/dist/packem_chunks/handler24.js +110 -1
  30. package/dist/packem_chunks/handler25.js +402 -5
  31. package/dist/packem_chunks/handler26.js +13 -1
  32. package/dist/packem_chunks/handler27.js +63 -3
  33. package/dist/packem_chunks/handler28.js +34 -1
  34. package/dist/packem_chunks/handler29.js +458 -7
  35. package/dist/packem_chunks/handler3.js +95 -2
  36. package/dist/packem_chunks/handler30.js +168 -21
  37. package/dist/packem_chunks/handler31.js +530 -3
  38. package/dist/packem_chunks/handler32.js +214 -2
  39. package/dist/packem_chunks/handler33.js +119 -24
  40. package/dist/packem_chunks/handler34.js +630 -2
  41. package/dist/packem_chunks/handler35.js +283 -19
  42. package/dist/packem_chunks/handler36.js +521 -407
  43. package/dist/packem_chunks/handler37.js +762 -22
  44. package/dist/packem_chunks/handler38.js +989 -22
  45. package/dist/packem_chunks/handler39.js +574 -22
  46. package/dist/packem_chunks/handler4.js +90 -4
  47. package/dist/packem_chunks/handler40.js +1685 -3
  48. package/dist/packem_chunks/handler41.js +1088 -10
  49. package/dist/packem_chunks/handler42.js +785 -141
  50. package/dist/packem_chunks/handler43.js +2658 -42
  51. package/dist/packem_chunks/handler44.js +3886 -3
  52. package/dist/packem_chunks/handler45.js +2568 -21
  53. package/dist/packem_chunks/handler46.js +3769 -0
  54. package/dist/packem_chunks/handler47.js +1491 -0
  55. package/dist/packem_chunks/handler5.js +174 -2
  56. package/dist/packem_chunks/handler6.js +95 -13
  57. package/dist/packem_chunks/handler7.js +115 -8
  58. package/dist/packem_chunks/handler8.js +12 -1
  59. package/dist/packem_chunks/handler9.js +29 -1
  60. package/dist/packem_chunks/heal-accept.js +522 -0
  61. package/dist/packem_chunks/heal.js +673 -0
  62. package/dist/packem_chunks/index.js +873 -7
  63. package/dist/packem_chunks/loader.js +23 -1
  64. package/dist/packem_shared/VisUpdateApp-D-Yz_wvg.js +1316 -0
  65. package/dist/packem_shared/_commonjsHelpers-BqLXS_qQ.js +5 -0
  66. package/dist/packem_shared/ai-analysis-CHeB1joD.js +367 -0
  67. package/dist/packem_shared/ai-cache-Be_jexe4.js +142 -0
  68. package/dist/packem_shared/ai-fix-B9iQVcD2.js +379 -0
  69. package/dist/packem_shared/cache-directory-2qvs4goY.js +98 -0
  70. package/dist/packem_shared/catalog-BJTtyi-O.js +1371 -0
  71. package/dist/packem_shared/dependency-scan-A0KSklpG.js +188 -0
  72. package/dist/packem_shared/docker-2iZzc280.js +181 -0
  73. package/dist/packem_shared/failure-log-Cz3Z4SKL.js +100 -0
  74. package/dist/packem_shared/flakiness-goTxXuCX.js +180 -0
  75. package/dist/packem_shared/otel-DCvqCTz_.js +158 -0
  76. package/dist/packem_shared/otelPlugin-DFaLDvJf.js +3 -0
  77. package/dist/packem_shared/registry-CbqXI0rc.js +272 -0
  78. package/dist/packem_shared/run-summary-utils-PVMl4aIh.js +130 -0
  79. package/dist/packem_shared/runtime-check-Cobi3p6l.js +127 -0
  80. package/dist/packem_shared/selectors-SM69TfqC.js +194 -0
  81. package/dist/packem_shared/symbols-Ta7g2nU-.js +14 -0
  82. package/dist/packem_shared/toolchain-BdZd9eBi.js +975 -0
  83. package/dist/packem_shared/typosquats-C-bCh3PX.js +1210 -0
  84. package/dist/packem_shared/use-measured-height-CNP0vT4M.js +20 -0
  85. package/dist/packem_shared/utils-CthVdBPS.js +40 -0
  86. package/dist/packem_shared/xxh3-Ck8mXNg1.js +239 -0
  87. package/index.js +727 -555
  88. package/package.json +35 -17
  89. package/schemas/project.schema.json +8 -10
  90. package/schemas/vis-config.schema.json +132 -8
  91. package/skills/vis/SKILL.md +96 -0
  92. package/templates/buildkite-ci/.buildkite/pipeline.yml.tera +85 -0
  93. package/templates/buildkite-ci/template.yml +20 -0
  94. package/dist/errors/index.d.ts +0 -26
  95. package/dist/errors/index.js +0 -1
  96. package/dist/packem_chunks/config.js +0 -2
  97. package/dist/packem_shared/VisConfigCycleError-CAYNC7d-.js +0 -1
  98. package/dist/packem_shared/VisConfigError-B5LP1zRf.js +0 -1
  99. package/dist/packem_shared/VisConfigLoadError-CeqBSd2Z.js +0 -2
  100. package/dist/packem_shared/VisConfigNotFoundError-DZ9KC527.js +0 -5
  101. package/dist/packem_shared/VisUpdateApp-D-L4_-Iu.js +0 -1
  102. package/dist/packem_shared/_commonjsHelpers-D6W6KoPK.js +0 -1
  103. package/dist/packem_shared/ai-analysis-CGuy7dfE.js +0 -67
  104. package/dist/packem_shared/ai-cache-Bynt6Y9x.js +0 -1
  105. package/dist/packem_shared/cache-directory-D72ZEag2.js +0 -1
  106. package/dist/packem_shared/catalog-BVPerCwG.js +0 -12
  107. package/dist/packem_shared/dependency-scan-Du0tBu64.js +0 -2
  108. package/dist/packem_shared/docker-BcfqH4Av.js +0 -2
  109. package/dist/packem_shared/failure-log-DqYen0LC.js +0 -2
  110. package/dist/packem_shared/flakiness-DSIHZGBT.js +0 -1
  111. package/dist/packem_shared/run-summary-utils-C24Aaf9E.js +0 -1
  112. package/dist/packem_shared/runtime-check-CGHal8SO.js +0 -1
  113. package/dist/packem_shared/selectors-CfH9ZY08.js +0 -3
  114. package/dist/packem_shared/symbols-CQmER5MT.js +0 -1
  115. package/dist/packem_shared/target-merge-DNa-6eWu.js +0 -1
  116. package/dist/packem_shared/toolchain-DQfTQY8E.js +0 -5
  117. package/dist/packem_shared/typosquats-DOR8izpX.js +0 -1
  118. package/dist/packem_shared/use-measured-height-DjYgUOKk.js +0 -1
  119. package/dist/packem_shared/utils-DrNg0XTR.js +0 -1
  120. package/dist/packem_shared/xxh3-DrAUNq4n.js +0 -1
@@ -1,3 +1,3886 @@
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{M as ot,c as nt,d as it}from"./bin.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};
1
+ import { createRequire as __cjs_createRequire } from "node:module";
2
+
3
+ const __cjs_require = __cjs_createRequire(import.meta.url);
4
+
5
+ const __cjs_getProcess = typeof globalThis !== "undefined" && typeof globalThis.process !== "undefined" ? globalThis.process : process;
6
+
7
+ const __cjs_getBuiltinModule = (module) => {
8
+ // Check if we're in Node.js and version supports getBuiltinModule
9
+ if (typeof __cjs_getProcess !== "undefined" && __cjs_getProcess.versions && __cjs_getProcess.versions.node) {
10
+ const [major, minor] = __cjs_getProcess.versions.node.split(".").map(Number);
11
+ // Node.js 20.16.0+ and 22.3.0+
12
+ if (major > 22 || (major === 22 && minor >= 3) || (major === 20 && minor >= 16)) {
13
+ return __cjs_getProcess.getBuiltinModule(module);
14
+ }
15
+ }
16
+ // Fallback to createRequire
17
+ return __cjs_require(module);
18
+ };
19
+
20
+ const {
21
+ spawnSync
22
+ } = __cjs_getBuiltinModule("node:child_process");
23
+ import { bold, cyan, dim } from '@visulima/colorize';
24
+ import { isAccessibleSync, ensureDirSync, writeFileSync, readJsonSync } from '@visulima/fs';
25
+ import { resolve, basename, join, relative, sep, isAbsolute } from '@visulima/path';
26
+ import { p as pail, l as runDlx, c as detectPm, x as runInstall } from './bin.js';
27
+ const {
28
+ createInterface
29
+ } = __cjs_getBuiltinModule("node:readline");
30
+ const {
31
+ readdirSync,
32
+ chmodSync
33
+ } = __cjs_getBuiltinModule("node:fs");
34
+ import { g as getDefaultExportFromCjs } from '../packem_shared/_commonjsHelpers-BqLXS_qQ.js';
35
+ import { downloadTemplate } from 'giget';
36
+
37
+ const BUILTIN_MAP = {
38
+ "vis:app": "builtin:app",
39
+ "vis:application": "builtin:app",
40
+ "vis:generator": "builtin:generator",
41
+ "vis:lib": "builtin:library",
42
+ "vis:library": "builtin:library",
43
+ "vis:monorepo": "builtin:monorepo"
44
+ };
45
+ const GIGET_PREFIXES = [
46
+ // Full HTTPS URLs for known hosts (must come before generic https://)
47
+ "https://github.com/",
48
+ "https://gitlab.com/",
49
+ "https://bitbucket.org/",
50
+ "https://raw.githubusercontent.com/",
51
+ "https://git.sr.ht/",
52
+ // SSH URLs
53
+ "git@github.com:",
54
+ "git@gitlab.com:",
55
+ "git@bitbucket.org:",
56
+ "git@git.sr.ht:",
57
+ // Provider prefixes (giget-compatible)
58
+ "github:",
59
+ "gh:",
60
+ "gitlab:",
61
+ "bitbucket:",
62
+ "sourcehut:",
63
+ "git:",
64
+ // Catch-all: direct tarball / registry URLs (giget http/https provider)
65
+ "http://",
66
+ "https://"
67
+ ];
68
+ const isGitUrl = (input) => {
69
+ for (const prefix of GIGET_PREFIXES) {
70
+ if (input.startsWith(prefix)) {
71
+ return true;
72
+ }
73
+ }
74
+ if (!input.startsWith("@") && /^[^/#@][^/#]*\/[^/#]+/.test(input)) {
75
+ return true;
76
+ }
77
+ return false;
78
+ };
79
+ const DIRECT_PACKAGES = /* @__PURE__ */ new Set(["sv"]);
80
+ const expandCreateShorthand = (name) => {
81
+ if (DIRECT_PACKAGES.has(name)) {
82
+ return name;
83
+ }
84
+ if (name.startsWith("create-") || name.startsWith("@") && name.includes("/create-")) {
85
+ return name;
86
+ }
87
+ if (name.startsWith("@")) {
88
+ const slashIndex = name.indexOf("/");
89
+ if (slashIndex !== -1) {
90
+ const scope = name.slice(0, slashIndex);
91
+ const pkg = name.slice(slashIndex + 1);
92
+ return `${scope}/create-${pkg}`;
93
+ }
94
+ return name;
95
+ }
96
+ return `create-${name}`;
97
+ };
98
+ const discoverTemplate = (input, extraArgs = []) => {
99
+ if (!input) {
100
+ throw new Error("No template specified.");
101
+ }
102
+ const lower = input.toLowerCase();
103
+ const builtinType = BUILTIN_MAP[lower];
104
+ if (builtinType) {
105
+ return { args: extraArgs, source: lower, type: builtinType };
106
+ }
107
+ if (isGitUrl(input)) {
108
+ return { args: extraArgs, source: input, type: "remote:git" };
109
+ }
110
+ return { args: extraArgs, source: expandCreateShorthand(input), type: "remote:npm" };
111
+ };
112
+ const inferParentDir = (type) => {
113
+ switch (type) {
114
+ case "builtin:app": {
115
+ return "apps";
116
+ }
117
+ case "builtin:generator":
118
+ case "builtin:library": {
119
+ return "packages";
120
+ }
121
+ default: {
122
+ return ".";
123
+ }
124
+ }
125
+ };
126
+
127
+ const words = [
128
+ "ability",
129
+ "able",
130
+ "about",
131
+ "above",
132
+ "abroad",
133
+ "absence",
134
+ "absolute",
135
+ "absolutely",
136
+ "absorb",
137
+ "academic",
138
+ "accept",
139
+ "access",
140
+ "accompany",
141
+ "accomplish",
142
+ "according",
143
+ "account",
144
+ "accurate",
145
+ "achieve",
146
+ "achievement",
147
+ "acid",
148
+ "acknowledge",
149
+ "acquire",
150
+ "across",
151
+ "act",
152
+ "action",
153
+ "active",
154
+ "activist",
155
+ "activity",
156
+ "actor",
157
+ "actress",
158
+ "actual",
159
+ "actually",
160
+ "adapt",
161
+ "add",
162
+ "addition",
163
+ "additional",
164
+ "address",
165
+ "adequate",
166
+ "adjust",
167
+ "adjustment",
168
+ "administration",
169
+ "administrator",
170
+ "admire",
171
+ "admission",
172
+ "admit",
173
+ "adolescent",
174
+ "adopt",
175
+ "adult",
176
+ "advance",
177
+ "advanced",
178
+ "advantage",
179
+ "adventure",
180
+ "advertising",
181
+ "advice",
182
+ "advise",
183
+ "adviser",
184
+ "advocate",
185
+ "affair",
186
+ "affect",
187
+ "afford",
188
+ "after",
189
+ "afternoon",
190
+ "again",
191
+ "against",
192
+ "age",
193
+ "agency",
194
+ "agenda",
195
+ "agent",
196
+ "ago",
197
+ "agree",
198
+ "agreement",
199
+ "agricultural",
200
+ "ahead",
201
+ "aid",
202
+ "aide",
203
+ "aim",
204
+ "air",
205
+ "aircraft",
206
+ "airline",
207
+ "airport",
208
+ "album",
209
+ "alive",
210
+ "all",
211
+ "alliance",
212
+ "allow",
213
+ "ally",
214
+ "almost",
215
+ "alone",
216
+ "along",
217
+ "already",
218
+ "also",
219
+ "alter",
220
+ "alternative",
221
+ "although",
222
+ "always",
223
+ "amazing",
224
+ "among",
225
+ "amount",
226
+ "analysis",
227
+ "analyst",
228
+ "analyze",
229
+ "ancient",
230
+ "and",
231
+ "angle",
232
+ "animal",
233
+ "anniversary",
234
+ "announce",
235
+ "annual",
236
+ "another",
237
+ "answer",
238
+ "anticipate",
239
+ "any",
240
+ "anybody",
241
+ "anymore",
242
+ "anyone",
243
+ "anything",
244
+ "anyway",
245
+ "anywhere",
246
+ "apart",
247
+ "apartment",
248
+ "apparent",
249
+ "apparently",
250
+ "appeal",
251
+ "appear",
252
+ "appearance",
253
+ "apple",
254
+ "application",
255
+ "apply",
256
+ "appoint",
257
+ "appointment",
258
+ "appreciate",
259
+ "approach",
260
+ "appropriate",
261
+ "approval",
262
+ "approve",
263
+ "approximately",
264
+ "architect",
265
+ "area",
266
+ "argue",
267
+ "argument",
268
+ "arise",
269
+ "arm",
270
+ "armed",
271
+ "around",
272
+ "arrange",
273
+ "arrangement",
274
+ "arrival",
275
+ "arrive",
276
+ "art",
277
+ "article",
278
+ "artist",
279
+ "artistic",
280
+ "aside",
281
+ "ask",
282
+ "asleep",
283
+ "aspect",
284
+ "assert",
285
+ "assess",
286
+ "assessment",
287
+ "asset",
288
+ "assign",
289
+ "assignment",
290
+ "assist",
291
+ "assistance",
292
+ "assistant",
293
+ "associate",
294
+ "association",
295
+ "assume",
296
+ "assumption",
297
+ "assure",
298
+ "athlete",
299
+ "athletic",
300
+ "atmosphere",
301
+ "attach",
302
+ "attempt",
303
+ "attend",
304
+ "attention",
305
+ "attitude",
306
+ "attorney",
307
+ "attract",
308
+ "attractive",
309
+ "attribute",
310
+ "audience",
311
+ "author",
312
+ "authority",
313
+ "auto",
314
+ "available",
315
+ "average",
316
+ "avoid",
317
+ "award",
318
+ "aware",
319
+ "awareness",
320
+ "away",
321
+ "awesome",
322
+ "baby",
323
+ "back",
324
+ "background",
325
+ "bag",
326
+ "bake",
327
+ "balance",
328
+ "ball",
329
+ "ban",
330
+ "band",
331
+ "bank",
332
+ "bar",
333
+ "barely",
334
+ "barrel",
335
+ "base",
336
+ "baseball",
337
+ "basic",
338
+ "basically",
339
+ "basis",
340
+ "basket",
341
+ "basketball",
342
+ "bathroom",
343
+ "battery",
344
+ "beach",
345
+ "bean",
346
+ "bear",
347
+ "beat",
348
+ "beautiful",
349
+ "beauty",
350
+ "because",
351
+ "become",
352
+ "bed",
353
+ "bedroom",
354
+ "beer",
355
+ "before",
356
+ "begin",
357
+ "beginning",
358
+ "behavior",
359
+ "behind",
360
+ "being",
361
+ "belief",
362
+ "believe",
363
+ "bell",
364
+ "belong",
365
+ "below",
366
+ "belt",
367
+ "bench",
368
+ "bend",
369
+ "beneath",
370
+ "benefit",
371
+ "beside",
372
+ "besides",
373
+ "best",
374
+ "bet",
375
+ "better",
376
+ "between",
377
+ "beyond",
378
+ "big",
379
+ "bike",
380
+ "bill",
381
+ "billion",
382
+ "bind",
383
+ "biological",
384
+ "bird",
385
+ "birth",
386
+ "birthday",
387
+ "bit",
388
+ "bite",
389
+ "black",
390
+ "blade",
391
+ "blanket",
392
+ "blind",
393
+ "block",
394
+ "blow",
395
+ "blue",
396
+ "board",
397
+ "boat",
398
+ "body",
399
+ "bond",
400
+ "bone",
401
+ "book",
402
+ "boom",
403
+ "boot",
404
+ "border",
405
+ "born",
406
+ "borrow",
407
+ "boss",
408
+ "both",
409
+ "bother",
410
+ "bottle",
411
+ "bottom",
412
+ "boundary",
413
+ "bowl",
414
+ "box",
415
+ "boy",
416
+ "boyfriend",
417
+ "brain",
418
+ "branch",
419
+ "brand",
420
+ "bread",
421
+ "break",
422
+ "breakfast",
423
+ "breast",
424
+ "breath",
425
+ "breathe",
426
+ "brick",
427
+ "bridge",
428
+ "brief",
429
+ "briefly",
430
+ "bright",
431
+ "brilliant",
432
+ "bring",
433
+ "broad",
434
+ "brother",
435
+ "brown",
436
+ "brush",
437
+ "buck",
438
+ "budget",
439
+ "build",
440
+ "building",
441
+ "bullet",
442
+ "bunch",
443
+ "bury",
444
+ "bus",
445
+ "business",
446
+ "busy",
447
+ "but",
448
+ "butter",
449
+ "button",
450
+ "buy",
451
+ "buyer",
452
+ "cabin",
453
+ "cabinet",
454
+ "cable",
455
+ "cake",
456
+ "calculate",
457
+ "call",
458
+ "camera",
459
+ "camp",
460
+ "campaign",
461
+ "campus",
462
+ "can",
463
+ "candidate",
464
+ "cap",
465
+ "capability",
466
+ "capable",
467
+ "capacity",
468
+ "capital",
469
+ "captain",
470
+ "capture",
471
+ "car",
472
+ "carbon",
473
+ "card",
474
+ "care",
475
+ "career",
476
+ "careful",
477
+ "carefully",
478
+ "carrier",
479
+ "carry",
480
+ "case",
481
+ "cash",
482
+ "cast",
483
+ "cat",
484
+ "catch",
485
+ "category",
486
+ "cause",
487
+ "ceiling",
488
+ "celebrate",
489
+ "celebration",
490
+ "celebrity",
491
+ "cell",
492
+ "center",
493
+ "central",
494
+ "century",
495
+ "ceremony",
496
+ "certain",
497
+ "certainly",
498
+ "chain",
499
+ "chair",
500
+ "chairman",
501
+ "challenge",
502
+ "chamber",
503
+ "champion",
504
+ "championship",
505
+ "chance",
506
+ "change",
507
+ "changing",
508
+ "channel",
509
+ "chapter",
510
+ "character",
511
+ "characteristic",
512
+ "characterize",
513
+ "charge",
514
+ "charity",
515
+ "chart",
516
+ "chase",
517
+ "cheap",
518
+ "check",
519
+ "cheek",
520
+ "cheese",
521
+ "chef",
522
+ "chemical",
523
+ "chest",
524
+ "chicken",
525
+ "chief",
526
+ "child",
527
+ "childhood",
528
+ "chip",
529
+ "chocolate",
530
+ "choice",
531
+ "cholesterol",
532
+ "choose",
533
+ "church",
534
+ "cigarette",
535
+ "circle",
536
+ "circumstance",
537
+ "cite",
538
+ "citizen",
539
+ "city",
540
+ "civil",
541
+ "civilian",
542
+ "claim",
543
+ "class",
544
+ "classic",
545
+ "classroom",
546
+ "clean",
547
+ "clear",
548
+ "clearly",
549
+ "client",
550
+ "climate",
551
+ "climb",
552
+ "clinic",
553
+ "clinical",
554
+ "clock",
555
+ "close",
556
+ "closely",
557
+ "closer",
558
+ "clothes",
559
+ "clothing",
560
+ "cloud",
561
+ "club",
562
+ "clue",
563
+ "cluster",
564
+ "coach",
565
+ "coal",
566
+ "coalition",
567
+ "coast",
568
+ "coat",
569
+ "code",
570
+ "coffee",
571
+ "cognitive",
572
+ "cold",
573
+ "colleague",
574
+ "collect",
575
+ "collection",
576
+ "collective",
577
+ "college",
578
+ "colonial",
579
+ "color",
580
+ "column",
581
+ "combination",
582
+ "combine",
583
+ "come",
584
+ "comedy",
585
+ "comfort",
586
+ "comfortable",
587
+ "command",
588
+ "commander",
589
+ "comment",
590
+ "commercial",
591
+ "commission",
592
+ "commit",
593
+ "commitment",
594
+ "committee",
595
+ "common",
596
+ "communicate",
597
+ "communication",
598
+ "community",
599
+ "company",
600
+ "compare",
601
+ "comparison",
602
+ "compete",
603
+ "competition",
604
+ "competitive",
605
+ "competitor",
606
+ "complete",
607
+ "completely",
608
+ "complex",
609
+ "complicated",
610
+ "component",
611
+ "compose",
612
+ "composition",
613
+ "comprehensive",
614
+ "computer",
615
+ "concentrate",
616
+ "concentration",
617
+ "concept",
618
+ "concern",
619
+ "concerned",
620
+ "concert",
621
+ "conclude",
622
+ "conclusion",
623
+ "concrete",
624
+ "condition",
625
+ "conduct",
626
+ "conference",
627
+ "confidence",
628
+ "confident",
629
+ "confirm",
630
+ "confront",
631
+ "confusion",
632
+ "congressional",
633
+ "connect",
634
+ "connection",
635
+ "consciousness",
636
+ "consensus",
637
+ "consequence",
638
+ "conservative",
639
+ "consider",
640
+ "considerable",
641
+ "consideration",
642
+ "consist",
643
+ "consistent",
644
+ "constant",
645
+ "constantly",
646
+ "constitute",
647
+ "constitutional",
648
+ "construct",
649
+ "construction",
650
+ "consultant",
651
+ "consume",
652
+ "consumer",
653
+ "consumption",
654
+ "contact",
655
+ "contain",
656
+ "container",
657
+ "contemporary",
658
+ "content",
659
+ "contest",
660
+ "context",
661
+ "continue",
662
+ "continued",
663
+ "contract",
664
+ "contrast",
665
+ "contribute",
666
+ "contribution",
667
+ "control",
668
+ "convention",
669
+ "conventional",
670
+ "conversation",
671
+ "convert",
672
+ "conviction",
673
+ "convince",
674
+ "cook",
675
+ "cookie",
676
+ "cooking",
677
+ "cool",
678
+ "cooperation",
679
+ "cop",
680
+ "cope",
681
+ "copy",
682
+ "core",
683
+ "corn",
684
+ "corner",
685
+ "corporate",
686
+ "corporation",
687
+ "correct",
688
+ "correspondent",
689
+ "cost",
690
+ "cotton",
691
+ "couch",
692
+ "could",
693
+ "council",
694
+ "counselor",
695
+ "count",
696
+ "counter",
697
+ "country",
698
+ "county",
699
+ "couple",
700
+ "courage",
701
+ "course",
702
+ "court",
703
+ "cousin",
704
+ "cover",
705
+ "coverage",
706
+ "cow",
707
+ "crack",
708
+ "craft",
709
+ "cream",
710
+ "create",
711
+ "creation",
712
+ "creative",
713
+ "creature",
714
+ "credit",
715
+ "crew",
716
+ "criteria",
717
+ "crop",
718
+ "cross",
719
+ "crowd",
720
+ "crucial",
721
+ "cultural",
722
+ "culture",
723
+ "cup",
724
+ "curious",
725
+ "current",
726
+ "currently",
727
+ "curriculum",
728
+ "custom",
729
+ "customer",
730
+ "cut",
731
+ "cycle",
732
+ "dad",
733
+ "daily",
734
+ "dance",
735
+ "dare",
736
+ "dark",
737
+ "darkness",
738
+ "data",
739
+ "date",
740
+ "daughter",
741
+ "day",
742
+ "deal",
743
+ "dealer",
744
+ "dear",
745
+ "debate",
746
+ "decade",
747
+ "decide",
748
+ "decision",
749
+ "deck",
750
+ "declare",
751
+ "decrease",
752
+ "deep",
753
+ "deeply",
754
+ "deer",
755
+ "defend",
756
+ "defendant",
757
+ "defense",
758
+ "defensive",
759
+ "define",
760
+ "definitely",
761
+ "definition",
762
+ "degree",
763
+ "delay",
764
+ "deliver",
765
+ "delivery",
766
+ "demand",
767
+ "democracy",
768
+ "democratic",
769
+ "demonstrate",
770
+ "demonstration",
771
+ "deny",
772
+ "department",
773
+ "depend",
774
+ "dependent",
775
+ "depending",
776
+ "depict",
777
+ "depth",
778
+ "deputy",
779
+ "derive",
780
+ "describe",
781
+ "description",
782
+ "desert",
783
+ "deserve",
784
+ "design",
785
+ "designer",
786
+ "desire",
787
+ "desk",
788
+ "desperate",
789
+ "despite",
790
+ "detail",
791
+ "detailed",
792
+ "detect",
793
+ "determine",
794
+ "develop",
795
+ "developing",
796
+ "development",
797
+ "device",
798
+ "devote",
799
+ "dialogue",
800
+ "diet",
801
+ "differ",
802
+ "difference",
803
+ "different",
804
+ "differently",
805
+ "difficult",
806
+ "difficulty",
807
+ "dig",
808
+ "digital",
809
+ "dimension",
810
+ "dining",
811
+ "dinner",
812
+ "direct",
813
+ "direction",
814
+ "directly",
815
+ "director",
816
+ "disability",
817
+ "disagree",
818
+ "disappear",
819
+ "discipline",
820
+ "discourse",
821
+ "discover",
822
+ "discovery",
823
+ "discuss",
824
+ "discussion",
825
+ "dish",
826
+ "dismiss",
827
+ "display",
828
+ "distance",
829
+ "distant",
830
+ "distinct",
831
+ "distinction",
832
+ "distinguish",
833
+ "distribute",
834
+ "distribution",
835
+ "district",
836
+ "diverse",
837
+ "diversity",
838
+ "divide",
839
+ "division",
840
+ "doctor",
841
+ "document",
842
+ "dog",
843
+ "domestic",
844
+ "dominant",
845
+ "dominate",
846
+ "door",
847
+ "double",
848
+ "down",
849
+ "downtown",
850
+ "dozen",
851
+ "draft",
852
+ "drag",
853
+ "drama",
854
+ "dramatic",
855
+ "dramatically",
856
+ "draw",
857
+ "drawing",
858
+ "dream",
859
+ "dress",
860
+ "drink",
861
+ "drive",
862
+ "driver",
863
+ "drop",
864
+ "dry",
865
+ "due",
866
+ "during",
867
+ "dust",
868
+ "duty",
869
+ "each",
870
+ "eager",
871
+ "ear",
872
+ "early",
873
+ "earn",
874
+ "earnings",
875
+ "earth",
876
+ "ease",
877
+ "easily",
878
+ "east",
879
+ "eastern",
880
+ "easy",
881
+ "eat",
882
+ "economic",
883
+ "economics",
884
+ "economist",
885
+ "economy",
886
+ "edge",
887
+ "edition",
888
+ "editor",
889
+ "educate",
890
+ "education",
891
+ "educational",
892
+ "educator",
893
+ "effect",
894
+ "effective",
895
+ "effectively",
896
+ "efficiency",
897
+ "efficient",
898
+ "effort",
899
+ "egg",
900
+ "eight",
901
+ "either",
902
+ "elderly",
903
+ "elect",
904
+ "election",
905
+ "electric",
906
+ "electricity",
907
+ "electronic",
908
+ "element",
909
+ "elementary",
910
+ "eliminate",
911
+ "elite",
912
+ "else",
913
+ "elsewhere",
914
+ "embrace",
915
+ "emerge",
916
+ "emission",
917
+ "emotion",
918
+ "emotional",
919
+ "emphasis",
920
+ "emphasize",
921
+ "employ",
922
+ "employee",
923
+ "employer",
924
+ "employment",
925
+ "empty",
926
+ "enable",
927
+ "encounter",
928
+ "encourage",
929
+ "end",
930
+ "energy",
931
+ "enforcement",
932
+ "engage",
933
+ "engine",
934
+ "engineer",
935
+ "engineering",
936
+ "enhance",
937
+ "enjoy",
938
+ "enormous",
939
+ "enough",
940
+ "ensure",
941
+ "enter",
942
+ "enterprise",
943
+ "entertainment",
944
+ "entire",
945
+ "entirely",
946
+ "entrance",
947
+ "entry",
948
+ "environment",
949
+ "environmental",
950
+ "episode",
951
+ "equal",
952
+ "equally",
953
+ "equipment",
954
+ "era",
955
+ "escape",
956
+ "especially",
957
+ "essay",
958
+ "essential",
959
+ "essentially",
960
+ "establish",
961
+ "establishment",
962
+ "estate",
963
+ "estimate",
964
+ "etc",
965
+ "ethics",
966
+ "ethnic",
967
+ "evaluate",
968
+ "evaluation",
969
+ "even",
970
+ "evening",
971
+ "event",
972
+ "eventually",
973
+ "ever",
974
+ "every",
975
+ "everybody",
976
+ "everyday",
977
+ "everyone",
978
+ "everything",
979
+ "everywhere",
980
+ "evidence",
981
+ "evolution",
982
+ "evolve",
983
+ "exact",
984
+ "exactly",
985
+ "examination",
986
+ "examine",
987
+ "example",
988
+ "exceed",
989
+ "excellent",
990
+ "except",
991
+ "exception",
992
+ "exchange",
993
+ "exciting",
994
+ "executive",
995
+ "exercise",
996
+ "exhibit",
997
+ "exhibition",
998
+ "exist",
999
+ "existence",
1000
+ "existing",
1001
+ "expand",
1002
+ "expansion",
1003
+ "expect",
1004
+ "expectation",
1005
+ "expense",
1006
+ "expensive",
1007
+ "experience",
1008
+ "experiment",
1009
+ "expert",
1010
+ "explain",
1011
+ "explanation",
1012
+ "explore",
1013
+ "expose",
1014
+ "express",
1015
+ "expression",
1016
+ "extend",
1017
+ "extension",
1018
+ "extensive",
1019
+ "extent",
1020
+ "external",
1021
+ "extra",
1022
+ "extraordinary",
1023
+ "extreme",
1024
+ "extremely",
1025
+ "eye",
1026
+ "fabric",
1027
+ "face",
1028
+ "facility",
1029
+ "fact",
1030
+ "factor",
1031
+ "factory",
1032
+ "faculty",
1033
+ "fade",
1034
+ "fair",
1035
+ "fairly",
1036
+ "faith",
1037
+ "fall",
1038
+ "false",
1039
+ "familiar",
1040
+ "family",
1041
+ "famous",
1042
+ "fan",
1043
+ "fantasy",
1044
+ "far",
1045
+ "farm",
1046
+ "farmer",
1047
+ "fashion",
1048
+ "fast",
1049
+ "fate",
1050
+ "father",
1051
+ "favor",
1052
+ "favorite",
1053
+ "feature",
1054
+ "federal",
1055
+ "fee",
1056
+ "feed",
1057
+ "feel",
1058
+ "feeling",
1059
+ "fellow",
1060
+ "female",
1061
+ "fence",
1062
+ "few",
1063
+ "fewer",
1064
+ "fiber",
1065
+ "fiction",
1066
+ "field",
1067
+ "fifteen",
1068
+ "fifth",
1069
+ "fifty",
1070
+ "figure",
1071
+ "file",
1072
+ "fill",
1073
+ "film",
1074
+ "final",
1075
+ "finally",
1076
+ "finance",
1077
+ "financial",
1078
+ "find",
1079
+ "finding",
1080
+ "fine",
1081
+ "finger",
1082
+ "finish",
1083
+ "firm",
1084
+ "first",
1085
+ "fish",
1086
+ "fishing",
1087
+ "fit",
1088
+ "fitness",
1089
+ "five",
1090
+ "fix",
1091
+ "flag",
1092
+ "flame",
1093
+ "flat",
1094
+ "flavor",
1095
+ "flesh",
1096
+ "flight",
1097
+ "float",
1098
+ "floor",
1099
+ "flow",
1100
+ "flower",
1101
+ "fly",
1102
+ "focus",
1103
+ "folk",
1104
+ "follow",
1105
+ "following",
1106
+ "food",
1107
+ "foot",
1108
+ "football",
1109
+ "for",
1110
+ "force",
1111
+ "foreign",
1112
+ "forest",
1113
+ "forever",
1114
+ "forget",
1115
+ "form",
1116
+ "formal",
1117
+ "formation",
1118
+ "former",
1119
+ "formula",
1120
+ "forth",
1121
+ "fortune",
1122
+ "forward",
1123
+ "found",
1124
+ "foundation",
1125
+ "founder",
1126
+ "four",
1127
+ "fourth",
1128
+ "frame",
1129
+ "framework",
1130
+ "free",
1131
+ "freedom",
1132
+ "freeze",
1133
+ "frequency",
1134
+ "frequent",
1135
+ "frequently",
1136
+ "fresh",
1137
+ "friend",
1138
+ "friendly",
1139
+ "friendship",
1140
+ "from",
1141
+ "front",
1142
+ "fruit",
1143
+ "fuel",
1144
+ "full",
1145
+ "fully",
1146
+ "fun",
1147
+ "function",
1148
+ "fund",
1149
+ "fundamental",
1150
+ "funding",
1151
+ "funeral",
1152
+ "funny",
1153
+ "furniture",
1154
+ "furthermore",
1155
+ "future",
1156
+ "gain",
1157
+ "galaxy",
1158
+ "gallery",
1159
+ "game",
1160
+ "gap",
1161
+ "garage",
1162
+ "garden",
1163
+ "garlic",
1164
+ "gas",
1165
+ "gate",
1166
+ "gather",
1167
+ "gaze",
1168
+ "gear",
1169
+ "gender",
1170
+ "gene",
1171
+ "general",
1172
+ "generally",
1173
+ "generate",
1174
+ "generation",
1175
+ "genetic",
1176
+ "gentleman",
1177
+ "gently",
1178
+ "gesture",
1179
+ "get",
1180
+ "ghost",
1181
+ "giant",
1182
+ "gift",
1183
+ "gifted",
1184
+ "girl",
1185
+ "girlfriend",
1186
+ "give",
1187
+ "given",
1188
+ "glad",
1189
+ "glance",
1190
+ "glass",
1191
+ "global",
1192
+ "glove",
1193
+ "goal",
1194
+ "gold",
1195
+ "golden",
1196
+ "golf",
1197
+ "good",
1198
+ "government",
1199
+ "governor",
1200
+ "grab",
1201
+ "grade",
1202
+ "gradually",
1203
+ "graduate",
1204
+ "grain",
1205
+ "grand",
1206
+ "grandfather",
1207
+ "grandmother",
1208
+ "grant",
1209
+ "grass",
1210
+ "grave",
1211
+ "gray",
1212
+ "great",
1213
+ "greatest",
1214
+ "green",
1215
+ "grocery",
1216
+ "ground",
1217
+ "group",
1218
+ "grow",
1219
+ "growing",
1220
+ "growth",
1221
+ "guarantee",
1222
+ "guard",
1223
+ "guess",
1224
+ "guest",
1225
+ "guide",
1226
+ "guideline",
1227
+ "guy",
1228
+ "habit",
1229
+ "habitat",
1230
+ "hair",
1231
+ "half",
1232
+ "hall",
1233
+ "hand",
1234
+ "handful",
1235
+ "handle",
1236
+ "hang",
1237
+ "happen",
1238
+ "happy",
1239
+ "hard",
1240
+ "hardly",
1241
+ "hat",
1242
+ "have",
1243
+ "head",
1244
+ "headline",
1245
+ "headquarters",
1246
+ "health",
1247
+ "healthy",
1248
+ "hear",
1249
+ "hearing",
1250
+ "heart",
1251
+ "heat",
1252
+ "heaven",
1253
+ "heavily",
1254
+ "heavy",
1255
+ "heel",
1256
+ "height",
1257
+ "helicopter",
1258
+ "hello",
1259
+ "help",
1260
+ "helpful",
1261
+ "here",
1262
+ "heritage",
1263
+ "hero",
1264
+ "herself",
1265
+ "hey",
1266
+ "hide",
1267
+ "high",
1268
+ "highlight",
1269
+ "highly",
1270
+ "highway",
1271
+ "hill",
1272
+ "himself",
1273
+ "hip",
1274
+ "hire",
1275
+ "historian",
1276
+ "historic",
1277
+ "historical",
1278
+ "history",
1279
+ "hit",
1280
+ "hold",
1281
+ "hole",
1282
+ "holiday",
1283
+ "holy",
1284
+ "home",
1285
+ "honest",
1286
+ "honey",
1287
+ "honor",
1288
+ "hope",
1289
+ "horizon",
1290
+ "horse",
1291
+ "hospital",
1292
+ "host",
1293
+ "hot",
1294
+ "hotel",
1295
+ "hour",
1296
+ "house",
1297
+ "household",
1298
+ "housing",
1299
+ "how",
1300
+ "however",
1301
+ "huge",
1302
+ "human",
1303
+ "humor",
1304
+ "hundred",
1305
+ "hungry",
1306
+ "hunter",
1307
+ "hunting",
1308
+ "husband",
1309
+ "hypothesis",
1310
+ "ice",
1311
+ "idea",
1312
+ "ideal",
1313
+ "identification",
1314
+ "identify",
1315
+ "identity",
1316
+ "ignore",
1317
+ "illustrate",
1318
+ "image",
1319
+ "imagination",
1320
+ "imagine",
1321
+ "immediate",
1322
+ "immediately",
1323
+ "immigrant",
1324
+ "immigration",
1325
+ "impact",
1326
+ "implement",
1327
+ "implication",
1328
+ "imply",
1329
+ "importance",
1330
+ "important",
1331
+ "impose",
1332
+ "impossible",
1333
+ "impress",
1334
+ "impression",
1335
+ "impressive",
1336
+ "improve",
1337
+ "improvement",
1338
+ "incentive",
1339
+ "incident",
1340
+ "include",
1341
+ "including",
1342
+ "income",
1343
+ "incorporate",
1344
+ "increase",
1345
+ "increased",
1346
+ "increasing",
1347
+ "increasingly",
1348
+ "incredible",
1349
+ "indeed",
1350
+ "independence",
1351
+ "independent",
1352
+ "index",
1353
+ "indicate",
1354
+ "indication",
1355
+ "individual",
1356
+ "industrial",
1357
+ "industry",
1358
+ "infant",
1359
+ "inflation",
1360
+ "influence",
1361
+ "inform",
1362
+ "information",
1363
+ "ingredient",
1364
+ "initial",
1365
+ "initially",
1366
+ "initiative",
1367
+ "inner",
1368
+ "innocent",
1369
+ "inquiry",
1370
+ "inside",
1371
+ "insight",
1372
+ "insist",
1373
+ "inspire",
1374
+ "install",
1375
+ "instance",
1376
+ "instead",
1377
+ "institution",
1378
+ "institutional",
1379
+ "instruction",
1380
+ "instructor",
1381
+ "instrument",
1382
+ "insurance",
1383
+ "intellectual",
1384
+ "intelligence",
1385
+ "intend",
1386
+ "intense",
1387
+ "intensity",
1388
+ "intention",
1389
+ "interaction",
1390
+ "interest",
1391
+ "interested",
1392
+ "interesting",
1393
+ "internal",
1394
+ "international",
1395
+ "interpret",
1396
+ "interpretation",
1397
+ "intervention",
1398
+ "interview",
1399
+ "into",
1400
+ "introduce",
1401
+ "introduction",
1402
+ "invest",
1403
+ "investigate",
1404
+ "investigation",
1405
+ "investigator",
1406
+ "investment",
1407
+ "investor",
1408
+ "invite",
1409
+ "involve",
1410
+ "involved",
1411
+ "involvement",
1412
+ "iron",
1413
+ "island",
1414
+ "issue",
1415
+ "item",
1416
+ "its",
1417
+ "itself",
1418
+ "jacket",
1419
+ "jet",
1420
+ "job",
1421
+ "join",
1422
+ "joint",
1423
+ "joke",
1424
+ "journal",
1425
+ "journalist",
1426
+ "journey",
1427
+ "joy",
1428
+ "judge",
1429
+ "judgment",
1430
+ "juice",
1431
+ "jump",
1432
+ "junior",
1433
+ "jury",
1434
+ "just",
1435
+ "justice",
1436
+ "justify",
1437
+ "keep",
1438
+ "key",
1439
+ "kick",
1440
+ "kid",
1441
+ "kind",
1442
+ "king",
1443
+ "kiss",
1444
+ "kitchen",
1445
+ "knee",
1446
+ "knife",
1447
+ "knock",
1448
+ "know",
1449
+ "knowledge",
1450
+ "lab",
1451
+ "label",
1452
+ "labor",
1453
+ "laboratory",
1454
+ "lady",
1455
+ "lake",
1456
+ "land",
1457
+ "landscape",
1458
+ "language",
1459
+ "lap",
1460
+ "large",
1461
+ "largely",
1462
+ "last",
1463
+ "late",
1464
+ "later",
1465
+ "latter",
1466
+ "laugh",
1467
+ "launch",
1468
+ "law",
1469
+ "lawn",
1470
+ "lawsuit",
1471
+ "lawyer",
1472
+ "lay",
1473
+ "layer",
1474
+ "lead",
1475
+ "leader",
1476
+ "leadership",
1477
+ "leading",
1478
+ "leaf",
1479
+ "league",
1480
+ "lean",
1481
+ "learn",
1482
+ "learning",
1483
+ "least",
1484
+ "leather",
1485
+ "leave",
1486
+ "left",
1487
+ "leg",
1488
+ "legacy",
1489
+ "legal",
1490
+ "legend",
1491
+ "legislation",
1492
+ "legitimate",
1493
+ "lemon",
1494
+ "length",
1495
+ "less",
1496
+ "lesson",
1497
+ "let",
1498
+ "letter",
1499
+ "level",
1500
+ "liberal",
1501
+ "library",
1502
+ "license",
1503
+ "lie",
1504
+ "life",
1505
+ "lifestyle",
1506
+ "lifetime",
1507
+ "lift",
1508
+ "light",
1509
+ "like",
1510
+ "likely",
1511
+ "limit",
1512
+ "limitation",
1513
+ "limited",
1514
+ "line",
1515
+ "link",
1516
+ "lip",
1517
+ "list",
1518
+ "listen",
1519
+ "literally",
1520
+ "literary",
1521
+ "literature",
1522
+ "little",
1523
+ "live",
1524
+ "living",
1525
+ "load",
1526
+ "loan",
1527
+ "local",
1528
+ "locate",
1529
+ "location",
1530
+ "lock",
1531
+ "long",
1532
+ "look",
1533
+ "loose",
1534
+ "lose",
1535
+ "lost",
1536
+ "lot",
1537
+ "lots",
1538
+ "loud",
1539
+ "love",
1540
+ "lovely",
1541
+ "lover",
1542
+ "low",
1543
+ "lower",
1544
+ "luck",
1545
+ "lucky",
1546
+ "lunch",
1547
+ "lung",
1548
+ "machine",
1549
+ "magazine",
1550
+ "mail",
1551
+ "main",
1552
+ "mainly",
1553
+ "maintain",
1554
+ "maintenance",
1555
+ "major",
1556
+ "majority",
1557
+ "make",
1558
+ "maker",
1559
+ "makeup",
1560
+ "male",
1561
+ "mall",
1562
+ "man",
1563
+ "manage",
1564
+ "management",
1565
+ "manager",
1566
+ "manner",
1567
+ "manufacturer",
1568
+ "manufacturing",
1569
+ "many",
1570
+ "map",
1571
+ "margin",
1572
+ "mark",
1573
+ "market",
1574
+ "marketing",
1575
+ "marriage",
1576
+ "married",
1577
+ "marry",
1578
+ "mask",
1579
+ "mass",
1580
+ "massive",
1581
+ "master",
1582
+ "match",
1583
+ "material",
1584
+ "math",
1585
+ "matter",
1586
+ "may",
1587
+ "maybe",
1588
+ "mayor",
1589
+ "meal",
1590
+ "mean",
1591
+ "meaning",
1592
+ "meanwhile",
1593
+ "measure",
1594
+ "measurement",
1595
+ "meat",
1596
+ "mechanism",
1597
+ "media",
1598
+ "medical",
1599
+ "medication",
1600
+ "medicine",
1601
+ "medium",
1602
+ "meet",
1603
+ "meeting",
1604
+ "member",
1605
+ "membership",
1606
+ "memory",
1607
+ "mental",
1608
+ "mention",
1609
+ "menu",
1610
+ "mere",
1611
+ "merely",
1612
+ "message",
1613
+ "metal",
1614
+ "meter",
1615
+ "method",
1616
+ "middle",
1617
+ "might",
1618
+ "military",
1619
+ "milk",
1620
+ "million",
1621
+ "mind",
1622
+ "mine",
1623
+ "minister",
1624
+ "minor",
1625
+ "minority",
1626
+ "minute",
1627
+ "miracle",
1628
+ "mirror",
1629
+ "miss",
1630
+ "missile",
1631
+ "mission",
1632
+ "mix",
1633
+ "mixture",
1634
+ "mode",
1635
+ "model",
1636
+ "moderate",
1637
+ "modern",
1638
+ "modest",
1639
+ "mom",
1640
+ "moment",
1641
+ "money",
1642
+ "monitor",
1643
+ "month",
1644
+ "mood",
1645
+ "moon",
1646
+ "moral",
1647
+ "more",
1648
+ "moreover",
1649
+ "morning",
1650
+ "mortgage",
1651
+ "most",
1652
+ "mostly",
1653
+ "mother",
1654
+ "motion",
1655
+ "motivation",
1656
+ "motor",
1657
+ "mount",
1658
+ "mountain",
1659
+ "mouse",
1660
+ "mouth",
1661
+ "move",
1662
+ "movement",
1663
+ "movie",
1664
+ "much",
1665
+ "multiple",
1666
+ "muscle",
1667
+ "museum",
1668
+ "music",
1669
+ "musical",
1670
+ "musician",
1671
+ "must",
1672
+ "mutual",
1673
+ "myself",
1674
+ "mystery",
1675
+ "myth",
1676
+ "naked",
1677
+ "name",
1678
+ "narrative",
1679
+ "narrow",
1680
+ "nation",
1681
+ "national",
1682
+ "native",
1683
+ "natural",
1684
+ "naturally",
1685
+ "nature",
1686
+ "near",
1687
+ "nearby",
1688
+ "nearly",
1689
+ "necessarily",
1690
+ "necessary",
1691
+ "neck",
1692
+ "need",
1693
+ "negative",
1694
+ "negotiate",
1695
+ "negotiation",
1696
+ "neighbor",
1697
+ "neighborhood",
1698
+ "neither",
1699
+ "nerve",
1700
+ "net",
1701
+ "network",
1702
+ "never",
1703
+ "nevertheless",
1704
+ "new",
1705
+ "newly",
1706
+ "news",
1707
+ "newspaper",
1708
+ "next",
1709
+ "nice",
1710
+ "night",
1711
+ "nine",
1712
+ "nobody",
1713
+ "nod",
1714
+ "nomination",
1715
+ "none",
1716
+ "nonetheless",
1717
+ "nor",
1718
+ "normal",
1719
+ "normally",
1720
+ "north",
1721
+ "northern",
1722
+ "nose",
1723
+ "not",
1724
+ "note",
1725
+ "nothing",
1726
+ "notice",
1727
+ "notion",
1728
+ "novel",
1729
+ "now",
1730
+ "nowhere",
1731
+ "nuclear",
1732
+ "number",
1733
+ "numerous",
1734
+ "nurse",
1735
+ "nut",
1736
+ "object",
1737
+ "objective",
1738
+ "obligation",
1739
+ "observation",
1740
+ "observe",
1741
+ "observer",
1742
+ "obtain",
1743
+ "obvious",
1744
+ "obviously",
1745
+ "occasion",
1746
+ "occasionally",
1747
+ "occupation",
1748
+ "occupy",
1749
+ "occur",
1750
+ "ocean",
1751
+ "odd",
1752
+ "odds",
1753
+ "off",
1754
+ "offer",
1755
+ "office",
1756
+ "officer",
1757
+ "official",
1758
+ "often",
1759
+ "oil",
1760
+ "okay",
1761
+ "old",
1762
+ "once",
1763
+ "one",
1764
+ "ongoing",
1765
+ "onion",
1766
+ "online",
1767
+ "only",
1768
+ "onto",
1769
+ "open",
1770
+ "opening",
1771
+ "operate",
1772
+ "operating",
1773
+ "operation",
1774
+ "operator",
1775
+ "opinion",
1776
+ "opponent",
1777
+ "opportunity",
1778
+ "oppose",
1779
+ "opposite",
1780
+ "opposition",
1781
+ "option",
1782
+ "orange",
1783
+ "order",
1784
+ "ordinary",
1785
+ "organic",
1786
+ "organization",
1787
+ "organize",
1788
+ "orientation",
1789
+ "origin",
1790
+ "original",
1791
+ "originally",
1792
+ "other",
1793
+ "others",
1794
+ "otherwise",
1795
+ "ought",
1796
+ "our",
1797
+ "ourselves",
1798
+ "out",
1799
+ "outcome",
1800
+ "outside",
1801
+ "oven",
1802
+ "over",
1803
+ "overall",
1804
+ "overcome",
1805
+ "overlook",
1806
+ "owe",
1807
+ "own",
1808
+ "owner",
1809
+ "pace",
1810
+ "pack",
1811
+ "package",
1812
+ "page",
1813
+ "paint",
1814
+ "painter",
1815
+ "painting",
1816
+ "pair",
1817
+ "pale",
1818
+ "palm",
1819
+ "pan",
1820
+ "panel",
1821
+ "pant",
1822
+ "paper",
1823
+ "parent",
1824
+ "park",
1825
+ "parking",
1826
+ "part",
1827
+ "participant",
1828
+ "participate",
1829
+ "participation",
1830
+ "particular",
1831
+ "particularly",
1832
+ "partly",
1833
+ "partner",
1834
+ "partnership",
1835
+ "party",
1836
+ "pass",
1837
+ "passage",
1838
+ "passenger",
1839
+ "passion",
1840
+ "past",
1841
+ "patch",
1842
+ "path",
1843
+ "patient",
1844
+ "pattern",
1845
+ "pause",
1846
+ "pay",
1847
+ "payment",
1848
+ "peace",
1849
+ "peak",
1850
+ "peer",
1851
+ "people",
1852
+ "pepper",
1853
+ "per",
1854
+ "perceive",
1855
+ "percentage",
1856
+ "perception",
1857
+ "perfect",
1858
+ "perfectly",
1859
+ "perform",
1860
+ "performance",
1861
+ "perhaps",
1862
+ "period",
1863
+ "permanent",
1864
+ "permission",
1865
+ "permit",
1866
+ "person",
1867
+ "personal",
1868
+ "personality",
1869
+ "personally",
1870
+ "personnel",
1871
+ "perspective",
1872
+ "persuade",
1873
+ "pet",
1874
+ "phase",
1875
+ "phenomenon",
1876
+ "philosophy",
1877
+ "phone",
1878
+ "photo",
1879
+ "photograph",
1880
+ "photographer",
1881
+ "phrase",
1882
+ "physical",
1883
+ "physically",
1884
+ "physician",
1885
+ "piano",
1886
+ "pick",
1887
+ "picture",
1888
+ "pie",
1889
+ "piece",
1890
+ "pile",
1891
+ "pilot",
1892
+ "pine",
1893
+ "pink",
1894
+ "pipe",
1895
+ "pitch",
1896
+ "place",
1897
+ "plan",
1898
+ "plane",
1899
+ "planet",
1900
+ "planning",
1901
+ "plant",
1902
+ "plastic",
1903
+ "plate",
1904
+ "platform",
1905
+ "play",
1906
+ "player",
1907
+ "please",
1908
+ "pleasure",
1909
+ "plenty",
1910
+ "plot",
1911
+ "plus",
1912
+ "pocket",
1913
+ "poem",
1914
+ "poet",
1915
+ "poetry",
1916
+ "point",
1917
+ "pole",
1918
+ "police",
1919
+ "policy",
1920
+ "political",
1921
+ "politically",
1922
+ "politician",
1923
+ "politics",
1924
+ "poll",
1925
+ "pool",
1926
+ "pop",
1927
+ "popular",
1928
+ "population",
1929
+ "porch",
1930
+ "port",
1931
+ "portion",
1932
+ "portrait",
1933
+ "portray",
1934
+ "pose",
1935
+ "position",
1936
+ "positive",
1937
+ "possess",
1938
+ "possibility",
1939
+ "possible",
1940
+ "possibly",
1941
+ "post",
1942
+ "pot",
1943
+ "potato",
1944
+ "potential",
1945
+ "potentially",
1946
+ "pound",
1947
+ "pour",
1948
+ "powder",
1949
+ "power",
1950
+ "powerful",
1951
+ "practical",
1952
+ "practice",
1953
+ "pray",
1954
+ "prayer",
1955
+ "precisely",
1956
+ "predict",
1957
+ "prefer",
1958
+ "preference",
1959
+ "pregnancy",
1960
+ "pregnant",
1961
+ "preparation",
1962
+ "prepare",
1963
+ "prescription",
1964
+ "presence",
1965
+ "present",
1966
+ "presentation",
1967
+ "preserve",
1968
+ "president",
1969
+ "presidential",
1970
+ "press",
1971
+ "pretend",
1972
+ "pretty",
1973
+ "prevent",
1974
+ "previous",
1975
+ "previously",
1976
+ "price",
1977
+ "pride",
1978
+ "priest",
1979
+ "primarily",
1980
+ "primary",
1981
+ "prime",
1982
+ "principal",
1983
+ "principle",
1984
+ "print",
1985
+ "prior",
1986
+ "priority",
1987
+ "privacy",
1988
+ "private",
1989
+ "probably",
1990
+ "procedure",
1991
+ "proceed",
1992
+ "process",
1993
+ "produce",
1994
+ "producer",
1995
+ "product",
1996
+ "production",
1997
+ "profession",
1998
+ "professional",
1999
+ "professor",
2000
+ "profile",
2001
+ "profit",
2002
+ "program",
2003
+ "progress",
2004
+ "project",
2005
+ "prominent",
2006
+ "promise",
2007
+ "promote",
2008
+ "prompt",
2009
+ "proof",
2010
+ "proper",
2011
+ "properly",
2012
+ "property",
2013
+ "proportion",
2014
+ "proposal",
2015
+ "propose",
2016
+ "proposed",
2017
+ "prosecutor",
2018
+ "prospect",
2019
+ "protect",
2020
+ "protection",
2021
+ "protein",
2022
+ "protest",
2023
+ "proud",
2024
+ "prove",
2025
+ "provide",
2026
+ "provider",
2027
+ "province",
2028
+ "provision",
2029
+ "psychological",
2030
+ "psychologist",
2031
+ "psychology",
2032
+ "public",
2033
+ "publication",
2034
+ "publicly",
2035
+ "publish",
2036
+ "publisher",
2037
+ "pull",
2038
+ "purchase",
2039
+ "pure",
2040
+ "purpose",
2041
+ "pursue",
2042
+ "push",
2043
+ "put",
2044
+ "qualify",
2045
+ "quality",
2046
+ "quarter",
2047
+ "quarterback",
2048
+ "question",
2049
+ "quick",
2050
+ "quickly",
2051
+ "quiet",
2052
+ "quietly",
2053
+ "quit",
2054
+ "quite",
2055
+ "quote",
2056
+ "race",
2057
+ "racial",
2058
+ "radical",
2059
+ "radio",
2060
+ "rail",
2061
+ "rain",
2062
+ "raise",
2063
+ "range",
2064
+ "rank",
2065
+ "rapid",
2066
+ "rapidly",
2067
+ "rare",
2068
+ "rarely",
2069
+ "rate",
2070
+ "rather",
2071
+ "rating",
2072
+ "ratio",
2073
+ "raw",
2074
+ "reach",
2075
+ "react",
2076
+ "reaction",
2077
+ "read",
2078
+ "reader",
2079
+ "reading",
2080
+ "ready",
2081
+ "real",
2082
+ "reality",
2083
+ "realize",
2084
+ "really",
2085
+ "reason",
2086
+ "reasonable",
2087
+ "recall",
2088
+ "receive",
2089
+ "recent",
2090
+ "recently",
2091
+ "recipe",
2092
+ "recognition",
2093
+ "recognize",
2094
+ "recommend",
2095
+ "recommendation",
2096
+ "record",
2097
+ "recording",
2098
+ "recover",
2099
+ "recovery",
2100
+ "recruit",
2101
+ "red",
2102
+ "reduce",
2103
+ "reduction",
2104
+ "refer",
2105
+ "reference",
2106
+ "reflect",
2107
+ "reflection",
2108
+ "reform",
2109
+ "refugee",
2110
+ "refuse",
2111
+ "regard",
2112
+ "regarding",
2113
+ "regardless",
2114
+ "regime",
2115
+ "region",
2116
+ "regional",
2117
+ "register",
2118
+ "regular",
2119
+ "regularly",
2120
+ "regulate",
2121
+ "regulation",
2122
+ "reinforce",
2123
+ "relate",
2124
+ "relation",
2125
+ "relationship",
2126
+ "relative",
2127
+ "relatively",
2128
+ "relax",
2129
+ "release",
2130
+ "relevant",
2131
+ "relief",
2132
+ "religion",
2133
+ "religious",
2134
+ "rely",
2135
+ "remain",
2136
+ "remaining",
2137
+ "remarkable",
2138
+ "remember",
2139
+ "remind",
2140
+ "remote",
2141
+ "remove",
2142
+ "repeat",
2143
+ "repeatedly",
2144
+ "replace",
2145
+ "reply",
2146
+ "report",
2147
+ "reporter",
2148
+ "represent",
2149
+ "representation",
2150
+ "representative",
2151
+ "reputation",
2152
+ "request",
2153
+ "require",
2154
+ "requirement",
2155
+ "research",
2156
+ "researcher",
2157
+ "resemble",
2158
+ "reservation",
2159
+ "resident",
2160
+ "resist",
2161
+ "resolution",
2162
+ "resolve",
2163
+ "resort",
2164
+ "resource",
2165
+ "respect",
2166
+ "respond",
2167
+ "respondent",
2168
+ "response",
2169
+ "responsibility",
2170
+ "responsible",
2171
+ "rest",
2172
+ "restaurant",
2173
+ "restore",
2174
+ "restriction",
2175
+ "result",
2176
+ "retain",
2177
+ "retire",
2178
+ "retirement",
2179
+ "return",
2180
+ "reveal",
2181
+ "revenue",
2182
+ "review",
2183
+ "revolution",
2184
+ "rhythm",
2185
+ "rice",
2186
+ "rich",
2187
+ "rid",
2188
+ "ride",
2189
+ "rifle",
2190
+ "right",
2191
+ "ring",
2192
+ "rise",
2193
+ "river",
2194
+ "road",
2195
+ "rock",
2196
+ "role",
2197
+ "roll",
2198
+ "romantic",
2199
+ "roof",
2200
+ "room",
2201
+ "root",
2202
+ "rope",
2203
+ "rose",
2204
+ "roughly",
2205
+ "round",
2206
+ "route",
2207
+ "routine",
2208
+ "row",
2209
+ "rub",
2210
+ "rule",
2211
+ "run",
2212
+ "running",
2213
+ "rural",
2214
+ "rush",
2215
+ "sacred",
2216
+ "safe",
2217
+ "safety",
2218
+ "sake",
2219
+ "salad",
2220
+ "salary",
2221
+ "sale",
2222
+ "sales",
2223
+ "salt",
2224
+ "same",
2225
+ "sample",
2226
+ "sanction",
2227
+ "sand",
2228
+ "satellite",
2229
+ "satisfaction",
2230
+ "satisfy",
2231
+ "sauce",
2232
+ "save",
2233
+ "saving",
2234
+ "say",
2235
+ "scale",
2236
+ "scenario",
2237
+ "scene",
2238
+ "schedule",
2239
+ "scheme",
2240
+ "scholar",
2241
+ "scholarship",
2242
+ "school",
2243
+ "science",
2244
+ "scientific",
2245
+ "scientist",
2246
+ "scope",
2247
+ "score",
2248
+ "screen",
2249
+ "script",
2250
+ "sea",
2251
+ "search",
2252
+ "season",
2253
+ "seat",
2254
+ "second",
2255
+ "secret",
2256
+ "secretary",
2257
+ "section",
2258
+ "sector",
2259
+ "secure",
2260
+ "security",
2261
+ "see",
2262
+ "seed",
2263
+ "seek",
2264
+ "seem",
2265
+ "segment",
2266
+ "seize",
2267
+ "select",
2268
+ "selection",
2269
+ "self",
2270
+ "sell",
2271
+ "senator",
2272
+ "send",
2273
+ "senior",
2274
+ "sense",
2275
+ "sensitive",
2276
+ "sentence",
2277
+ "separate",
2278
+ "sequence",
2279
+ "series",
2280
+ "serious",
2281
+ "seriously",
2282
+ "serve",
2283
+ "service",
2284
+ "session",
2285
+ "set",
2286
+ "setting",
2287
+ "settle",
2288
+ "settlement",
2289
+ "seven",
2290
+ "several",
2291
+ "shade",
2292
+ "shadow",
2293
+ "shake",
2294
+ "shall",
2295
+ "shape",
2296
+ "share",
2297
+ "sharp",
2298
+ "sheet",
2299
+ "shelf",
2300
+ "shell",
2301
+ "shelter",
2302
+ "shift",
2303
+ "shine",
2304
+ "ship",
2305
+ "shirt",
2306
+ "shoe",
2307
+ "shop",
2308
+ "shopping",
2309
+ "shore",
2310
+ "short",
2311
+ "shortly",
2312
+ "shot",
2313
+ "should",
2314
+ "shoulder",
2315
+ "shout",
2316
+ "show",
2317
+ "shower",
2318
+ "shrug",
2319
+ "shut",
2320
+ "side",
2321
+ "sigh",
2322
+ "sight",
2323
+ "sign",
2324
+ "signal",
2325
+ "significance",
2326
+ "significant",
2327
+ "significantly",
2328
+ "silence",
2329
+ "silent",
2330
+ "silver",
2331
+ "similar",
2332
+ "similarly",
2333
+ "simple",
2334
+ "simply",
2335
+ "since",
2336
+ "sing",
2337
+ "singer",
2338
+ "single",
2339
+ "sink",
2340
+ "sir",
2341
+ "sister",
2342
+ "sit",
2343
+ "site",
2344
+ "situation",
2345
+ "six",
2346
+ "size",
2347
+ "ski",
2348
+ "skill",
2349
+ "skin",
2350
+ "sky",
2351
+ "sleep",
2352
+ "slice",
2353
+ "slide",
2354
+ "slight",
2355
+ "slightly",
2356
+ "slip",
2357
+ "slow",
2358
+ "slowly",
2359
+ "small",
2360
+ "smart",
2361
+ "smell",
2362
+ "smile",
2363
+ "smooth",
2364
+ "snap",
2365
+ "snow",
2366
+ "soccer",
2367
+ "social",
2368
+ "society",
2369
+ "soft",
2370
+ "software",
2371
+ "soil",
2372
+ "solar",
2373
+ "solid",
2374
+ "solution",
2375
+ "solve",
2376
+ "some",
2377
+ "somebody",
2378
+ "somehow",
2379
+ "someone",
2380
+ "something",
2381
+ "sometimes",
2382
+ "somewhat",
2383
+ "somewhere",
2384
+ "son",
2385
+ "song",
2386
+ "soon",
2387
+ "sophisticated",
2388
+ "sorry",
2389
+ "sort",
2390
+ "soul",
2391
+ "sound",
2392
+ "soup",
2393
+ "source",
2394
+ "south",
2395
+ "southern",
2396
+ "space",
2397
+ "speak",
2398
+ "speaker",
2399
+ "special",
2400
+ "specialist",
2401
+ "species",
2402
+ "specific",
2403
+ "specifically",
2404
+ "speech",
2405
+ "speed",
2406
+ "spend",
2407
+ "spending",
2408
+ "spin",
2409
+ "spirit",
2410
+ "spiritual",
2411
+ "split",
2412
+ "spokesman",
2413
+ "sport",
2414
+ "spot",
2415
+ "spread",
2416
+ "spring",
2417
+ "square",
2418
+ "squeeze",
2419
+ "stability",
2420
+ "stable",
2421
+ "staff",
2422
+ "stage",
2423
+ "stair",
2424
+ "stake",
2425
+ "stand",
2426
+ "standard",
2427
+ "standing",
2428
+ "star",
2429
+ "stare",
2430
+ "start",
2431
+ "state",
2432
+ "statement",
2433
+ "station",
2434
+ "statistics",
2435
+ "status",
2436
+ "stay",
2437
+ "steady",
2438
+ "steal",
2439
+ "steel",
2440
+ "step",
2441
+ "stick",
2442
+ "still",
2443
+ "stir",
2444
+ "stock",
2445
+ "stomach",
2446
+ "stone",
2447
+ "stop",
2448
+ "storage",
2449
+ "store",
2450
+ "storm",
2451
+ "story",
2452
+ "straight",
2453
+ "strange",
2454
+ "stranger",
2455
+ "strategic",
2456
+ "strategy",
2457
+ "stream",
2458
+ "street",
2459
+ "strength",
2460
+ "strengthen",
2461
+ "stretch",
2462
+ "string",
2463
+ "strip",
2464
+ "strong",
2465
+ "strongly",
2466
+ "structure",
2467
+ "student",
2468
+ "studio",
2469
+ "study",
2470
+ "stuff",
2471
+ "style",
2472
+ "subject",
2473
+ "submit",
2474
+ "subsequent",
2475
+ "substance",
2476
+ "substantial",
2477
+ "succeed",
2478
+ "success",
2479
+ "successful",
2480
+ "successfully",
2481
+ "such",
2482
+ "sudden",
2483
+ "suddenly",
2484
+ "sue",
2485
+ "sufficient",
2486
+ "sugar",
2487
+ "suggest",
2488
+ "suggestion",
2489
+ "suit",
2490
+ "summer",
2491
+ "summit",
2492
+ "sun",
2493
+ "super",
2494
+ "supply",
2495
+ "support",
2496
+ "supporter",
2497
+ "suppose",
2498
+ "supposed",
2499
+ "sure",
2500
+ "surely",
2501
+ "surface",
2502
+ "surgery",
2503
+ "surprise",
2504
+ "surprised",
2505
+ "surprising",
2506
+ "surprisingly",
2507
+ "surround",
2508
+ "survey",
2509
+ "survival",
2510
+ "survive",
2511
+ "survivor",
2512
+ "sustain",
2513
+ "swear",
2514
+ "sweep",
2515
+ "sweet",
2516
+ "swim",
2517
+ "swing",
2518
+ "switch",
2519
+ "symbol",
2520
+ "system",
2521
+ "table",
2522
+ "tablespoon",
2523
+ "tactic",
2524
+ "tail",
2525
+ "take",
2526
+ "tale",
2527
+ "talent",
2528
+ "talk",
2529
+ "tall",
2530
+ "tank",
2531
+ "tap",
2532
+ "tape",
2533
+ "target",
2534
+ "task",
2535
+ "taste",
2536
+ "tax",
2537
+ "taxpayer",
2538
+ "tea",
2539
+ "teach",
2540
+ "teacher",
2541
+ "teaching",
2542
+ "team",
2543
+ "tear",
2544
+ "teaspoon",
2545
+ "technical",
2546
+ "technique",
2547
+ "technology",
2548
+ "teen",
2549
+ "teenager",
2550
+ "telephone",
2551
+ "telescope",
2552
+ "television",
2553
+ "tell",
2554
+ "temperature",
2555
+ "temporary",
2556
+ "ten",
2557
+ "tend",
2558
+ "tendency",
2559
+ "tennis",
2560
+ "tent",
2561
+ "term",
2562
+ "terms",
2563
+ "territory",
2564
+ "test",
2565
+ "testify",
2566
+ "testimony",
2567
+ "testing",
2568
+ "text",
2569
+ "than",
2570
+ "thank",
2571
+ "thanks",
2572
+ "that",
2573
+ "the",
2574
+ "theater",
2575
+ "their",
2576
+ "them",
2577
+ "theme",
2578
+ "themselves",
2579
+ "then",
2580
+ "theory",
2581
+ "therapy",
2582
+ "there",
2583
+ "therefore",
2584
+ "thick",
2585
+ "thin",
2586
+ "thing",
2587
+ "think",
2588
+ "thinking",
2589
+ "third",
2590
+ "thirty",
2591
+ "though",
2592
+ "thought",
2593
+ "thousand",
2594
+ "three",
2595
+ "throat",
2596
+ "through",
2597
+ "throughout",
2598
+ "throw",
2599
+ "ticket",
2600
+ "tie",
2601
+ "tight",
2602
+ "time",
2603
+ "tiny",
2604
+ "tip",
2605
+ "tire",
2606
+ "tired",
2607
+ "tissue",
2608
+ "title",
2609
+ "today",
2610
+ "toe",
2611
+ "together",
2612
+ "tomato",
2613
+ "tomorrow",
2614
+ "tone",
2615
+ "tongue",
2616
+ "tonight",
2617
+ "too",
2618
+ "tool",
2619
+ "tooth",
2620
+ "top",
2621
+ "topic",
2622
+ "toss",
2623
+ "total",
2624
+ "totally",
2625
+ "touch",
2626
+ "tough",
2627
+ "tour",
2628
+ "tourist",
2629
+ "tournament",
2630
+ "tower",
2631
+ "town",
2632
+ "toy",
2633
+ "trace",
2634
+ "track",
2635
+ "trade",
2636
+ "tradition",
2637
+ "traditional",
2638
+ "traffic",
2639
+ "trail",
2640
+ "train",
2641
+ "training",
2642
+ "transfer",
2643
+ "transform",
2644
+ "transformation",
2645
+ "transition",
2646
+ "translate",
2647
+ "transportation",
2648
+ "travel",
2649
+ "treat",
2650
+ "treatment",
2651
+ "treaty",
2652
+ "tree",
2653
+ "tremendous",
2654
+ "trend",
2655
+ "trial",
2656
+ "tribe",
2657
+ "trip",
2658
+ "troop",
2659
+ "truck",
2660
+ "true",
2661
+ "truly",
2662
+ "trust",
2663
+ "truth",
2664
+ "try",
2665
+ "tube",
2666
+ "tunnel",
2667
+ "turn",
2668
+ "twelve",
2669
+ "twenty",
2670
+ "twice",
2671
+ "twin",
2672
+ "two",
2673
+ "type",
2674
+ "typical",
2675
+ "typically",
2676
+ "ultimate",
2677
+ "ultimately",
2678
+ "unable",
2679
+ "uncle",
2680
+ "under",
2681
+ "undergo",
2682
+ "understand",
2683
+ "understanding",
2684
+ "unfortunately",
2685
+ "uniform",
2686
+ "union",
2687
+ "unique",
2688
+ "unit",
2689
+ "universal",
2690
+ "universe",
2691
+ "university",
2692
+ "unknown",
2693
+ "unless",
2694
+ "unlike",
2695
+ "unlikely",
2696
+ "until",
2697
+ "unusual",
2698
+ "upon",
2699
+ "upper",
2700
+ "urban",
2701
+ "urge",
2702
+ "use",
2703
+ "used",
2704
+ "useful",
2705
+ "user",
2706
+ "usual",
2707
+ "usually",
2708
+ "utility",
2709
+ "vacation",
2710
+ "valley",
2711
+ "valuable",
2712
+ "value",
2713
+ "variable",
2714
+ "variation",
2715
+ "variety",
2716
+ "various",
2717
+ "vary",
2718
+ "vast",
2719
+ "vegetable",
2720
+ "vehicle",
2721
+ "venture",
2722
+ "version",
2723
+ "versus",
2724
+ "very",
2725
+ "vessel",
2726
+ "veteran",
2727
+ "via",
2728
+ "victory",
2729
+ "video",
2730
+ "view",
2731
+ "viewer",
2732
+ "village",
2733
+ "virtually",
2734
+ "virtue",
2735
+ "visible",
2736
+ "vision",
2737
+ "visit",
2738
+ "visitor",
2739
+ "visual",
2740
+ "vital",
2741
+ "voice",
2742
+ "volume",
2743
+ "volunteer",
2744
+ "vote",
2745
+ "voter",
2746
+ "wage",
2747
+ "wait",
2748
+ "wake",
2749
+ "walk",
2750
+ "wall",
2751
+ "wander",
2752
+ "want",
2753
+ "warm",
2754
+ "warn",
2755
+ "warning",
2756
+ "wash",
2757
+ "watch",
2758
+ "water",
2759
+ "wave",
2760
+ "way",
2761
+ "wealth",
2762
+ "wealthy",
2763
+ "wear",
2764
+ "weather",
2765
+ "wedding",
2766
+ "week",
2767
+ "weekend",
2768
+ "weekly",
2769
+ "weigh",
2770
+ "weight",
2771
+ "welcome",
2772
+ "welfare",
2773
+ "well",
2774
+ "west",
2775
+ "western",
2776
+ "wet",
2777
+ "what",
2778
+ "whatever",
2779
+ "wheel",
2780
+ "when",
2781
+ "whenever",
2782
+ "where",
2783
+ "whereas",
2784
+ "whether",
2785
+ "which",
2786
+ "while",
2787
+ "whisper",
2788
+ "white",
2789
+ "who",
2790
+ "whole",
2791
+ "whom",
2792
+ "whose",
2793
+ "why",
2794
+ "wide",
2795
+ "widely",
2796
+ "widespread",
2797
+ "wife",
2798
+ "wild",
2799
+ "will",
2800
+ "willing",
2801
+ "win",
2802
+ "wind",
2803
+ "window",
2804
+ "wine",
2805
+ "wing",
2806
+ "winner",
2807
+ "winter",
2808
+ "wipe",
2809
+ "wire",
2810
+ "wisdom",
2811
+ "wise",
2812
+ "wish",
2813
+ "with",
2814
+ "withdraw",
2815
+ "within",
2816
+ "without",
2817
+ "witness",
2818
+ "woman",
2819
+ "wonder",
2820
+ "wonderful",
2821
+ "wood",
2822
+ "wooden",
2823
+ "word",
2824
+ "work",
2825
+ "worker",
2826
+ "working",
2827
+ "works",
2828
+ "workshop",
2829
+ "world",
2830
+ "worried",
2831
+ "worth",
2832
+ "would",
2833
+ "wrap",
2834
+ "write",
2835
+ "writer",
2836
+ "writing",
2837
+ "yard",
2838
+ "yeah",
2839
+ "year",
2840
+ "yell",
2841
+ "yellow",
2842
+ "yes",
2843
+ "yesterday",
2844
+ "yield",
2845
+ "young",
2846
+ "your",
2847
+ "yours",
2848
+ "yourself",
2849
+ "youth",
2850
+ "zone"
2851
+ ];
2852
+ const random = (min, max) => Math.floor(min + Math.random() * (max - min + 1));
2853
+ function getRandomWord() {
2854
+ return words[random(0, words.length - 1)];
2855
+ }
2856
+
2857
+ const randomName = () => `${getRandomWord()}-${getRandomWord()}`;
2858
+
2859
+ var builtinModules;
2860
+ var hasRequiredBuiltinModules;
2861
+
2862
+ function requireBuiltinModules () {
2863
+ if (hasRequiredBuiltinModules) return builtinModules;
2864
+ hasRequiredBuiltinModules = 1;
2865
+ builtinModules = [
2866
+ "_http_agent",
2867
+ "_http_client",
2868
+ "_http_common",
2869
+ "_http_incoming",
2870
+ "_http_outgoing",
2871
+ "_http_server",
2872
+ "_stream_duplex",
2873
+ "_stream_passthrough",
2874
+ "_stream_readable",
2875
+ "_stream_transform",
2876
+ "_stream_wrap",
2877
+ "_stream_writable",
2878
+ "_tls_common",
2879
+ "_tls_wrap",
2880
+ "assert",
2881
+ "assert/strict",
2882
+ "async_hooks",
2883
+ "buffer",
2884
+ "child_process",
2885
+ "cluster",
2886
+ "console",
2887
+ "constants",
2888
+ "crypto",
2889
+ "dgram",
2890
+ "diagnostics_channel",
2891
+ "dns",
2892
+ "dns/promises",
2893
+ "domain",
2894
+ "events",
2895
+ "fs",
2896
+ "fs/promises",
2897
+ "http",
2898
+ "http2",
2899
+ "https",
2900
+ "inspector",
2901
+ "inspector/promises",
2902
+ "module",
2903
+ "net",
2904
+ "os",
2905
+ "path",
2906
+ "path/posix",
2907
+ "path/win32",
2908
+ "perf_hooks",
2909
+ "process",
2910
+ "punycode",
2911
+ "querystring",
2912
+ "readline",
2913
+ "readline/promises",
2914
+ "repl",
2915
+ "stream",
2916
+ "stream/consumers",
2917
+ "stream/promises",
2918
+ "stream/web",
2919
+ "string_decoder",
2920
+ "sys",
2921
+ "timers",
2922
+ "timers/promises",
2923
+ "tls",
2924
+ "trace_events",
2925
+ "tty",
2926
+ "url",
2927
+ "util",
2928
+ "util/types",
2929
+ "v8",
2930
+ "vm",
2931
+ "wasi",
2932
+ "worker_threads",
2933
+ "zlib",
2934
+ "node:sea",
2935
+ "node:sqlite",
2936
+ "node:test",
2937
+ "node:test/reporters"
2938
+ ];
2939
+ return builtinModules;
2940
+ }
2941
+
2942
+ var lib;
2943
+ var hasRequiredLib;
2944
+
2945
+ function requireLib () {
2946
+ if (hasRequiredLib) return lib;
2947
+ hasRequiredLib = 1;
2948
+ const builtins = requireBuiltinModules();
2949
+ var scopedPackagePattern = new RegExp("^(?:@([^/]+?)[/])?([^/]+?)$");
2950
+ var exclusionList = [
2951
+ "node_modules",
2952
+ "favicon.ico"
2953
+ ];
2954
+ function validate(name) {
2955
+ var warnings = [];
2956
+ var errors = [];
2957
+ if (name === null) {
2958
+ errors.push("name cannot be null");
2959
+ return done(warnings, errors);
2960
+ }
2961
+ if (name === void 0) {
2962
+ errors.push("name cannot be undefined");
2963
+ return done(warnings, errors);
2964
+ }
2965
+ if (typeof name !== "string") {
2966
+ errors.push("name must be a string");
2967
+ return done(warnings, errors);
2968
+ }
2969
+ if (!name.length) {
2970
+ errors.push("name length must be greater than zero");
2971
+ }
2972
+ if (name.startsWith(".")) {
2973
+ errors.push("name cannot start with a period");
2974
+ }
2975
+ if (name.startsWith("-")) {
2976
+ errors.push("name cannot start with a hyphen");
2977
+ }
2978
+ if (name.match(/^_/)) {
2979
+ errors.push("name cannot start with an underscore");
2980
+ }
2981
+ if (name.trim() !== name) {
2982
+ errors.push("name cannot contain leading or trailing spaces");
2983
+ }
2984
+ exclusionList.forEach(function(excludedName) {
2985
+ if (name.toLowerCase() === excludedName) {
2986
+ errors.push(excludedName + " is not a valid package name");
2987
+ }
2988
+ });
2989
+ if (builtins.includes(name.toLowerCase())) {
2990
+ warnings.push(name + " is a core module name");
2991
+ }
2992
+ if (name.length > 214) {
2993
+ warnings.push("name can no longer contain more than 214 characters");
2994
+ }
2995
+ if (name.toLowerCase() !== name) {
2996
+ warnings.push("name can no longer contain capital letters");
2997
+ }
2998
+ if (/[~'!()*]/.test(name.split("/").slice(-1)[0])) {
2999
+ warnings.push(`name can no longer contain special characters ("~'!()*")`);
3000
+ }
3001
+ if (encodeURIComponent(name) !== name) {
3002
+ var nameMatch = name.match(scopedPackagePattern);
3003
+ if (nameMatch) {
3004
+ var user = nameMatch[1];
3005
+ var pkg = nameMatch[2];
3006
+ if (pkg.startsWith(".")) {
3007
+ errors.push("name cannot start with a period");
3008
+ }
3009
+ if (encodeURIComponent(user) === user && encodeURIComponent(pkg) === pkg) {
3010
+ return done(warnings, errors);
3011
+ }
3012
+ }
3013
+ errors.push("name can only contain URL-friendly characters");
3014
+ }
3015
+ return done(warnings, errors);
3016
+ }
3017
+ var done = function(warnings, errors) {
3018
+ var result = {
3019
+ validForNewPackages: errors.length === 0 && warnings.length === 0,
3020
+ validForOldPackages: errors.length === 0,
3021
+ warnings,
3022
+ errors
3023
+ };
3024
+ if (!result.warnings.length) {
3025
+ delete result.warnings;
3026
+ }
3027
+ if (!result.errors.length) {
3028
+ delete result.errors;
3029
+ }
3030
+ return result;
3031
+ };
3032
+ lib = validate;
3033
+ return lib;
3034
+ }
3035
+
3036
+ var libExports = requireLib();
3037
+ const validate = /*@__PURE__*/getDefaultExportFromCjs(libExports);
3038
+
3039
+ const isValidPackageName = (name) => {
3040
+ if (!name) {
3041
+ return false;
3042
+ }
3043
+ const result = validate(name);
3044
+ return result.validForNewPackages;
3045
+ };
3046
+ const toValidPackageName = (raw) => raw.toLowerCase().trim().replaceAll(/\s+/g, "-").replaceAll(/[^a-z\d\-~]/g, "-").replace(/^[._-]+/, "").replaceAll(/-{2,}/g, "-").replace(/-$/, "");
3047
+ const IGNORED_FILES = /* @__PURE__ */ new Set([".DS_Store", ".git", ".gitkeep", "Thumbs.db"]);
3048
+ const isEmptyDir = (dir) => {
3049
+ if (!isAccessibleSync(dir)) {
3050
+ return true;
3051
+ }
3052
+ const entries = readdirSync(dir);
3053
+ return entries.every((entry) => IGNORED_FILES.has(entry));
3054
+ };
3055
+ const resolveTargetDir = (projectName, cwd) => {
3056
+ const targetDir = resolve(cwd, projectName);
3057
+ const packageName = toValidPackageName(basename(targetDir));
3058
+ return { packageName, targetDir };
3059
+ };
3060
+ const canSafelyOverwrite = (dir) => isEmptyDir(dir);
3061
+
3062
+ const ask = (rl, question) => new Promise((resolve2) => {
3063
+ rl.question(question, (answer) => {
3064
+ resolve2(answer.trim());
3065
+ });
3066
+ });
3067
+ const confirm = async (rl, question, defaultYes = true) => {
3068
+ const hint = defaultYes ? "[Y/n]" : "[y/N]";
3069
+ const answer = await ask(rl, ` ${question} ${dim(hint)} `);
3070
+ if (answer === "") {
3071
+ return defaultYes;
3072
+ }
3073
+ return answer.toLowerCase() === "y" || answer.toLowerCase() === "yes";
3074
+ };
3075
+ const select = async (rl, question, choices) => {
3076
+ process.stderr.write(` ${question}
3077
+ `);
3078
+ for (const [index, choice] of choices.entries()) {
3079
+ const number_ = bold(cyan(` ${String(index + 1)}.`));
3080
+ const hint = choice.hint ? dim(` — ${choice.hint}`) : "";
3081
+ process.stderr.write(`${number_} ${choice.label}${hint}
3082
+ `);
3083
+ }
3084
+ while (true) {
3085
+ const answer = await ask(rl, `
3086
+ ${dim(`Enter choice (1-${String(choices.length)}):`)} `);
3087
+ const number_ = Number.parseInt(answer, 10);
3088
+ if (number_ >= 1 && number_ <= choices.length) {
3089
+ return choices[number_ - 1].value;
3090
+ }
3091
+ const match = choices.find((c) => c.value === answer || c.label.toLowerCase() === answer.toLowerCase());
3092
+ if (match) {
3093
+ return match.value;
3094
+ }
3095
+ process.stderr.write(` ${dim("Invalid choice. Try again.")}
3096
+ `);
3097
+ }
3098
+ };
3099
+ const runInteractivePrompts = async (options) => {
3100
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
3101
+ try {
3102
+ process.stderr.write(`
3103
+ ${bold(cyan("vis create"))} ${dim("— project scaffolding")}
3104
+
3105
+ `);
3106
+ const templateChoices = options.inMonorepo ? [
3107
+ { hint: "Scaffold via create-vite", label: "Vis Application", value: "vis:app" },
3108
+ { hint: "Reusable package scaffold", label: "Vis Library", value: "vis:library" },
3109
+ { hint: "Code generator scaffold", label: "Vis Generator", value: "vis:generator" },
3110
+ { hint: "Enter an npm create-* package or GitHub URL", label: "Custom template", value: "__custom__" }
3111
+ ] : [
3112
+ { hint: "Full workspace setup", label: "Vis Monorepo", value: "vis:monorepo" },
3113
+ { hint: "Scaffold via create-vite", label: "Vis Application", value: "vis:app" },
3114
+ { hint: "Reusable package scaffold", label: "Vis Library", value: "vis:library" },
3115
+ { hint: "Code generator scaffold", label: "Vis Generator", value: "vis:generator" },
3116
+ { hint: "Enter an npm create-* package or GitHub URL", label: "Custom template", value: "__custom__" }
3117
+ ];
3118
+ let template = await select(rl, "Select a template:", templateChoices);
3119
+ if (template === "__custom__") {
3120
+ template = await ask(rl, `
3121
+ ${dim("Template (npm package or GitHub URL):")} `);
3122
+ if (!template) {
3123
+ throw new Error("No template specified.");
3124
+ }
3125
+ }
3126
+ const suggestion = randomName();
3127
+ const nameAnswer = await ask(rl, `
3128
+ ${dim(`Project name (${suggestion}):`)} `);
3129
+ const projectName = nameAnswer || suggestion;
3130
+ if (!isValidPackageName(toValidPackageName(projectName))) {
3131
+ throw new Error(`Invalid project name: "${projectName}". Must be a valid npm package name.`);
3132
+ }
3133
+ const defaultDir = toValidPackageName(projectName);
3134
+ const dirAnswer = await ask(rl, ` ${dim(`Target directory (${defaultDir}):`)} `);
3135
+ const targetDir = dirAnswer || defaultDir;
3136
+ let overwrite = false;
3137
+ const fullPath = resolve(options.cwd, targetDir);
3138
+ if (!isEmptyDir(fullPath)) {
3139
+ overwrite = await confirm(rl, `Directory "${targetDir}" is not empty. Overwrite?`, false);
3140
+ if (!overwrite) {
3141
+ throw new Error("Aborted — directory not empty.");
3142
+ }
3143
+ }
3144
+ let pm;
3145
+ if (!options.inMonorepo) {
3146
+ if (options.defaultPm) {
3147
+ pm = options.defaultPm;
3148
+ process.stderr.write(` ${dim(`Package manager: ${pm} (from config)`)}
3149
+ `);
3150
+ } else {
3151
+ const pmChoice = await select(rl, "Package manager:", [
3152
+ { label: "pnpm", value: "pnpm" },
3153
+ { label: "npm", value: "npm" },
3154
+ { label: "yarn", value: "yarn" },
3155
+ { label: "bun", value: "bun" }
3156
+ ]);
3157
+ pm = pmChoice;
3158
+ }
3159
+ }
3160
+ let gitInit = false;
3161
+ if (!options.inMonorepo) {
3162
+ gitInit = await confirm(rl, "Initialize a git repository?", options.defaultGitInit ?? false);
3163
+ }
3164
+ const editorDefault = options.defaultEditor === "vscode";
3165
+ const editor = await confirm(rl, "Generate VS Code configuration?", editorDefault) ? "vscode" : void 0;
3166
+ process.stderr.write("\n");
3167
+ return { editor, gitInit, overwrite, pm, projectName, targetDir, template };
3168
+ } finally {
3169
+ rl.close();
3170
+ }
3171
+ };
3172
+
3173
+ const executeApp = (config, context) => {
3174
+ pail.info("Scaffolding application via create-vite...");
3175
+ const relativeTarget = relative(context.cwd, context.targetDir) || ".";
3176
+ const args = [relativeTarget, ...config.args];
3177
+ if (!args.includes("--no-immediate")) {
3178
+ args.push("--no-immediate");
3179
+ }
3180
+ return runDlx(
3181
+ context.pm,
3182
+ {
3183
+ additionalPackages: [],
3184
+ args,
3185
+ package: "create-vite",
3186
+ shellMode: false,
3187
+ silent: false
3188
+ },
3189
+ context.cwd,
3190
+ context.logger
3191
+ );
3192
+ };
3193
+ const libraryPackageJson = (name) => `${JSON.stringify(
3194
+ {
3195
+ devDependencies: {
3196
+ typescript: "^5.0.0",
3197
+ vitest: "^3.0.0"
3198
+ },
3199
+ exports: {
3200
+ ".": {
3201
+ default: "./dist/index.js",
3202
+ types: "./dist/index.d.ts"
3203
+ }
3204
+ },
3205
+ files: ["dist"],
3206
+ main: "./dist/index.js",
3207
+ name,
3208
+ scripts: {
3209
+ build: "tsc",
3210
+ dev: "tsc --watch",
3211
+ test: "vitest run",
3212
+ "test:watch": "vitest"
3213
+ },
3214
+ type: "module",
3215
+ types: "./dist/index.d.ts",
3216
+ version: "0.0.1"
3217
+ },
3218
+ null,
3219
+ 4
3220
+ )}
3221
+ `;
3222
+ const libraryTsconfig = () => `${JSON.stringify(
3223
+ {
3224
+ compilerOptions: {
3225
+ declaration: true,
3226
+ declarationMap: true,
3227
+ esModuleInterop: true,
3228
+ module: "Node16",
3229
+ moduleResolution: "Node16",
3230
+ outDir: "./dist",
3231
+ rootDir: "./src",
3232
+ skipLibCheck: true,
3233
+ sourceMap: true,
3234
+ strict: true,
3235
+ target: "ES2022"
3236
+ },
3237
+ include: ["src/**/*"]
3238
+ },
3239
+ null,
3240
+ 4
3241
+ )}
3242
+ `;
3243
+ const librarySrcIndex = (name) => `/**
3244
+ * ${name} — library entry point.
3245
+ */
3246
+
3247
+ export const greet = (name: string): string => \`Hello from ${name}, \${name}!\`;
3248
+ `;
3249
+ const libraryTestIndex = (name) => `import { describe, expect, it } from "vitest";
3250
+
3251
+ import { greet } from "../src/index";
3252
+
3253
+ describe("${name}", () => {
3254
+ it("should greet", () => {
3255
+ expect(greet("world")).toBe("Hello from ${name}, world!");
3256
+ });
3257
+ });
3258
+ `;
3259
+ const executeLibrary = (_config, context) => {
3260
+ const { projectName, targetDir } = context;
3261
+ pail.info("Scaffolding library package...");
3262
+ ensureDirSync(targetDir);
3263
+ ensureDirSync(join(targetDir, "src"));
3264
+ ensureDirSync(join(targetDir, "__tests__"));
3265
+ writeFileSync(join(targetDir, "package.json"), libraryPackageJson(projectName));
3266
+ pail.success("Created package.json");
3267
+ writeFileSync(join(targetDir, "tsconfig.json"), libraryTsconfig());
3268
+ pail.success("Created tsconfig.json");
3269
+ writeFileSync(join(targetDir, "src", "index.ts"), librarySrcIndex(projectName));
3270
+ pail.success("Created src/index.ts");
3271
+ writeFileSync(join(targetDir, "__tests__", "index.test.ts"), libraryTestIndex(projectName));
3272
+ pail.success("Created __tests__/index.test.ts");
3273
+ writeFileSync(join(targetDir, ".gitignore"), "node_modules/\ndist/\n.env\n.DS_Store\n");
3274
+ pail.success("Created .gitignore");
3275
+ return 0;
3276
+ };
3277
+ const executeBuiltin = (config, context) => {
3278
+ switch (config.type) {
3279
+ case "builtin:app": {
3280
+ return executeApp(config, context);
3281
+ }
3282
+ case "builtin:library": {
3283
+ return executeLibrary(config, context);
3284
+ }
3285
+ default: {
3286
+ throw new Error(`Unknown built-in template type: ${config.type}`);
3287
+ }
3288
+ }
3289
+ };
3290
+
3291
+ const packageJson = (name, description) => `${JSON.stringify(
3292
+ {
3293
+ bin: {
3294
+ [name]: "./bin/index.js"
3295
+ },
3296
+ description,
3297
+ devDependencies: {
3298
+ typescript: "^5.0.0"
3299
+ },
3300
+ name,
3301
+ private: true,
3302
+ scripts: {
3303
+ build: "tsc",
3304
+ dev: "tsc --watch"
3305
+ },
3306
+ type: "module",
3307
+ version: "0.0.1"
3308
+ },
3309
+ null,
3310
+ 4
3311
+ )}
3312
+ `;
3313
+ const binIndex = (name) => `#!/usr/bin/env node
3314
+
3315
+ /**
3316
+ * ${name} — code generator
3317
+ *
3318
+ * Usage: npx ${name} [options]
3319
+ */
3320
+
3321
+ console.log("Hello from ${name}!");
3322
+ `;
3323
+ const tsconfigJson = () => `${JSON.stringify(
3324
+ {
3325
+ compilerOptions: {
3326
+ declaration: true,
3327
+ esModuleInterop: true,
3328
+ module: "Node16",
3329
+ moduleResolution: "Node16",
3330
+ outDir: "./dist",
3331
+ rootDir: "./src",
3332
+ skipLibCheck: true,
3333
+ strict: true,
3334
+ target: "ES2022"
3335
+ },
3336
+ include: ["src/**/*", "bin/**/*"]
3337
+ },
3338
+ null,
3339
+ 4
3340
+ )}
3341
+ `;
3342
+ const srcIndex = () => `/**
3343
+ * Generator core logic — export functions used by the CLI entry point.
3344
+ */
3345
+
3346
+ export const generate = (): void => {
3347
+ // TODO: Implement your generator logic here
3348
+ };
3349
+ `;
3350
+ const executeGeneratorTemplate = (context, description = "") => {
3351
+ const { projectName, targetDir } = context;
3352
+ pail.info("Scaffolding code generator...");
3353
+ ensureDirSync(targetDir);
3354
+ ensureDirSync(join(targetDir, "bin"));
3355
+ ensureDirSync(join(targetDir, "src"));
3356
+ writeFileSync(join(targetDir, "package.json"), packageJson(projectName, description || `Code generator: ${projectName}`));
3357
+ pail.success("Created package.json");
3358
+ const binPath = join(targetDir, "bin", "index.js");
3359
+ writeFileSync(binPath, binIndex(projectName));
3360
+ chmodSync(binPath, 493);
3361
+ pail.success("Created bin/index.js (executable)");
3362
+ writeFileSync(join(targetDir, "tsconfig.json"), tsconfigJson());
3363
+ pail.success("Created tsconfig.json");
3364
+ writeFileSync(join(targetDir, "src", "index.ts"), srcIndex());
3365
+ pail.success("Created src/index.ts");
3366
+ return 0;
3367
+ };
3368
+
3369
+ const rootPackageJson = (name) => `${JSON.stringify(
3370
+ {
3371
+ devDependencies: {
3372
+ "@visulima/vis": "latest"
3373
+ },
3374
+ name,
3375
+ packageManager: "pnpm@latest",
3376
+ private: true,
3377
+ scripts: {
3378
+ build: "vis run build",
3379
+ dev: "vis run dev",
3380
+ lint: "vis run lint",
3381
+ test: "vis run test"
3382
+ },
3383
+ type: "module",
3384
+ version: "0.0.0"
3385
+ },
3386
+ null,
3387
+ 4
3388
+ )}
3389
+ `;
3390
+ const pnpmWorkspaceYaml = () => `packages:
3391
+ - "apps/*"
3392
+ - "packages/*"
3393
+ `;
3394
+ const gitignore = () => `# Dependencies
3395
+ node_modules/
3396
+
3397
+ # Build output
3398
+ dist/
3399
+ .output/
3400
+
3401
+ # Environment
3402
+ .env
3403
+ .env.local
3404
+ .env.*.local
3405
+
3406
+ # IDE
3407
+ .vscode/*
3408
+ !.vscode/settings.json
3409
+ !.vscode/extensions.json
3410
+ .idea/
3411
+
3412
+ # OS
3413
+ .DS_Store
3414
+ Thumbs.db
3415
+
3416
+ # Logs
3417
+ *.log
3418
+ npm-debug.log*
3419
+ pnpm-debug.log*
3420
+
3421
+ # Cache
3422
+ .turbo/
3423
+ .cache/
3424
+ `;
3425
+ const editorconfig = () => `root = true
3426
+
3427
+ [*]
3428
+ indent_style = space
3429
+ indent_size = 4
3430
+ end_of_line = lf
3431
+ charset = utf-8
3432
+ trim_trailing_whitespace = true
3433
+ insert_final_newline = true
3434
+
3435
+ [*.{yml,yaml}]
3436
+ indent_size = 2
3437
+
3438
+ [*.md]
3439
+ trim_trailing_whitespace = false
3440
+ `;
3441
+ const readmeMd = (name) => `# ${name}
3442
+
3443
+ A monorepo powered by [vis](https://visulima.com/packages/vis).
3444
+
3445
+ ## Getting Started
3446
+
3447
+ \`\`\`bash
3448
+ # Install dependencies
3449
+ pnpm install
3450
+
3451
+ # Run all apps in development mode
3452
+ pnpm dev
3453
+
3454
+ # Build all packages
3455
+ pnpm build
3456
+
3457
+ # Run tests
3458
+ pnpm test
3459
+ \`\`\`
3460
+
3461
+ ## Structure
3462
+
3463
+ \`\`\`
3464
+ ├── apps/ # Applications
3465
+ ├── packages/ # Shared packages & libraries
3466
+ ├── pnpm-workspace.yaml
3467
+ └── package.json
3468
+ \`\`\`
3469
+ `;
3470
+ const executeMonorepoTemplate = (context) => {
3471
+ const { projectName, targetDir } = context;
3472
+ pail.info("Scaffolding monorepo workspace...");
3473
+ ensureDirSync(targetDir);
3474
+ ensureDirSync(join(targetDir, "apps"));
3475
+ ensureDirSync(join(targetDir, "packages"));
3476
+ writeFileSync(join(targetDir, "package.json"), rootPackageJson(projectName));
3477
+ pail.success("Created package.json");
3478
+ writeFileSync(join(targetDir, "pnpm-workspace.yaml"), pnpmWorkspaceYaml());
3479
+ pail.success("Created pnpm-workspace.yaml");
3480
+ writeFileSync(join(targetDir, ".gitignore"), gitignore());
3481
+ pail.success("Created .gitignore");
3482
+ writeFileSync(join(targetDir, ".editorconfig"), editorconfig());
3483
+ pail.success("Created .editorconfig");
3484
+ writeFileSync(join(targetDir, "README.md"), readmeMd(projectName));
3485
+ pail.success("Created README.md");
3486
+ writeFileSync(join(targetDir, "apps", ".gitkeep"), "");
3487
+ writeFileSync(join(targetDir, "packages", ".gitkeep"), "");
3488
+ return 0;
3489
+ };
3490
+
3491
+ const AUTO_FIXES = {
3492
+ "create-nuxt": {
3493
+ monoArgs: ["--no-gitInit"]
3494
+ },
3495
+ "create-vite": {
3496
+ args: ["--no-immediate"]
3497
+ },
3498
+ sv: {
3499
+ args: ["--no-install"],
3500
+ prependCommand: "create"
3501
+ }
3502
+ };
3503
+ const applyAutoFixes = (source, args, inMonorepo) => {
3504
+ const fix = AUTO_FIXES[source];
3505
+ if (!fix) {
3506
+ return args;
3507
+ }
3508
+ const result = [...args];
3509
+ if (fix.prependCommand && !result.includes(fix.prependCommand)) {
3510
+ result.unshift(fix.prependCommand);
3511
+ }
3512
+ if (fix.args) {
3513
+ for (const argument of fix.args) {
3514
+ if (!result.includes(argument)) {
3515
+ result.push(argument);
3516
+ }
3517
+ }
3518
+ }
3519
+ if (inMonorepo && fix.monoArgs) {
3520
+ for (const argument of fix.monoArgs) {
3521
+ if (!result.includes(argument)) {
3522
+ result.push(argument);
3523
+ }
3524
+ }
3525
+ }
3526
+ return result;
3527
+ };
3528
+ const executeRemoteNpm = (config, context) => {
3529
+ const relativeTarget = relative(context.cwd, context.targetDir) || ".";
3530
+ const initialArgs = [...config.args];
3531
+ if (!initialArgs.includes(relativeTarget)) {
3532
+ initialArgs.unshift(relativeTarget);
3533
+ }
3534
+ const args = applyAutoFixes(config.source, initialArgs, context.inMonorepo);
3535
+ pail.info(`Running ${config.source} via ${context.pm.name} dlx...`);
3536
+ const code = runDlx(
3537
+ context.pm,
3538
+ {
3539
+ additionalPackages: [],
3540
+ args,
3541
+ package: config.source,
3542
+ shellMode: false,
3543
+ silent: false
3544
+ },
3545
+ context.cwd,
3546
+ context.logger
3547
+ );
3548
+ return code;
3549
+ };
3550
+ const executeRemoteGit = async (config, context) => {
3551
+ const { createConfig } = context;
3552
+ pail.info(`Downloading template from ${config.source}...`);
3553
+ try {
3554
+ const result = await downloadTemplate(config.source, {
3555
+ auth: createConfig?.auth || process.env.GIGET_AUTH || process.env.GITHUB_TOKEN || process.env.GH_TOKEN || void 0,
3556
+ dir: context.targetDir,
3557
+ // force: true is safe here — the caller (index.ts) already validated
3558
+ // the target directory is empty via canSafelyOverwrite() before reaching
3559
+ // this point. We skip giget's own directory check to avoid a redundant prompt.
3560
+ force: true,
3561
+ preferOffline: createConfig?.preferOffline,
3562
+ provider: createConfig?.defaultProvider,
3563
+ registry: createConfig?.registry
3564
+ });
3565
+ pail.info(`Downloaded to ${result.dir}`);
3566
+ return 0;
3567
+ } catch (error) {
3568
+ const message = error instanceof Error ? error.message : String(error);
3569
+ pail.warn(`Failed to download template: ${message}`);
3570
+ return 1;
3571
+ }
3572
+ };
3573
+
3574
+ const executeTemplate = async (config, context) => {
3575
+ switch (config.type) {
3576
+ case "builtin:app":
3577
+ case "builtin:library": {
3578
+ return executeBuiltin(config, context);
3579
+ }
3580
+ case "builtin:generator": {
3581
+ return executeGeneratorTemplate(context);
3582
+ }
3583
+ case "builtin:monorepo": {
3584
+ return executeMonorepoTemplate(context);
3585
+ }
3586
+ case "remote:git": {
3587
+ return executeRemoteGit(config, context);
3588
+ }
3589
+ case "remote:npm": {
3590
+ return executeRemoteNpm(config, context);
3591
+ }
3592
+ default: {
3593
+ throw new Error(`Unknown template type: ${config.type}`);
3594
+ }
3595
+ }
3596
+ };
3597
+
3598
+ const generateVscodeConfig = (projectDir) => {
3599
+ const vscodeDir = join(projectDir, ".vscode");
3600
+ ensureDirSync(vscodeDir);
3601
+ const settingsPath = join(vscodeDir, "settings.json");
3602
+ const defaultSettings = {
3603
+ "editor.defaultFormatter": "oxc.oxc-vscode",
3604
+ "editor.formatOnSave": true
3605
+ };
3606
+ if (isAccessibleSync(settingsPath)) {
3607
+ try {
3608
+ const existing = readJsonSync(settingsPath);
3609
+ writeFileSync(settingsPath, `${JSON.stringify({ ...defaultSettings, ...existing }, null, 4)}
3610
+ `);
3611
+ pail.success("Merged .vscode/settings.json");
3612
+ } catch {
3613
+ pail.warn("Could not merge .vscode/settings.json, skipping");
3614
+ }
3615
+ } else {
3616
+ writeFileSync(settingsPath, `${JSON.stringify(defaultSettings, null, 4)}
3617
+ `);
3618
+ pail.success("Created .vscode/settings.json");
3619
+ }
3620
+ const extensionsPath = join(vscodeDir, "extensions.json");
3621
+ const defaultExtensions = { recommendations: ["oxc.oxc-vscode"] };
3622
+ if (isAccessibleSync(extensionsPath)) {
3623
+ try {
3624
+ const existing = readJsonSync(extensionsPath);
3625
+ writeFileSync(
3626
+ extensionsPath,
3627
+ `${JSON.stringify(
3628
+ {
3629
+ ...existing,
3630
+ recommendations: [.../* @__PURE__ */ new Set([...existing.recommendations || [], ...defaultExtensions.recommendations])]
3631
+ },
3632
+ null,
3633
+ 4
3634
+ )}
3635
+ `
3636
+ );
3637
+ pail.success("Merged .vscode/extensions.json");
3638
+ } catch {
3639
+ pail.warn("Could not merge .vscode/extensions.json, skipping");
3640
+ }
3641
+ } else {
3642
+ writeFileSync(extensionsPath, `${JSON.stringify(defaultExtensions, null, 4)}
3643
+ `);
3644
+ pail.success("Created .vscode/extensions.json");
3645
+ }
3646
+ };
3647
+ const generateAiInstructions = (projectDir, pmName) => {
3648
+ const aiDir = join(projectDir, ".ai");
3649
+ ensureDirSync(aiDir);
3650
+ const instructionsPath = join(aiDir, "instructions");
3651
+ if (isAccessibleSync(instructionsPath)) {
3652
+ return;
3653
+ }
3654
+ const content = `# Project Instructions
3655
+
3656
+ This project was scaffolded with vis create.
3657
+
3658
+ ## Development
3659
+
3660
+ - Package manager: ${pmName}
3661
+ - Build: \`${pmName} run build\`
3662
+ - Test: \`${pmName} run test\`
3663
+ - Lint: \`${pmName} run lint\`
3664
+
3665
+ ## Conventions
3666
+
3667
+ - Use TypeScript strict mode
3668
+ - ESM modules (\`"type": "module"\`)
3669
+ - Follow Angular-style conventional commits
3670
+ `;
3671
+ writeFileSync(instructionsPath, content);
3672
+ pail.success("Created .ai/instructions");
3673
+ };
3674
+ const initGitRepo = (projectDir) => {
3675
+ const result = spawnSync("git", ["init"], {
3676
+ cwd: projectDir,
3677
+ stdio: "pipe"
3678
+ });
3679
+ if (result.status === 0) {
3680
+ pail.success("Initialized git repository");
3681
+ } else {
3682
+ pail.warn("Failed to initialize git repository");
3683
+ }
3684
+ };
3685
+ const installDependencies = (projectDir, pm, logger, preferOffline = false) => {
3686
+ pail.info("Installing dependencies...");
3687
+ const code = runInstall(
3688
+ pm,
3689
+ {
3690
+ dev: false,
3691
+ filter: [],
3692
+ force: false,
3693
+ frozenLockfile: false,
3694
+ ignoreScripts: false,
3695
+ lockfileOnly: false,
3696
+ noOptional: false,
3697
+ offline: preferOffline,
3698
+ prod: false,
3699
+ recursive: false,
3700
+ silent: false,
3701
+ workspaceRoot: false
3702
+ },
3703
+ projectDir,
3704
+ logger
3705
+ );
3706
+ if (code === 0) {
3707
+ pail.success("Dependencies installed");
3708
+ return true;
3709
+ }
3710
+ pail.warn("Dependency installation failed (you can run install manually)");
3711
+ return false;
3712
+ };
3713
+ const extractRepoName = (input) => {
3714
+ const withoutFragment = input.split("#")[0];
3715
+ const withoutQuery = withoutFragment.split("?")[0];
3716
+ const cleaned = withoutQuery.replace(/\/+$/, "").replace(/\.git$/, "");
3717
+ const segments = cleaned.split("/").filter(Boolean);
3718
+ const last = segments.at(-1) ?? "";
3719
+ const withoutPrefix = last.includes(":") ? last.split(":").pop() ?? last : last;
3720
+ return toValidPackageName(withoutPrefix) || "my-project";
3721
+ };
3722
+ const listTemplates = (aliases) => {
3723
+ pail.info("");
3724
+ pail.info(" Built-in templates:");
3725
+ pail.info(` ${bold(cyan("vis:monorepo"))} ${dim("Full pnpm workspace setup")}`);
3726
+ pail.info(` ${bold(cyan("vis:app"))} ${dim("Application scaffold via create-vite")}`);
3727
+ pail.info(` ${bold(cyan("vis:library"))} ${dim("Reusable TypeScript library package")}`);
3728
+ pail.info(` ${bold(cyan("vis:generator"))} ${dim("Code generator scaffold with bin entry")}`);
3729
+ if (aliases && Object.keys(aliases).length > 0) {
3730
+ pail.info("");
3731
+ pail.info(" Config aliases (vis.config.ts → create.templates):");
3732
+ for (const [name, source] of Object.entries(aliases)) {
3733
+ pail.info(` ${bold(cyan(name))}${" ".repeat(Math.max(1, 16 - name.length))}${dim(source)}`);
3734
+ }
3735
+ }
3736
+ pail.info("");
3737
+ pail.info(" Remote templates:");
3738
+ pail.info(` ${dim("Any npm create-* package:")} vis create vite`);
3739
+ pail.info(` ${dim("GitHub repository:")} vis create user/repo`);
3740
+ pail.info(` ${dim("GitLab / Bitbucket:")} vis create gitlab:user/repo`);
3741
+ pail.info(` ${dim("Full URL:")} vis create https://github.com/user/repo`);
3742
+ pail.info("");
3743
+ pail.info(` ${dim("Template args after --:")} vis create vite -- --template react-ts`);
3744
+ pail.info("");
3745
+ };
3746
+ const printNextSteps = (targetDir, cwd, pmName, depsInstalled) => {
3747
+ const relative2 = resolve(cwd) === resolve(targetDir) ? "" : targetDir;
3748
+ process.stderr.write("\n");
3749
+ pail.success("Project created successfully!");
3750
+ process.stderr.write("\n");
3751
+ pail.notice("Next steps:");
3752
+ if (relative2) {
3753
+ pail.info(` cd ${relative2}`);
3754
+ }
3755
+ if (!depsInstalled) {
3756
+ pail.info(` ${pmName} install`);
3757
+ }
3758
+ pail.info(` ${pmName} run dev`);
3759
+ process.stderr.write("\n");
3760
+ };
3761
+ const execute = async ({ argument, logger, options, rawUnknown, visConfig, workspaceRoot: wsRoot }) => {
3762
+ const args = Array.isArray(argument) ? argument : argument ? [argument] : [];
3763
+ const createConfig = visConfig?.create;
3764
+ if (options.list) {
3765
+ listTemplates(createConfig?.templates);
3766
+ return;
3767
+ }
3768
+ const cwd = options.cwd || wsRoot || process.cwd();
3769
+ const inMonorepo = Boolean(wsRoot);
3770
+ const isTTY = Boolean(process.stdin.isTTY);
3771
+ const detectedPm = detectPm(cwd);
3772
+ let templateInput;
3773
+ let projectName;
3774
+ let targetDir;
3775
+ let editor = createConfig?.defaultEditor;
3776
+ let gitInit = createConfig?.gitInit ?? false;
3777
+ let extraArgs = [];
3778
+ let pm = detectedPm;
3779
+ let userConfirmedOverwrite = false;
3780
+ if (args.length === 0 && isTTY && !options.noInteractive) {
3781
+ const answers = await runInteractivePrompts({
3782
+ cwd,
3783
+ defaultEditor: createConfig?.defaultEditor,
3784
+ defaultGitInit: createConfig?.gitInit,
3785
+ // Only seed defaultPm when config explicitly sets it —
3786
+ // otherwise show the PM picker so the user can choose.
3787
+ defaultPm: createConfig?.defaultPm,
3788
+ inMonorepo
3789
+ });
3790
+ templateInput = answers.template;
3791
+ projectName = answers.projectName;
3792
+ targetDir = resolve(cwd, answers.targetDir);
3793
+ editor = answers.editor ?? editor;
3794
+ gitInit = answers.gitInit;
3795
+ userConfirmedOverwrite = answers.overwrite;
3796
+ if (answers.pm) {
3797
+ pm = { name: answers.pm, version: detectedPm.version };
3798
+ }
3799
+ } else if (args.length === 0) {
3800
+ throw new Error(
3801
+ "No template specified. Usage: vis create <template> [name] [-- args...]\nUse --list to see available templates, or run interactively in a terminal."
3802
+ );
3803
+ } else {
3804
+ let passthroughArgv = [...rawUnknown ?? []];
3805
+ if (passthroughArgv.length === 0) {
3806
+ const rawArgv = process.argv.slice(2);
3807
+ const argvDashIndex = rawArgv.indexOf("--");
3808
+ if (argvDashIndex !== -1) {
3809
+ passthroughArgv = rawArgv.slice(argvDashIndex + 1);
3810
+ }
3811
+ }
3812
+ const legacyDashIndex = args.indexOf("--");
3813
+ const ownArgs = legacyDashIndex === -1 ? args : args.slice(0, legacyDashIndex);
3814
+ const legacyExtras = legacyDashIndex === -1 ? [] : args.slice(legacyDashIndex + 1);
3815
+ extraArgs = [...legacyExtras, ...passthroughArgv];
3816
+ templateInput = ownArgs[0];
3817
+ projectName = ownArgs[1];
3818
+ if (!projectName) {
3819
+ projectName = extractRepoName(templateInput);
3820
+ }
3821
+ editor = options.editor === "vscode" ? "vscode" : editor;
3822
+ gitInit = Boolean(options.gitInit) || gitInit;
3823
+ }
3824
+ if (!templateInput) {
3825
+ throw new Error("No template specified.");
3826
+ }
3827
+ const resolvedInput = createConfig?.templates?.[templateInput] ?? templateInput;
3828
+ const config = discoverTemplate(resolvedInput, extraArgs);
3829
+ if (!targetDir) {
3830
+ const parentDir = inMonorepo ? inferParentDir(config.type) : ".";
3831
+ const resolved = resolveTargetDir(projectName, resolve(cwd, parentDir));
3832
+ targetDir = resolved.targetDir;
3833
+ projectName = resolved.packageName;
3834
+ }
3835
+ const sanitizedName = toValidPackageName(projectName ?? "");
3836
+ if (!isValidPackageName(sanitizedName)) {
3837
+ throw new Error(`Invalid project name: "${projectName}". Use lowercase alphanumeric characters and hyphens.`);
3838
+ }
3839
+ projectName = sanitizedName;
3840
+ const resolvedTarget = resolve(targetDir);
3841
+ const rel = relative(resolve(cwd), resolvedTarget);
3842
+ if (rel === ".." || rel.startsWith(`..${sep}`) || isAbsolute(rel)) {
3843
+ throw new Error(`Target directory "${targetDir}" is outside the working directory. Use a name without "../" path segments.`);
3844
+ }
3845
+ if (!userConfirmedOverwrite && !canSafelyOverwrite(targetDir)) {
3846
+ throw new Error(`Target directory "${targetDir}" is not empty.
3847
+ Use a different name or clear the directory first.`);
3848
+ }
3849
+ if (resolvedInput !== templateInput) {
3850
+ pail.info(`Alias: ${bold(cyan(templateInput))} → ${dim(resolvedInput)}`);
3851
+ }
3852
+ pail.info(`Template: ${bold(cyan(resolvedInput))}`);
3853
+ pail.info(`Project: ${bold(projectName)}`);
3854
+ pail.info(`Target: ${dim(targetDir)}`);
3855
+ process.stderr.write("\n");
3856
+ const code = await executeTemplate(config, {
3857
+ createConfig,
3858
+ cwd,
3859
+ inMonorepo,
3860
+ logger,
3861
+ pm,
3862
+ projectName,
3863
+ targetDir
3864
+ });
3865
+ if (code !== 0) {
3866
+ process.exitCode = code;
3867
+ return;
3868
+ }
3869
+ if (editor === "vscode") {
3870
+ generateVscodeConfig(targetDir);
3871
+ }
3872
+ if (isAccessibleSync(targetDir)) {
3873
+ generateAiInstructions(targetDir, pm.name);
3874
+ }
3875
+ if (gitInit && !inMonorepo) {
3876
+ initGitRepo(targetDir);
3877
+ }
3878
+ let depsInstalled = false;
3879
+ const shouldInstall = createConfig?.install !== false;
3880
+ if (shouldInstall && isAccessibleSync(join(targetDir, "package.json"))) {
3881
+ depsInstalled = installDependencies(targetDir, pm, logger, createConfig?.preferOffline);
3882
+ }
3883
+ printNextSteps(targetDir, cwd, pm.name, depsInstalled);
3884
+ };
3885
+
3886
+ export { execute as default };