regpick 0.16.6 → 0.16.7

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.
@@ -0,0 +1 @@
1
+ import{i as e,n as t,r as n,t as r}from"./index.mjs";import{a as i,i as a}from"./config-T4fp4qjQ.mjs";import{a as o,i as s,n as c,o as l,r as u,t as d}from"./registry-rhSnHehV.mjs";import{Runtime as f}from"./ports-Cya9T6al.mjs";import{a as p,i as m,n as h,o as g,r as _,s as v,t as y}from"./update-DbZ8tye8.mjs";import{Array as b,Effect as x,Schema as S}from"effect";import C from"node:path";function w(e){return{dependencies:b.dedupe(e.flatMap(e=>e.dependencies||[]).filter(Boolean)),devDependencies:b.dedupe(e.flatMap(e=>e.devDependencies||[]).filter(Boolean))}}function T(e,t){let n=new Map,r=[...e],i=[];for(;r.length>0;){let e=r.shift();if(!n.has(e.name)&&(n.set(e.name,e),e.registryDependencies&&e.registryDependencies.length>0))for(let a of e.registryDependencies){if(n.has(a))continue;let e=t.find(e=>e.name===a);e?r.push(e):i.push(a)}}return{resolvedItems:b.fromIterable(n.values()),missingDependencies:b.dedupe(i.filter(Boolean))}}const E=(e,t,n,r=new Set)=>x.gen(function*(){let i=[],a=[];for(let o of e)for(let e of o.files){let{absoluteTarget:s,relativeTarget:c}=yield*p(o,e,t,n),l={itemName:o.name,sourceFile:e,absoluteTarget:s,relativeTarget:c};i.push(l),r.has(s)&&a.push(l)}return yield*x.succeed({selectedItems:e,plannedWrites:i,dependencyPlan:w(e),conflicts:a})});function D(e){return e?String(e).split(`,`).map(e=>e.trim()).filter(Boolean):[]}function O(e,t){let{flags:n}=t.args,i=D(n.select);if(n.all)return x.succeed(e);if(i.length){let t=e.filter(e=>i.includes(e.name));return t.length?x.succeed(t):x.fail(r(`ValidationError`,`No items matched --select=${String(n.select)}`))}return x.succeed(null)}const k={npm:{name:`npm`,lockfiles:[`package-lock.json`],detect:(e,t)=>t.fs.existsSync(C.join(e,`package-lock.json`)),buildInstallCommands:(e,t)=>{let n=[];return e.length&&n.push({command:`npm`,args:[`install`,...e]}),t.length&&n.push({command:`npm`,args:[`install`,`-D`,...t]}),n}},yarn:{name:`yarn`,lockfiles:[`yarn.lock`],detect:(e,t)=>t.fs.existsSync(C.join(e,`yarn.lock`)),buildInstallCommands:(e,t)=>{let n=[];return e.length&&n.push({command:`yarn`,args:[`add`,...e]}),t.length&&n.push({command:`yarn`,args:[`add`,`-D`,...t]}),n}},pnpm:{name:`pnpm`,lockfiles:[`pnpm-lock.yaml`],detect:(e,t)=>t.fs.existsSync(C.join(e,`pnpm-lock.yaml`)),buildInstallCommands:(e,t)=>{let n=[];return e.length&&n.push({command:`pnpm`,args:[`add`,...e]}),t.length&&n.push({command:`pnpm`,args:[`add`,`-D`,...t]}),n}},bun:{name:`bun`,lockfiles:[`bun.lockb`,`bun.lock`],detect:(e,t)=>t.fs.existsSync(C.join(e,`bun.lockb`))||t.fs.existsSync(C.join(e,`bun.lock`)),buildInstallCommands:(e,t)=>{let n=[];return e.length&&n.push({command:`bun`,args:[`add`,...e]}),t.length&&n.push({command:`bun`,args:[`add`,`-D`,...t]}),n}}};function A(e,t){return t?.plugins?.find(t=>typeof t==`object`&&!!t&&`name`in t&&t.name===e)??k[e]}function j(e){let t=(e?.plugins||[]).filter(e=>typeof e==`object`&&!!e&&`buildInstallCommands`in e),n=Object.values(k).filter(e=>!t.some(t=>t.name===e.name));return[...t,...n]}const M=S.Struct({dependencies:S.optionalWith(S.Record({key:S.String,value:S.String}),{exact:!0,default:()=>({})}),devDependencies:S.optionalWith(S.Record({key:S.String,value:S.String}),{exact:!0,default:()=>({})}),peerDependencies:S.optionalWith(S.Record({key:S.String,value:S.String}),{exact:!0,default:()=>({})})});function N(e,t,n){return x.gen(function*(){let r=C.join(t,`package.json`);if(!n.fs.existsSync(r))return{missingDependencies:[],missingDevDependencies:[]};let i=yield*x.exit(n.fs.readJsonSync(r)),a=i._tag===`Success`?i.value:{},o=S.decodeUnknownEither(M)(a),s=o._tag===`Right`?o.right:{dependencies:{},devDependencies:{},peerDependencies:{}},c={...s.dependencies,...s.devDependencies,...s.peerDependencies},l=b.dedupe(e.flatMap(e=>e.dependencies||[]).filter(Boolean)),u=b.dedupe(e.flatMap(e=>e.devDependencies||[]).filter(Boolean));return{missingDependencies:l.filter(e=>!c[e]),missingDevDependencies:u.filter(e=>!c[e])}})}function P(e,t,n,i,a,o){return x.gen(function*(){if(!n.length&&!i.length)return;let s=A(t,o);if(!s)return yield*x.fail(r(`InstallError`,`Unknown package manager: ${t}`));let c=s.buildInstallCommands(n,i);yield*x.forEach(c,t=>x.gen(function*(){if(a.process.run(t.command,t.args,e).status!==0)return yield*x.fail(r(`InstallError`,`Dependency install failed: ${t.command} ${t.args.join(` `)}`))}),{concurrency:1})})}function F(e,t,n,r){return x.gen(function*(){if(t&&t!==`auto`)return t;let i=j(r);for(let t of i)if(yield*x.promise(()=>Promise.resolve(t.detect(e,n))))return t.name;return`npm`})}function I(e,t,n,r=[],i=[]){return{name:`regpick:core-add`,async finish(a){if([...e.dependencies,...e.devDependencies].length>0){let r=await x.runPromise(F(a.cwd,t.install?.packageManager||`auto`,n,t));try{await x.runPromise(P(a.cwd,r,e.dependencies,e.devDependencies,n,t))}catch(e){throw Error(`Failed to install dependencies: ${e.message}`)}}if(`flushToDisk`in a.vfs&&await a.vfs.flushToDisk(),r.length>0){let e=await x.runPromise(h(a.cwd,n));for(let t of r){e.components||={};let n=i.filter(e=>e.itemName===t.name),r=y(n.map(e=>({path:e.relativeTarget,content:e.originalContent}))),o=[];for(let e of n)try{let t=await a.vfs.readFile(e.absoluteTarget,`utf-8`);o.push({path:e.relativeTarget,content:t.toString()})}catch{o.push({path:e.relativeTarget,content:e.originalContent})}let s=y(o);e.components[t.name]={source:t.sourceMeta?.originalSource??`unknown`,remoteHash:r,localHash:s}}await x.runPromise(_(a.cwd,e,n))}}}}function L(){return x.gen(function*(){let e=yield*f,i=yield*a((yield*n).cwd).pipe(x.mapError(t));return i.configPath?{config:i.config,configPath:i.configPath}:(yield*e.prompt.error(`No regpick.json configuration found. Please run 'init' first.`),yield*x.fail(r(`ValidationError`,`No config file found`)))})}function R(){return x.gen(function*(){let t=yield*e,a=yield*f,o=yield*n,s=o.args.positionals[0]===`add`?1:0,c=o.args.positionals[s];if(c)return i(c,t);let l=Object.entries(t.registry?.sources||{}).map(([e,t])=>({label:`${e} -> ${t}`,value:e}));if(l.length>0){let e=yield*a.prompt.multiselect({message:`Pick registry alias (or cancel and provide URL/path manually)`,options:l,maxItems:1,required:!1});if(yield*a.prompt.isCancel(e))return yield*x.fail(r(`UserCancelled`,`Dependency installation cancelled by user.`));if(Array.isArray(e)&&e.length>0)return i(String(e[0]),t)}let u=yield*a.prompt.text({message:`Registry URL/path:`,placeholder:`https://example.com/registry.json`});return(yield*a.prompt.isCancel(u))?yield*x.fail(r(`UserCancelled`,`Dependency installation cancelled by user.`)):String(u)})}function z(e,t){return x.gen(function*(){let i=yield*f,a=yield*n,o=(a.args.positionals[0]===`add`?1:0)+1,{items:s}=yield*d(e,a.cwd,i,t);if(!s.length)return yield*i.prompt.warn(`No installable items in registry.`),yield*x.fail(r(`ValidationError`,`No installable items in registry.`));let c=a.args.positionals[o];c&&!a.args.flags.select&&(a.args.flags.select=c);let l=yield*O(s,a),u;if(l)u=l;else{let e=yield*i.prompt.autocompleteMultiselect({message:`Select items to install`,options:s.map(e=>({value:e.name,label:`${e.name} (${e.type||`registry:file`})`,hint:e.description||`${e.files.length} file(s)`})),maxItems:10,required:!0});if(yield*i.prompt.isCancel(e))return yield*x.fail(r(`UserCancelled`,`Dependency installation cancelled by user.`));let t=new Set((Array.isArray(e)?e:[]).map(String));u=s.filter(e=>t.has(e.name))}if(!u.length)return yield*i.prompt.warn(`No items selected.`),yield*x.fail(r(`ValidationError`,`No items selected.`));let{resolvedItems:p,missingDependencies:m}=T(u,s);return{selectedItems:p,missingRegistryDeps:m}})}function B(t){return x.gen(function*(){let r=yield*e,i=yield*f,a=yield*n,o=yield*E(t,a.cwd,r),s=new Set;yield*x.forEach(o.plannedWrites,e=>x.gen(function*(){(yield*i.fs.pathExists(e.absoluteTarget))&&s.add(e.absoluteTarget)}),{concurrency:`unbounded`});let c=yield*E(t,a.cwd,r,s),l=yield*N(t,a.cwd,i);return{selectedItems:t,plannedWrites:c.plannedWrites,existingTargets:s,missingDependencies:l.missingDependencies,missingDevDependencies:l.missingDevDependencies}})}function V(t){return x.gen(function*(){let i=yield*e,a=yield*f,o=yield*n,s=!!o.args.flags.yes;if(!s){let e=yield*a.prompt.confirm({message:`Install ${t.selectedItems.length} item(s)?`,initialValue:!0});if((yield*a.prompt.isCancel(e))||!e)return yield*x.fail(r(`UserCancelled`,`Dependency installation cancelled by user.`))}let c=[],l=i.install?.overwritePolicy||`prompt`;yield*x.forEach(t.plannedWrites,e=>x.gen(function*(){if(t.existingTargets.has(e.absoluteTarget))if(s||l===`overwrite`)c.push(e);else if(l===`skip`)yield*a.prompt.warn(`Skipped existing file: ${e.absoluteTarget}`);else{let t=yield*a.prompt.select({message:`File exists: ${e.absoluteTarget}`,options:[{value:`overwrite`,label:`Overwrite this file`},{value:`skip`,label:`Skip this file`},{value:`abort`,label:`Abort installation`}]});if((yield*a.prompt.isCancel(t))||t===`abort`)return yield*x.fail(r(`UserCancelled`,`Installation aborted by user.`));t===`overwrite`&&c.push(e)}else c.push(e)}),{concurrency:1});let u=!1;if(t.missingDependencies.length>0||t.missingDevDependencies.length>0)if(s)u=!0;else{let e=F(o.cwd,i.install?.packageManager||`auto`,a),n=[];t.missingDependencies.length&&n.push(`dependencies: ${t.missingDependencies.join(`, `)}`),t.missingDevDependencies.length&&n.push(`devDependencies: ${t.missingDevDependencies.join(`, `)}`);let s=yield*a.prompt.confirm({message:`Install missing packages with ${e}? (${n.join(` | `)})`,initialValue:!0});if(yield*a.prompt.isCancel(s))return yield*x.fail(r(`UserCancelled`,`Dependency installation cancelled by user.`));u=!!s,u||(yield*a.prompt.warn(`Skipped dependency installation.`))}return{selectedItems:t.selectedItems,finalWrites:c,shouldInstallDeps:u,dependencyPlan:{dependencies:t.missingDependencies,devDependencies:t.missingDevDependencies}}})}function H(t,r,i){return x.gen(function*(){let a=yield*e,o=yield*f,s=yield*n,l=[];return yield*x.forEach(t,e=>x.gen(function*(){let t=r.find(t=>t.name===e.itemName);if(!t)return;let n=yield*c(e.sourceFile,t,s.cwd,o,i),u=m(n,a);l.push({itemName:e.itemName,absoluteTarget:e.absoluteTarget,relativeTarget:e.relativeTarget,sourceFile:e.sourceFile,originalContent:n,finalContent:u})}),{concurrency:`unbounded`}),l})}function U(){return x.gen(function*(){let{config:t}=yield*L(),r=x.gen(function*(){let r=yield*f,i=yield*n,a=yield*R();if(!a)return{kind:`noop`,message:`No source provided`};let c=[...yield*u((yield*e).plugins||[],i.cwd),s(),o(),l()],d=yield*z(a,c);for(let e of d.missingRegistryDeps||[])yield*r.prompt.warn(`Registry dependency "${e}" not found in current registry.`);let p=yield*V(yield*B(d.selectedItems)),m=yield*H(p.finalWrites,p.selectedItems,c),h=new g,_=m.map(e=>({id:e.absoluteTarget,code:e.finalContent})),y=[];for(let e of m){let t=p.selectedItems.find(t=>t.name===e.itemName);t&&!y.some(e=>e.name===t.name)&&y.push(t)}let b=t.plugins?.filter(e=>typeof e==`object`)||[],S=p.shouldInstallDeps?p.dependencyPlan:{dependencies:[],devDependencies:[]};return yield*new v([...b,I(S,yield*e,r,y,m)]).run({vfs:h,cwd:i.cwd,runtime:r},_).pipe(x.catchAll(e=>(h.rollback(),x.gen(function*(){return yield*r.prompt.error(`[Failed] Installation aborted: ${e.message}`),yield*x.fail(e)})))),yield*r.prompt.info(`Installed ${p.selectedItems.length} item(s), wrote ${m.length} file(s).`),{kind:`success`,message:`Installed ${p.selectedItems.length} item(s), wrote ${m.length} file(s).`,details:{writesCount:m.length,itemsCount:p.selectedItems.length}}});return yield*x.provideService(r,e,t)})}export{U as runAddCommand};
package/dist/index.mjs CHANGED
@@ -12,4 +12,4 @@ Options:
12
12
  --select=a,b,c Select explicit item names in add flow
13
13
  --yes Skip confirmation prompts where safe
14
14
  --help Show this help
15
- `)}function y(){return n.gen(function*(){let e=new AbortController,t=t=>{e.signal.aborted||e.abort(t),t instanceof Error&&console.error(a(`red`,`\n[Fatal Error] ${t.message}`)),process.exit(1)};process.on(`SIGINT`,()=>t()),process.on(`SIGTERM`,()=>t()),process.on(`uncaughtException`,t),process.on(`unhandledRejection`,e=>t(e instanceof Error?e:Error(String(e))));let s=_(process.argv.slice(2)),c=s.positionals[0];if(!c||s.flags.help){v();return}let{createRuntimePorts:l,Runtime:u}=yield*n.promise(()=>import(`./ports-Cya9T6al.mjs`)),d=l({signal:e.signal}),f={cwd:s.flags.cwd?i.resolve(process.cwd(),String(s.flags.cwd)):process.cwd(),args:s};d.prompt.intro(a(`cyan`,`regpick`));let p=n.gen(function*(){let e;switch(c){case`init`:e=yield*n.promise(()=>import(`./init-iLVbxiXA.mjs`).then(e=>e.runInitCommand()));break;case`list`:e=yield*n.promise(()=>import(`./list-nLGwDs7L.mjs`).then(e=>e.runListCommand()));break;case`add`:e=yield*n.promise(()=>import(`./add-DoD7e6Hd.mjs`).then(e=>e.runAddCommand()));break;case`update`:e=yield*n.promise(()=>import(`./update-COtEocN3.mjs`).then(e=>e.runUpdateCommand()));break;case`pack`:e=yield*n.promise(()=>import(`./pack-BHMSlNX5.mjs`).then(e=>e.runPackCommand()));break;default:return d.prompt.error(`Unknown command: ${c}`),v(),process.exitCode=1,yield*n.succeed(void 0)}let t=yield*e;if(t.kind===`noop`){d.prompt.outro(a(`yellow`,t.message));return}d.prompt.outro(a(`green`,`Done.`))}).pipe(n.catchAll(e=>n.sync(()=>{b(e,d.prompt.error),d.prompt.outro(a(`red`,`Failed.`)),process.exitCode=1})),n.catchAllDefect(e=>n.sync(()=>{b(h(e),d.prompt.error),d.prompt.outro(a(`red`,`Failed.`)),process.exitCode=1}))),m=r.merge(r.succeed(u,d),r.succeed(o,f));yield*p.pipe(n.provide(m))})}function b(e,t){if(e._tag===`UserCancelled`){t(e.message);return}let n=`[${e._tag}] ${e.message}`;if(e.cause)if(e.cause instanceof Error)n+=`\n\nCause:\n${e.cause.stack||e.cause.message}`;else if(typeof e.cause==`object`)try{n+=`\n\nCause:\n${JSON.stringify(e.cause,null,2)}`}catch{n+=`\n\nCause: ${String(e.cause)}`}else n+=`\n\nCause: ${String(e.cause)}`;t(n)}n.runPromise(y());export{s as i,h as n,o as r,m as t};
15
+ `)}function y(){return n.gen(function*(){let e=new AbortController,t=t=>{e.signal.aborted||e.abort(t),t instanceof Error&&console.error(a(`red`,`\n[Fatal Error] ${t.message}`)),process.exit(1)};process.on(`SIGINT`,()=>t()),process.on(`SIGTERM`,()=>t()),process.on(`uncaughtException`,t),process.on(`unhandledRejection`,e=>t(e instanceof Error?e:Error(String(e))));let s=_(process.argv.slice(2)),c=s.positionals[0];if(!c||s.flags.help){v();return}let{createRuntimePorts:l,Runtime:u}=yield*n.promise(()=>import(`./ports-Cya9T6al.mjs`)),d=l({signal:e.signal}),f={cwd:s.flags.cwd?i.resolve(process.cwd(),String(s.flags.cwd)):process.cwd(),args:s};d.prompt.intro(a(`cyan`,`regpick`));let p=n.gen(function*(){let e;switch(c){case`init`:e=yield*n.promise(()=>import(`./init-iLVbxiXA.mjs`).then(e=>e.runInitCommand()));break;case`list`:e=yield*n.promise(()=>import(`./list-nLGwDs7L.mjs`).then(e=>e.runListCommand()));break;case`add`:e=yield*n.promise(()=>import(`./add-O9Xew8KZ.mjs`).then(e=>e.runAddCommand()));break;case`update`:e=yield*n.promise(()=>import(`./update-DbZ8tye8.mjs`).then(e=>e.runUpdateCommand()));break;case`pack`:e=yield*n.promise(()=>import(`./pack-BHMSlNX5.mjs`).then(e=>e.runPackCommand()));break;default:return d.prompt.error(`Unknown command: ${c}`),v(),process.exitCode=1,yield*n.succeed(void 0)}let t=yield*e;if(t.kind===`noop`){d.prompt.outro(a(`yellow`,t.message));return}d.prompt.outro(a(`green`,`Done.`))}).pipe(n.catchAll(e=>n.sync(()=>{b(e,d.prompt.error),d.prompt.outro(a(`red`,`Failed.`)),process.exitCode=1})),n.catchAllDefect(e=>n.sync(()=>{b(h(e),d.prompt.error),d.prompt.outro(a(`red`,`Failed.`)),process.exitCode=1}))),m=r.merge(r.succeed(u,d),r.succeed(o,f));yield*p.pipe(n.provide(m))})}function b(e,t){if(e._tag===`UserCancelled`){t(e.message);return}let n=`[${e._tag}] ${e.message}`;if(e.cause)if(e.cause instanceof Error)n+=`\n\nCause:\n${e.cause.stack||e.cause.message}`;else if(typeof e.cause==`object`)try{n+=`\n\nCause:\n${JSON.stringify(e.cause,null,2)}`}catch{n+=`\n\nCause: ${String(e.cause)}`}else n+=`\n\nCause: ${String(e.cause)}`;t(n)}n.runPromise(y());export{s as i,h as n,o as r,m as t};
@@ -1,3 +1,5 @@
1
1
  import{i as e,n as t,r as n,t as r}from"./index.mjs";import{i}from"./config-T4fp4qjQ.mjs";import{a,i as o,n as s,o as c,r as l,t as u}from"./registry-rhSnHehV.mjs";import{Runtime as d}from"./ports-Cya9T6al.mjs";import{Effect as f,Either as p,Schema as m}from"effect";import h from"node:path";import{styleText as g}from"node:util";import{Volume as _}from"memfs";import v from"node:fs/promises";import y from"node:crypto";var b=class{plugins=[];constructor(e){this.plugins=e}run(e,t){return f.gen(this,function*(){yield*f.forEach(this.plugins,t=>f.gen(function*(){t.start&&(yield*f.tryPromise({try:()=>t.start(e),catch:e=>r(`RuntimeError`,`[${t.name}] Failed during start hook: ${e instanceof Error?e.message:String(e)}`)}))}),{concurrency:1});let n=yield*f.forEach(t,t=>f.gen(this,function*(){let n=t.id;for(let t of this.plugins)if(t.resolveId){let i=yield*f.tryPromise({try:()=>t.resolveId(n,void 0,e),catch:e=>r(`RuntimeError`,`[${t.name}] Failed to resolveId for '${n}': ${e instanceof Error?e.message:String(e)}`)});if(i){n=i;break}}return{file:t,currentId:n}}),{concurrency:`unbounded`}),i=new Map;for(let e of n)i.has(e.currentId)||i.set(e.currentId,[]),i.get(e.currentId).push(e);yield*f.forEach(i.values(),t=>f.gen(this,function*(){for(let n of t){let t=n.file.code,i=n.currentId;for(let n of this.plugins)if(n.load){let a=yield*f.tryPromise({try:()=>n.load(i,e),catch:e=>r(`RuntimeError`,`[${n.name}] Failed to load '${i}': ${e instanceof Error?e.message:String(e)}`)});if(a!=null){t=a;break}}if(t!==null){if(typeof t==`string`){for(let n of this.plugins)if(n.transform){let a=yield*f.tryPromise({try:()=>n.transform(t,i,e),catch:e=>r(`RuntimeError`,`[${n.name}] Failed to transform '${i}': ${e instanceof Error?e.message:String(e)}`)});a!=null&&(t=a)}}yield*f.tryPromise({try:()=>e.vfs.writeFile(i,t),catch:e=>r(`RuntimeError`,`Failed to write ${i}: ${e instanceof Error?e.message:String(e)}`)})}}}),{concurrency:`unbounded`}),yield*f.forEach(this.plugins,t=>f.gen(function*(){t.finish&&(yield*f.tryPromise({try:()=>t.finish(e),catch:e=>r(`RuntimeError`,`[${t.name}] Failed during finish hook: ${e instanceof Error?e.message:String(e)}`)}))}),{concurrency:1})}).pipe(f.catchAll(t=>f.gen(this,function*(){return yield*f.forEach(this.plugins,n=>f.gen(function*(){n.onError&&(yield*f.tryPromise({try:()=>n.onError(t,e),catch:()=>{}}).pipe(f.ignore))}),{concurrency:1}),yield*f.fail(t)})))}};function x(e){return e.replace(/\\/g,`/`)}var S=class{memory=new _;async readFile(e,t=`utf-8`){let n=x(e),r=this.memory.readFileSync(n);return r?t===`utf-8`?r.toString():r:t===`utf-8`?await v.readFile(e,`utf-8`):await v.readFile(e)}async writeFile(e,t){let n=x(e),r=h.dirname(n);await this.mkdir(r),this.memory.writeFileSync(n,t)}async exists(e){let t=x(e);try{return this.memory.existsSync(t)||await v.access(e),!0}catch{return!1}}async mkdir(e){let t=x(e);this.memory.mkdirSync(t,{recursive:!0})}async flushToDisk(){let e=this.memory.toJSON(),t=Object.entries(e).filter(([e,t])=>t!==null);if(t.length===0)return;let n=new Set;for(let[e]of t){let t=h.normalize(e);n.add(h.dirname(t))}try{for(let e of Array.from(n).sort())await v.mkdir(e,{recursive:!0})}catch(e){throw Error(`Failed to create physical filesystem directories during flush: ${e}`)}let r=(await f.runPromise(f.all(t.map(([e])=>f.tryPromise(async()=>{let t=h.normalize(e),n=this.memory.readFileSync(e);await v.writeFile(t,n)})),{concurrency:`unbounded`,mode:`either`}))).filter(e=>e._tag===`Left`);if(r.length>0){let e=r.map(e=>e.left?.message||String(e.left)).join(`
2
- `);throw Error(`flushToDisk failed with ${r.length} errors:\n${e}`)}}rollback(){this.memory.reset()}};function C(e){return e.replace(/\\/g,`/`)}function w(e,t,n){let i=`${h.resolve(e)}${h.sep}`,a=h.resolve(t);return n?f.succeed(void 0):a!==h.resolve(e)&&!a.startsWith(i)?f.fail(r(`ValidationError`,`Refusing to write outside project: ${a}`)):f.succeed(void 0)}const T=(e,t,n,r)=>f.gen(function*(){let i=t.type||e.type||`registry:file`,a=(r.resolve?.targets||{})?.[i],o=(r.registry?.preferManifestTarget??!0)!==!1,s=h.basename(t.path||`${e.name}.txt`),c;if(c=o&&t.target?t.target:a?h.join(a,s):t.target?t.target:h.join(`src`,s),r.plugins&&r.plugins.length>0){for(let n of r.plugins)if(typeof n==`object`&&n&&`resolvePath`in n&&typeof n.resolvePath==`function`){let i=n.resolvePath(t,e,c,r);if(i){c=i;break}}}let l=h.resolve(n,c);return yield*w(n,l,!!r.install?.allowOutsideProject),yield*f.succeed({absoluteTarget:l,relativeTarget:C(h.relative(n,l))})});function E(e,t){let n=e;for(let[e,r]of Object.entries(t.resolve?.aliases||{})){let t=RegExp(`from ["']${e}(.*?)["']`,`g`);n=n.replace(t,`from "${r}$1"`);let i=RegExp(`import\\(["']${e}(.*?)["']\\)`,`g`);n=n.replace(i,`import("${r}$1")`)}return n}const D=m.mutable(m.Struct({version:m.optionalWith(m.String,{exact:!0}),source:m.optionalWith(m.String,{exact:!0}),hash:m.String})),O=m.mutable(m.Struct({components:m.mutable(m.Record({key:m.String,value:D}))}));function k(e){return h.join(e,`regpick-lock.json`)}function A(e,t){let n=k(e);return f.gen(function*(){if(!(yield*t.fs.pathExists(n)))return{components:{}};let e=yield*f.exit(t.fs.readJsonSync(n));if(e._tag!==`Success`)return{components:{}};let r=m.decodeUnknownEither(O)(e.value);return r._tag===`Right`?r.right:{components:{}}})}function j(e,t,n){let r=k(e);return n.fs.writeJson(r,t,{spaces:2})}function M(e){return y.createHash(`sha256`).update(e).digest(`hex`)}function N(e){let t={};for(let n of Object.keys(e.components)){let r=e.components[n].source;r&&(t[r]||(t[r]=[]),t[r].push(n))}return t}const P=(e,t,n,r,i,a)=>f.gen(function*(){let o=[],s=[];for(let{file:e,content:r}of n){let n=E(r,a);o.push(n);let c=yield*T(t,e,i,a);s.push({target:c.absoluteTarget,content:n})}let c=M(o.sort().join(``)),l=c===r?`up-to-date`:`requires-diff-prompt`;return yield*f.succeed({itemName:e,status:l,newHash:c,files:s})});function F(){return f.gen(function*(){let e=yield*d,a=yield*n,o=yield*i(a.cwd).pipe(f.mapError(t)),s=yield*A(a.cwd,e).pipe(f.mapError(t));return o.configPath?{config:o.config,lockfile:s}:(yield*e.prompt.error(`No regpick.json configuration found. Please run 'init' first.`),yield*f.fail(r(`ValidationError`,`No config file found`)))})}function I(t,r){return f.gen(function*(){let i=yield*e,a=yield*d,o=yield*n,c=N(t);return(yield*f.forEach(Object.entries(c),([e,n])=>f.gen(function*(){let c=yield*f.either(u(e,o.cwd,a,r));if(p.isLeft(c))return yield*a.prompt.warn(`Failed to load registry ${e}`),[];let l=c.right.items;return(yield*f.forEach(n,e=>f.gen(function*(){let n=l.find(t=>t.name===e);if(!n)return null;let c=yield*f.all(n.files.map(e=>s(e,n,o.cwd,a,r).pipe(f.map(t=>({file:e,content:t})),f.catchAll(()=>f.succeed(null)))),{concurrency:`unbounded`}).pipe(f.map(e=>e.filter(e=>e!==null))),u=t.components[e].hash,d=yield*f.catchAll(P(e,n,c,u,o.cwd,i),()=>f.succeed(null));if(!d)return null;let p=d;if(p.status===`requires-diff-prompt`){let t=yield*f.forEach(p.files,e=>f.gen(function*(){let t=yield*f.catchAll(a.fs.readFile(e.target,`utf8`),()=>f.succeed(``));return{target:e.target,remoteContent:e.content,localContent:t}}),{concurrency:`unbounded`});return{itemName:e,newHash:p.newHash,files:t}}return null}),{concurrency:`unbounded`})).filter(e=>e!==null)}),{concurrency:1})).flat()})}function L(e,n){return f.gen(function*(){let r=yield*f.tryPromise({try:()=>import(`diff`).then(({diffLines:t})=>t(e,n)),catch:t});yield*f.forEach(r,e=>f.sync(()=>{let t=e.added?`green`:e.removed?`red`:`gray`,n=e.added?`+ `:e.removed?`- `:` `,r=e.value.replace(/\n$/,``).split(`
3
- `);for(let e of r)console.log(g(t,`${n}${e}`))}),{concurrency:1})})}function R(e){return f.gen(function*(){let t=yield*d;return{approvedUpdates:(yield*f.forEach(e,e=>f.gen(function*(){yield*t.prompt.info(`Update available for ${e.itemName}`);let n=yield*t.prompt.select({message:`What do you want to do with ${e.itemName}?`,options:[{value:`diff`,label:`Show diff`},{value:`update`,label:`Update`},{value:`skip`,label:`Skip`}]});if((yield*t.prompt.isCancel(n))||n===`skip`)return null;if(n===`diff`){yield*f.forEach(e.files,e=>f.gen(function*(){console.log(g(`bold`,`\nDiff for ${e.target}:`)),yield*L(e.localContent,e.remoteContent)}),{concurrency:1});let n=yield*t.prompt.confirm({message:`Update ${e.itemName} now?`,initialValue:!0});if((yield*t.prompt.isCancel(n))||!n)return null}return e}),{concurrency:1})).filter(e=>e!==null)}})}function z(){return f.gen(function*(){let r=yield*F(),i=f.gen(function*(){let i=yield*d,s=yield*n;if(Object.keys(r.lockfile.components).length===0)return yield*i.prompt.info(`No components installed. Nothing to update.`),{kind:`noop`,message:`No components to update.`};let u=[...yield*l((yield*e).plugins||[],s.cwd).pipe(f.mapError(t)),o(),a(),c()],p=yield*I(r.lockfile,u);if(p.length===0)return{kind:`noop`,message:`All components are up to date.`};let m;m=s.args?.flags?.yes?{approvedUpdates:p}:yield*R(p);let h=m.approvedUpdates.length;if(h===0)return{kind:`noop`,message:`No updates approved.`};let g=JSON.parse(JSON.stringify(r.lockfile)),_=[];yield*f.forEach(m.approvedUpdates,e=>f.sync(()=>{e.files.forEach(e=>{_.push({id:e.target,code:e.remoteContent})}),g.components[e.itemName].hash=e.newHash}),{concurrency:`unbounded`});let v=(yield*e).plugins?.filter(e=>typeof e==`object`)||[],y=new S;return yield*new b([...v,{name:`regpick:core-update`,async finish(e){`flushToDisk`in e.vfs&&await e.vfs.flushToDisk(),await f.runPromise(j(e.cwd,g,i))}}]).run({vfs:y,cwd:s.cwd,runtime:i},_).pipe(f.catchAll(e=>(y.rollback(),f.gen(function*(){return yield*i.prompt.error(`[Failed] Update aborted: ${e.message}`),yield*f.fail(e)})))),{kind:`success`,message:`Updated ${h} components.`}});return yield*f.provideService(i,e,r.config)})}export{S as a,T as i,j as n,b as o,E as r,z as runUpdateCommand,A as t};
2
+ `);throw Error(`flushToDisk failed with ${r.length} errors:\n${e}`)}}rollback(){this.memory.reset()}};function C(e){return e.replace(/\\/g,`/`)}function w(e,t,n){let i=`${h.resolve(e)}${h.sep}`,a=h.resolve(t);return n?f.succeed(void 0):a!==h.resolve(e)&&!a.startsWith(i)?f.fail(r(`ValidationError`,`Refusing to write outside project: ${a}`)):f.succeed(void 0)}const T=(e,t,n,r)=>f.gen(function*(){let i=t.type||e.type||`registry:file`,a=(r.resolve?.targets||{})?.[i],o=(r.registry?.preferManifestTarget??!0)!==!1,s=h.basename(t.path||`${e.name}.txt`),c;if(c=o&&t.target?t.target:a?h.join(a,s):t.target?t.target:h.join(`src`,s),r.plugins&&r.plugins.length>0){for(let n of r.plugins)if(typeof n==`object`&&n&&`resolvePath`in n&&typeof n.resolvePath==`function`){let i=n.resolvePath(t,e,c,r);if(i){c=i;break}}}let l=h.resolve(n,c);return yield*w(n,l,!!r.install?.allowOutsideProject),yield*f.succeed({absoluteTarget:l,relativeTarget:C(h.relative(n,l))})});function E(e,t){let n=e;for(let[e,r]of Object.entries(t.resolve?.aliases||{})){let t=RegExp(`from ["']${e}(.*?)["']`,`g`);n=n.replace(t,`from "${r}$1"`);let i=RegExp(`import\\(["']${e}(.*?)["']\\)`,`g`);n=n.replace(i,`import("${r}$1")`)}return n}const D=m.mutable(m.Struct({version:m.optionalWith(m.String,{exact:!0}),source:m.optionalWith(m.String,{exact:!0}),hash:m.optionalWith(m.String,{exact:!0}),remoteHash:m.optionalWith(m.String,{exact:!0}),localHash:m.optionalWith(m.String,{exact:!0})})),O=m.mutable(m.Struct({components:m.mutable(m.Record({key:m.String,value:D}))}));function k(e){return h.join(e,`regpick-lock.json`)}function A(e,t){let n=k(e);return f.gen(function*(){if(!(yield*t.fs.pathExists(n)))return{components:{}};let e=yield*f.exit(t.fs.readJsonSync(n));if(e._tag!==`Success`)return{components:{}};let r=m.decodeUnknownEither(O)(e.value);return r._tag===`Right`?r.right:{components:{}}})}function j(e,t,n){let r=k(e);return n.fs.writeJson(r,t,{spaces:2})}function M(e){let t=[...e].sort((e,t)=>e.path.localeCompare(t.path)).map(e=>`${e.path}:${e.content}`).join(`
3
+ ---
4
+ `);return y.createHash(`sha256`).update(t).digest(`hex`)}function N(e){let t={};for(let n of Object.keys(e.components)){let r=e.components[n].source;r&&(t[r]||(t[r]=[]),t[r].push(n))}return t}const P=(e,t,n,r,i,a)=>f.gen(function*(){let o=[],s=[];for(let{file:e,content:r}of n){let n=E(r,a),c=yield*T(t,e,i,a);o.push({target:c.absoluteTarget,content:n}),s.push({path:c.relativeTarget,content:n})}let c=M(s),l=r.remoteHash||r.hash,u=l===`pending`||c!==l?`requires-diff-prompt`:`up-to-date`;return yield*f.succeed({itemName:e,status:u,newHash:c,files:o})});function F(){return f.gen(function*(){let e=yield*d,a=yield*n,o=yield*i(a.cwd).pipe(f.mapError(t)),s=yield*A(a.cwd,e).pipe(f.mapError(t));return o.configPath?{config:o.config,lockfile:s}:(yield*e.prompt.error(`No regpick.json configuration found. Please run 'init' first.`),yield*f.fail(r(`ValidationError`,`No config file found`)))})}function I(t,r){return f.gen(function*(){let i=yield*e,a=yield*d,o=yield*n,c=N(t);return(yield*f.forEach(Object.entries(c),([e,n])=>f.gen(function*(){let c=yield*f.either(u(e,o.cwd,a,r));if(p.isLeft(c))return yield*a.prompt.warn(`Failed to load registry ${e}`),[];let l=c.right.items;return(yield*f.forEach(n,e=>f.gen(function*(){let n=l.find(t=>t.name===e);if(!n)return null;let c=yield*f.all(n.files.map(e=>s(e,n,o.cwd,a,r).pipe(f.map(t=>({file:e,content:t})),f.catchAll(()=>f.succeed(null)))),{concurrency:`unbounded`}).pipe(f.map(e=>e.filter(e=>e!==null))),u=t.components[e],d=yield*f.catchAll(P(e,n,c,u,o.cwd,i),()=>f.succeed(null));if(!d)return null;let p=d;if(p.status===`requires-diff-prompt`){let t=yield*f.forEach(p.files,e=>f.gen(function*(){let t=yield*f.catchAll(a.fs.readFile(e.target,`utf8`),()=>f.succeed(``));return{target:e.target,remoteContent:e.content,localContent:t}}),{concurrency:`unbounded`});return{itemName:e,newHash:p.newHash,files:t}}return null}),{concurrency:`unbounded`})).filter(e=>e!==null)}),{concurrency:1})).flat()})}function L(e,n){return f.gen(function*(){let r=yield*f.tryPromise({try:()=>import(`diff`).then(({diffLines:t})=>t(e,n)),catch:t});yield*f.forEach(r,e=>f.sync(()=>{let t=e.added?`green`:e.removed?`red`:`gray`,n=e.added?`+ `:e.removed?`- `:` `,r=e.value.replace(/\n$/,``).split(`
5
+ `);for(let e of r)console.log(g(t,`${n}${e}`))}),{concurrency:1})})}function R(e){return f.gen(function*(){let t=yield*d;return{approvedUpdates:(yield*f.forEach(e,e=>f.gen(function*(){yield*t.prompt.info(`Update available for ${e.itemName}`);let n=yield*t.prompt.select({message:`What do you want to do with ${e.itemName}?`,options:[{value:`diff`,label:`Show diff`},{value:`update`,label:`Update`},{value:`skip`,label:`Skip`}]});if((yield*t.prompt.isCancel(n))||n===`skip`)return null;if(n===`diff`){yield*f.forEach(e.files,e=>f.gen(function*(){console.log(g(`bold`,`\nDiff for ${e.target}:`)),yield*L(e.localContent,e.remoteContent)}),{concurrency:1});let n=yield*t.prompt.confirm({message:`Update ${e.itemName} now?`,initialValue:!0});if((yield*t.prompt.isCancel(n))||!n)return null}return e}),{concurrency:1})).filter(e=>e!==null)}})}function z(){return f.gen(function*(){let r=yield*F(),i=f.gen(function*(){let i=yield*d,s=yield*n;if(Object.keys(r.lockfile.components).length===0)return yield*i.prompt.info(`No components installed. Nothing to update.`),{kind:`noop`,message:`No components to update.`};let u=[...yield*l((yield*e).plugins||[],s.cwd).pipe(f.mapError(t)),o(),a(),c()],p=yield*I(r.lockfile,u);if(p.length===0)return{kind:`noop`,message:`All components are up to date.`};let m;m=s.args?.flags?.yes?{approvedUpdates:p}:yield*R(p);let g=m.approvedUpdates.length;if(g===0)return{kind:`noop`,message:`No updates approved.`};let _=JSON.parse(JSON.stringify(r.lockfile)),v=[];yield*f.forEach(m.approvedUpdates,e=>f.sync(()=>{e.files.forEach(e=>{v.push({id:e.target,code:e.remoteContent})}),_.components[e.itemName].remoteHash=e.newHash}),{concurrency:`unbounded`});let y=(yield*e).plugins?.filter(e=>typeof e==`object`)||[],x=new S;return yield*new b([...y,{name:`regpick:core-update`,async finish(e){`flushToDisk`in e.vfs&&await e.vfs.flushToDisk();for(let t of m.approvedUpdates){let n=[];for(let r of t.files){let t=h.relative(e.cwd,r.target);try{let i=await e.vfs.readFile(r.target,`utf-8`);n.push({path:t,content:i.toString()})}catch{n.push({path:t,content:r.remoteContent})}}_.components[t.itemName].localHash=M(n)}await f.runPromise(j(e.cwd,_,i))}}]).run({vfs:x,cwd:s.cwd,runtime:i},v).pipe(f.catchAll(e=>(x.rollback(),f.gen(function*(){return yield*i.prompt.error(`[Failed] Update aborted: ${e.message}`),yield*f.fail(e)})))),{kind:`success`,message:`Updated ${g} components.`}});return yield*f.provideService(i,e,r.config)})}export{T as a,E as i,A as n,S as o,j as r,z as runUpdateCommand,b as s,M as t};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "regpick",
3
- "version": "0.16.6",
3
+ "version": "0.16.7",
4
4
  "description": "Lightweight CLI for selecting and installing registry entries.",
5
5
  "keywords": [
6
6
  "cli",
@@ -1 +0,0 @@
1
- import{i as e,n as t,r as n,t as r}from"./index.mjs";import{a as i,i as a}from"./config-T4fp4qjQ.mjs";import{a as o,i as s,n as c,o as l,r as u,t as d}from"./registry-rhSnHehV.mjs";import{Runtime as f}from"./ports-Cya9T6al.mjs";import{a as p,i as m,n as h,o as g,r as _,t as v}from"./update-COtEocN3.mjs";import{Array as y,Effect as b,Schema as x}from"effect";import S from"node:path";function C(e){return{dependencies:y.dedupe(e.flatMap(e=>e.dependencies||[]).filter(Boolean)),devDependencies:y.dedupe(e.flatMap(e=>e.devDependencies||[]).filter(Boolean))}}function w(e,t){let n=new Map,r=[...e],i=[];for(;r.length>0;){let e=r.shift();if(!n.has(e.name)&&(n.set(e.name,e),e.registryDependencies&&e.registryDependencies.length>0))for(let a of e.registryDependencies){if(n.has(a))continue;let e=t.find(e=>e.name===a);e?r.push(e):i.push(a)}}return{resolvedItems:y.fromIterable(n.values()),missingDependencies:y.dedupe(i.filter(Boolean))}}const T=(e,t,n,r=new Set)=>b.gen(function*(){let i=[],a=[];for(let o of e)for(let e of o.files){let{absoluteTarget:s,relativeTarget:c}=yield*m(o,e,t,n),l={itemName:o.name,sourceFile:e,absoluteTarget:s,relativeTarget:c};i.push(l),r.has(s)&&a.push(l)}return yield*b.succeed({selectedItems:e,plannedWrites:i,dependencyPlan:C(e),conflicts:a})});function E(e){return e?String(e).split(`,`).map(e=>e.trim()).filter(Boolean):[]}function D(e,t){let{flags:n}=t.args,i=E(n.select);if(n.all)return b.succeed(e);if(i.length){let t=e.filter(e=>i.includes(e.name));return t.length?b.succeed(t):b.fail(r(`ValidationError`,`No items matched --select=${String(n.select)}`))}return b.succeed(null)}const O={npm:{name:`npm`,lockfiles:[`package-lock.json`],detect:(e,t)=>t.fs.existsSync(S.join(e,`package-lock.json`)),buildInstallCommands:(e,t)=>{let n=[];return e.length&&n.push({command:`npm`,args:[`install`,...e]}),t.length&&n.push({command:`npm`,args:[`install`,`-D`,...t]}),n}},yarn:{name:`yarn`,lockfiles:[`yarn.lock`],detect:(e,t)=>t.fs.existsSync(S.join(e,`yarn.lock`)),buildInstallCommands:(e,t)=>{let n=[];return e.length&&n.push({command:`yarn`,args:[`add`,...e]}),t.length&&n.push({command:`yarn`,args:[`add`,`-D`,...t]}),n}},pnpm:{name:`pnpm`,lockfiles:[`pnpm-lock.yaml`],detect:(e,t)=>t.fs.existsSync(S.join(e,`pnpm-lock.yaml`)),buildInstallCommands:(e,t)=>{let n=[];return e.length&&n.push({command:`pnpm`,args:[`add`,...e]}),t.length&&n.push({command:`pnpm`,args:[`add`,`-D`,...t]}),n}},bun:{name:`bun`,lockfiles:[`bun.lockb`,`bun.lock`],detect:(e,t)=>t.fs.existsSync(S.join(e,`bun.lockb`))||t.fs.existsSync(S.join(e,`bun.lock`)),buildInstallCommands:(e,t)=>{let n=[];return e.length&&n.push({command:`bun`,args:[`add`,...e]}),t.length&&n.push({command:`bun`,args:[`add`,`-D`,...t]}),n}}};function k(e,t){return t?.plugins?.find(t=>typeof t==`object`&&!!t&&`name`in t&&t.name===e)??O[e]}function A(e){let t=(e?.plugins||[]).filter(e=>typeof e==`object`&&!!e&&`buildInstallCommands`in e),n=Object.values(O).filter(e=>!t.some(t=>t.name===e.name));return[...t,...n]}const j=x.Struct({dependencies:x.optionalWith(x.Record({key:x.String,value:x.String}),{exact:!0,default:()=>({})}),devDependencies:x.optionalWith(x.Record({key:x.String,value:x.String}),{exact:!0,default:()=>({})}),peerDependencies:x.optionalWith(x.Record({key:x.String,value:x.String}),{exact:!0,default:()=>({})})});function M(e,t,n){return b.gen(function*(){let r=S.join(t,`package.json`);if(!n.fs.existsSync(r))return{missingDependencies:[],missingDevDependencies:[]};let i=yield*b.exit(n.fs.readJsonSync(r)),a=i._tag===`Success`?i.value:{},o=x.decodeUnknownEither(j)(a),s=o._tag===`Right`?o.right:{dependencies:{},devDependencies:{},peerDependencies:{}},c={...s.dependencies,...s.devDependencies,...s.peerDependencies},l=y.dedupe(e.flatMap(e=>e.dependencies||[]).filter(Boolean)),u=y.dedupe(e.flatMap(e=>e.devDependencies||[]).filter(Boolean));return{missingDependencies:l.filter(e=>!c[e]),missingDevDependencies:u.filter(e=>!c[e])}})}function N(e,t,n,i,a,o){return b.gen(function*(){if(!n.length&&!i.length)return;let s=k(t,o);if(!s)return yield*b.fail(r(`InstallError`,`Unknown package manager: ${t}`));let c=s.buildInstallCommands(n,i);yield*b.forEach(c,t=>b.gen(function*(){if(a.process.run(t.command,t.args,e).status!==0)return yield*b.fail(r(`InstallError`,`Dependency install failed: ${t.command} ${t.args.join(` `)}`))}),{concurrency:1})})}function P(e,t,n,r){return b.gen(function*(){if(t&&t!==`auto`)return t;let i=A(r);for(let t of i)if(yield*b.promise(()=>Promise.resolve(t.detect(e,n))))return t.name;return`npm`})}function F(e,t,n,r=[]){return{name:`regpick:core-add`,async finish(i){if([...e.dependencies,...e.devDependencies].length>0){let r=await b.runPromise(P(i.cwd,t.install?.packageManager||`auto`,n,t));try{await b.runPromise(N(i.cwd,r,e.dependencies,e.devDependencies,n,t))}catch(e){throw Error(`Failed to install dependencies: ${e.message}`)}}if(`flushToDisk`in i.vfs&&await i.vfs.flushToDisk(),r.length>0){let e=await b.runPromise(v(i.cwd,n));for(let t of r)e.components||={},e.components[t.name]={source:t.sourceMeta?.originalSource??`unknown`,hash:`pending`};await b.runPromise(h(i.cwd,e,n))}}}}function I(){return b.gen(function*(){let e=yield*f,i=yield*a((yield*n).cwd).pipe(b.mapError(t));return i.configPath?{config:i.config,configPath:i.configPath}:(yield*e.prompt.error(`No regpick.json configuration found. Please run 'init' first.`),yield*b.fail(r(`ValidationError`,`No config file found`)))})}function L(){return b.gen(function*(){let t=yield*e,a=yield*f,o=yield*n,s=o.args.positionals[0]===`add`?1:0,c=o.args.positionals[s];if(c)return i(c,t);let l=Object.entries(t.registry?.sources||{}).map(([e,t])=>({label:`${e} -> ${t}`,value:e}));if(l.length>0){let e=yield*a.prompt.multiselect({message:`Pick registry alias (or cancel and provide URL/path manually)`,options:l,maxItems:1,required:!1});if(yield*a.prompt.isCancel(e))return yield*b.fail(r(`UserCancelled`,`Dependency installation cancelled by user.`));if(Array.isArray(e)&&e.length>0)return i(String(e[0]),t)}let u=yield*a.prompt.text({message:`Registry URL/path:`,placeholder:`https://example.com/registry.json`});return(yield*a.prompt.isCancel(u))?yield*b.fail(r(`UserCancelled`,`Dependency installation cancelled by user.`)):String(u)})}function R(e,t){return b.gen(function*(){let i=yield*f,a=yield*n,o=(a.args.positionals[0]===`add`?1:0)+1,{items:s}=yield*d(e,a.cwd,i,t);if(!s.length)return yield*i.prompt.warn(`No installable items in registry.`),yield*b.fail(r(`ValidationError`,`No installable items in registry.`));let c=a.args.positionals[o];c&&!a.args.flags.select&&(a.args.flags.select=c);let l=yield*D(s,a),u;if(l)u=l;else{let e=yield*i.prompt.autocompleteMultiselect({message:`Select items to install`,options:s.map(e=>({value:e.name,label:`${e.name} (${e.type||`registry:file`})`,hint:e.description||`${e.files.length} file(s)`})),maxItems:10,required:!0});if(yield*i.prompt.isCancel(e))return yield*b.fail(r(`UserCancelled`,`Dependency installation cancelled by user.`));let t=new Set((Array.isArray(e)?e:[]).map(String));u=s.filter(e=>t.has(e.name))}if(!u.length)return yield*i.prompt.warn(`No items selected.`),yield*b.fail(r(`ValidationError`,`No items selected.`));let{resolvedItems:p,missingDependencies:m}=w(u,s);return{selectedItems:p,missingRegistryDeps:m}})}function z(t){return b.gen(function*(){let r=yield*e,i=yield*f,a=yield*n,o=yield*T(t,a.cwd,r),s=new Set;yield*b.forEach(o.plannedWrites,e=>b.gen(function*(){(yield*i.fs.pathExists(e.absoluteTarget))&&s.add(e.absoluteTarget)}),{concurrency:`unbounded`});let c=yield*T(t,a.cwd,r,s),l=yield*M(t,a.cwd,i);return{selectedItems:t,plannedWrites:c.plannedWrites,existingTargets:s,missingDependencies:l.missingDependencies,missingDevDependencies:l.missingDevDependencies}})}function B(t){return b.gen(function*(){let i=yield*e,a=yield*f,o=yield*n,s=!!o.args.flags.yes;if(!s){let e=yield*a.prompt.confirm({message:`Install ${t.selectedItems.length} item(s)?`,initialValue:!0});if((yield*a.prompt.isCancel(e))||!e)return yield*b.fail(r(`UserCancelled`,`Dependency installation cancelled by user.`))}let c=[],l=i.install?.overwritePolicy||`prompt`;yield*b.forEach(t.plannedWrites,e=>b.gen(function*(){if(t.existingTargets.has(e.absoluteTarget))if(s||l===`overwrite`)c.push(e);else if(l===`skip`)yield*a.prompt.warn(`Skipped existing file: ${e.absoluteTarget}`);else{let t=yield*a.prompt.select({message:`File exists: ${e.absoluteTarget}`,options:[{value:`overwrite`,label:`Overwrite this file`},{value:`skip`,label:`Skip this file`},{value:`abort`,label:`Abort installation`}]});if((yield*a.prompt.isCancel(t))||t===`abort`)return yield*b.fail(r(`UserCancelled`,`Installation aborted by user.`));t===`overwrite`&&c.push(e)}else c.push(e)}),{concurrency:1});let u=!1;if(t.missingDependencies.length>0||t.missingDevDependencies.length>0)if(s)u=!0;else{let e=P(o.cwd,i.install?.packageManager||`auto`,a),n=[];t.missingDependencies.length&&n.push(`dependencies: ${t.missingDependencies.join(`, `)}`),t.missingDevDependencies.length&&n.push(`devDependencies: ${t.missingDevDependencies.join(`, `)}`);let s=yield*a.prompt.confirm({message:`Install missing packages with ${e}? (${n.join(` | `)})`,initialValue:!0});if(yield*a.prompt.isCancel(s))return yield*b.fail(r(`UserCancelled`,`Dependency installation cancelled by user.`));u=!!s,u||(yield*a.prompt.warn(`Skipped dependency installation.`))}return{selectedItems:t.selectedItems,finalWrites:c,shouldInstallDeps:u,dependencyPlan:{dependencies:t.missingDependencies,devDependencies:t.missingDevDependencies}}})}function V(t,r,i){return b.gen(function*(){let a=yield*e,o=yield*f,s=yield*n,l=[];return yield*b.forEach(t,e=>b.gen(function*(){let t=r.find(t=>t.name===e.itemName);if(!t)return;let n=yield*c(e.sourceFile,t,s.cwd,o,i),u=_(n,a);l.push({itemName:e.itemName,absoluteTarget:e.absoluteTarget,sourceFile:e.sourceFile,originalContent:n,finalContent:u})}),{concurrency:`unbounded`}),l})}function H(){return b.gen(function*(){let{config:t}=yield*I(),r=b.gen(function*(){let r=yield*f,i=yield*n,a=yield*L();if(!a)return{kind:`noop`,message:`No source provided`};let c=[...yield*u((yield*e).plugins||[],i.cwd),s(),o(),l()],d=yield*R(a,c);for(let e of d.missingRegistryDeps||[])yield*r.prompt.warn(`Registry dependency "${e}" not found in current registry.`);let m=yield*B(yield*z(d.selectedItems)),h=yield*V(m.finalWrites,m.selectedItems,c),_=new p,v=h.map(e=>({id:e.absoluteTarget,code:e.finalContent})),y=[];for(let e of h){let t=m.selectedItems.find(t=>t.name===e.itemName);t&&!y.some(e=>e.name===t.name)&&y.push(t)}let x=t.plugins?.filter(e=>typeof e==`object`)||[],S=m.shouldInstallDeps?m.dependencyPlan:{dependencies:[],devDependencies:[]};return yield*new g([...x,F(S,yield*e,r,y)]).run({vfs:_,cwd:i.cwd,runtime:r},v).pipe(b.catchAll(e=>(_.rollback(),b.gen(function*(){return yield*r.prompt.error(`[Failed] Installation aborted: ${e.message}`),yield*b.fail(e)})))),yield*r.prompt.info(`Installed ${m.selectedItems.length} item(s), wrote ${h.length} file(s).`),{kind:`success`,message:`Installed ${m.selectedItems.length} item(s), wrote ${h.length} file(s).`,details:{writesCount:h.length,itemsCount:m.selectedItems.length}}});return yield*b.provideService(r,e,t)})}export{H as runAddCommand};