regpick 0.16.3 → 0.16.4

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