regpick 0.16.1 → 0.16.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2 @@
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};
@@ -0,0 +1 @@
1
+ import{Schema as e}from"effect";import t from"node:path";import n from"node:fs/promises";import{loadConfig as r}from"unconfig";const i=e.Union(e.Literal(`prompt`),e.Literal(`overwrite`),e.Literal(`skip`)),a=e.String,o=e.declare(e=>typeof e==`function`,{identifier:`Function`}),s=e.Struct({name:e.String,start:e.optionalWith(o,{exact:!0}),resolveId:e.optionalWith(o,{exact:!0}),load:e.optionalWith(o,{exact:!0}),transform:e.optionalWith(o,{exact:!0}),finish:e.optionalWith(o,{exact:!0}),onError:e.optionalWith(o,{exact:!0})}).pipe(e.typeSchema);e.Struct({name:e.String,lockfiles:e.Array(e.String),detect:o,buildInstallCommands:o}).pipe(e.typeSchema),e.Struct({name:e.String,resolvePath:o}).pipe(e.typeSchema);const c=e.Struct({resolve:e.optionalWith(e.Struct({targets:e.optionalWith(e.Record({key:e.String,value:e.String}),{exact:!0,default:()=>({})}),aliases:e.optionalWith(e.Record({key:e.String,value:e.String}),{exact:!0,default:()=>({})})}),{exact:!0,default:()=>({})}),registry:e.optionalWith(e.Struct({sources:e.optionalWith(e.Record({key:e.String,value:e.String}),{exact:!0,default:()=>({})}),preferManifestTarget:e.optionalWith(e.Boolean,{exact:!0,default:()=>!0})}),{exact:!0,default:()=>({})}),install:e.optionalWith(e.Struct({packageManager:e.optionalWith(a,{exact:!0,default:()=>`auto`}),overwritePolicy:e.optionalWith(i,{exact:!0,default:()=>`prompt`}),allowOutsideProject:e.optionalWith(e.Boolean,{exact:!0,default:()=>!1})}),{exact:!0,default:()=>({})}),plugins:e.optionalWith(e.Array(e.Union(e.Any,e.String)),{exact:!0,default:()=>[]})}).pipe(e.filter(e=>{if(!e.install?.allowOutsideProject){let n=e.resolve?.targets||{};for(let e of Object.values(n))if(typeof e==`string`&&(e.startsWith(`..`)||t.isAbsolute(e)))return!1}return!0},{message:()=>`Target paths outside project are disallowed when install.allowOutsideProject is false`})),l={resolve:{targets:{"registry:icon":`src/components/ui/icons`,"registry:component":`src/components/ui`,"registry:file":`src/components/ui`},aliases:{}},registry:{sources:{tebra:`./tebra-icon-registry/registry`},preferManifestTarget:!0},install:{overwritePolicy:`prompt`,packageManager:`auto`,allowOutsideProject:!1},plugins:[]};async function u(e){try{return await n.access(t.join(e,`tsconfig.json`)),`ts`}catch{}try{let r=await n.readFile(t.join(e,`package.json`),`utf-8`),i=JSON.parse(r);if(i.type===`module`)return`mjs`;if(i.type===`commonjs`)return`cjs`}catch{}return`mjs`}function d(e,t=1){if(e===null)return`null`;if(typeof e==`string`)return`"${e}"`;if(typeof e==`number`||typeof e==`boolean`)return String(e);if(Array.isArray(e)){if(e.length===0)return`[]`;let n=` `.repeat(t);return`[\n${n}${e.map(e=>d(e,t+1)).join(`,\n${n}`)}\n${` `.repeat(t-1)}]`}if(typeof e==`object`){let n=Object.keys(e);if(n.length===0)return`{}`;let r=e,i=` `.repeat(t);return`{\n${i}${n.map(e=>`${/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(e)?e:`"${e}"`}: ${d(r[e],t+1)}`).join(`,\n${i}`)}\n${` `.repeat(t-1)}}`}return`undefined`}function f(e,t){if(t===`json`)return JSON.stringify(e,null,2);let n=d(e,1);return t===`cjs`?`const { defineConfig } = require("regpick");\n\nmodule.exports = defineConfig(${n});\n`:`import { defineConfig } from "regpick";\n\nexport default defineConfig(${n});\n`}async function p(e){let{sources:n}=await r({sources:[{files:[`regpick`,`.regpickrc`,`regpickrc`],extensions:[`json`,`js`,`ts`,`mjs`,`cjs`,``]}],cwd:e});if(n.length>0)return n[0];let i=await u(e);return t.join(e,`regpick.config.${i}`)}async function m(t){let{config:n,sources:i}=await r({sources:[{files:[`regpick`,`.regpickrc`,`regpickrc`],extensions:[`json`,`js`,`ts`,`mjs`,`cjs`,``]},{files:`package.json`,extensions:[],rewrite(e){if(typeof e==`object`&&e&&`regpick`in e)return e.regpick}}],defaults:l,merge:!0,cwd:t});return{config:e.decodeUnknownSync(c)(n),configPath:i[0]||null}}function h(e,t){return e?t.registry?.sources?.[e]?String(t.registry.sources[e]):e:null}export{h as a,m as i,c as n,p as o,f as r,s as t};
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import e from"node:path";import{styleText as t}from"node:util";function n(e,t,n){return{kind:e,message:t,cause:n}}function r(e,t=`RuntimeError`){return typeof e==`object`&&e&&`kind`in e&&`message`in e&&typeof e.kind==`string`&&typeof e.message==`string`?e:e instanceof Error?n(t,e.message,e):n(t,String(e))}function i(e){return e===`true`?!0:e===`false`?!1:e}function a(e){let t={},n=[];for(let r of e){if(!r.startsWith(`--`)){n.push(r);continue}let e=r.slice(2),a=e.indexOf(`=`);if(a===-1){t[e]=!0;continue}let o=e.slice(0,a);t[o]=i(e.slice(a+1))}return{flags:t,positionals:n}}function o(){console.log(`
1
+ import{Data as e,Either as t}from"effect";import n from"node:path";import{styleText as r}from"node:util";var i=class extends e.TaggedError(`AppError`){};function a(e,t,n){return new i({kind:e,message:t,cause:n})}function o(e,t=`RuntimeError`){return e instanceof i?e:typeof e==`object`&&e&&`kind`in e&&`message`in e&&typeof e.kind==`string`&&typeof e.message==`string`?new i({kind:e.kind,message:e.message,cause:e.cause}):e instanceof Error?a(t,e.message,e):a(t,String(e))}function s(e){return e===`true`?!0:e===`false`?!1:e}function c(e){let t={},n=[];for(let r of e){if(!r.startsWith(`--`)){n.push(r);continue}let e=r.slice(2),i=e.indexOf(`=`);if(i===-1){t[e]=!0;continue}let a=e.slice(0,i);t[a]=s(e.slice(i+1))}return{flags:t,positionals:n}}function l(){console.log(`
2
2
  Usage:
3
3
  regpick init
4
4
  regpick list [registry-name-or-url]
@@ -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 s(){let n=new AbortController,i=e=>{n.signal.aborted||n.abort(e),e instanceof Error&&console.error(t(`red`,`\n[Fatal Error] ${e.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 s=a(process.argv.slice(2)),l=s.positionals[0];if(!l||s.flags.help){o();return}let{createRuntimePorts:u}=await import(`./ports-CYe5vg01.mjs`),d=u({signal:n.signal});if(!l||s.flags.help){o();return}let f={cwd:s.flags.cwd?e.resolve(process.cwd(),String(s.flags.cwd)):process.cwd(),args:s,runtime:d};d.prompt.intro(t(`cyan`,`regpick`));try{let e;if(l===`init`)e=await import(`./init-BsDLz5ZA.mjs`).then(e=>e.runInitCommand(f));else if(l===`list`)e=await import(`./list-CpTzcG-a.mjs`).then(e=>e.runListCommand(f));else if(l===`add`)e=await import(`./add-rEVW6oa_.mjs`).then(e=>e.runAddCommand(f));else if(l===`update`)e=await import(`./update-BCUIlnzY.mjs`).then(e=>e.runUpdateCommand(f));else if(l===`pack`)e=await import(`./pack-1ZwczWOl.mjs`).then(e=>e.runPackCommand(f));else{d.prompt.error(`Unknown command: ${l}`),o(),process.exitCode=1;return}if(!e.ok){c(e.error,d.prompt.error),d.prompt.outro(t(`red`,`Failed.`)),process.exitCode=1;return}if(e.value.kind===`noop`){d.prompt.outro(t(`yellow`,e.value.message));return}d.prompt.outro(t(`green`,`Done.`))}catch(e){c(r(e),d.prompt.error),d.prompt.outro(t(`red`,`Failed.`)),process.exitCode=1}}function c(e,t){if(e.kind===`UserCancelled`){t(e.message);return}t(`[${e.kind}] ${e.message}`)}s();export{n 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-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};
@@ -0,0 +1 @@
1
+ import{t as e}from"./index.mjs";import{i as t,n,o as r,r as i}from"./config-DZUk9z9P.mjs";import{Effect as a,Either as o,Schema as s}from"effect";import c from"node:path";function l(e,t){return e?`cancelled`:t?`overwrite`:`keep`}const u=e=>a.gen(function*(){let n=yield*a.promise(()=>r(e.cwd)),i=(yield*a.either(e.runtime.fs.stat(n)))._tag===`Right`,{config:o}=yield*a.promise(()=>t(e.cwd));return{configPath:n,exists:i,existingConfig:o}}),d=(t,r)=>a.gen(function*(){if(r.exists){let n=yield*t.runtime.prompt.confirm({message:`${r.configPath} already exists. Overwrite?`,initialValue:!1}),i=l(yield*t.runtime.prompt.isCancel(n),n===!0);if(i===`cancelled`)return yield*a.fail(e(`UserCancelled`,`Operation cancelled.`));if(i===`keep`)return yield*t.runtime.prompt.info(`Keeping existing configuration.`),null}let i=!!t.args.flags.yes,o=i?`auto`:yield*t.runtime.prompt.select({message:`Jakiego menedżera pakietów używasz?`,options:[{value:`auto`,label:`Auto (wykrywanie)`},{value:`npm`,label:`npm`},{value:`yarn`,label:`yarn`},{value:`pnpm`,label:`pnpm`}]}),c=yield*t.runtime.prompt.isCancel(o);if(!i&&c)return yield*a.fail(e(`UserCancelled`,`Operation cancelled.`));let u=i?`src/components/ui`:yield*t.runtime.prompt.text({message:`W jakim folderze trzymasz komponenty UI?`,placeholder:`src/components/ui`}),d=yield*t.runtime.prompt.isCancel(u);if(!i&&d)return yield*a.fail(e(`UserCancelled`,`Operation cancelled.`));let f=i?`prompt`:yield*t.runtime.prompt.select({message:`Czy chcesz nadpisywać pliki automatycznie, czy wolisz być pytany?`,options:[{value:`prompt`,label:`Pytaj (prompt)`},{value:`overwrite`,label:`Zawsze nadpisuj (overwrite)`},{value:`skip`,label:`Pomijaj nadpisywanie (skip)`}]}),p=yield*t.runtime.prompt.isCancel(f);if(!i&&p)return yield*a.fail(e(`UserCancelled`,`Operation cancelled.`));let m={...r.existingConfig,install:{packageManager:String(o),overwritePolicy:String(f)},resolve:{targets:{...r.existingConfig.resolve?.targets,"registry:component":String(u||`src/components/ui`),"registry:file":String(u||`src/components/ui`),"registry:icon":`${String(u||`src/components/ui`)}/icons`}}};return{newConfig:s.decodeUnknownSync(n)(m),configPath:r.configPath,isOverwrite:r.exists}}),f=e=>a.gen(function*(){let t=yield*d(e,yield*u(e));if(!t)return{kind:`noop`,message:`Keeping existing configuration.`};let n=c.extname(t.configPath).slice(1),r=[`ts`,`mjs`,`cjs`,`js`,`json`].includes(n)?n:`json`,o=i(t.newConfig,r);return yield*a.catchAll(e.runtime.fs.writeFile(t.configPath,o,`utf8`),n=>a.gen(function*(){return yield*e.runtime.prompt.error(`Failed to write config file: ${t.configPath}`),yield*a.fail(n)})),yield*e.runtime.prompt.success(`${t.isOverwrite?`Overwrote`:`Created`} ${t.configPath}`),{kind:`success`,message:`${t.isOverwrite?`Overwrote`:`Created`} ${t.configPath}`}});async function p(e){let t=await a.runPromise(a.either(f(e)));return t._tag===`Right`?o.right(t.right):o.left(t.left)}export{p as runInitCommand};
@@ -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}}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};
@@ -0,0 +1 @@
1
+ import{t as e}from"./index.mjs";import{Effect as t,Either as n}from"effect";import r from"node:path";function i(e){let t=/import\s+[\s\S]*?from\s+["']([^"']+)["']/g,n=/import\(["']([^"']+)["']\)/g,r=new Set,i;for(;(i=t.exec(e))!==null;){let e=i[1];if(!e.startsWith(`.`)&&!e.startsWith(`/`)&&!e.startsWith(`~`)&&!e.startsWith(`@/`)&&!e.startsWith(`@\\`)){let t=e.split(`/`);e.startsWith(`@`)&&t.length>1?r.add(`${t[0]}/${t[1]}`):r.add(t[0])}}for(;(i=n.exec(e))!==null;){let e=i[1];if(!e.startsWith(`.`)&&!e.startsWith(`/`)&&!e.startsWith(`~`)&&!e.startsWith(`@/`)&&!e.startsWith(`@\\`)){let t=e.split(`/`);e.startsWith(`@`)&&t.length>1?r.add(`${t[0]}/${t[1]}`):r.add(t[0])}}return Array.from(r)}function a(e){let t=i(e.content),n=r.relative(e.targetDir,e.path).replace(/\\/g,`/`),a=r.basename(e.path,r.extname(e.path));return{name:a,title:a,description:`Packed component`,type:`registry:component`,dependencies:t,devDependencies:[],registryDependencies:[],files:[{path:n,type:`registry:component`}]}}const o=(e,n)=>t.gen(function*(){let i=[],a=e=>t.gen(function*(){let o=yield*n.runtime.fs.readdir(e);yield*t.forEach(o,o=>t.gen(function*(){let t=r.join(e,o);(yield*n.runtime.fs.stat(t)).isDirectory()?yield*a(t):(t.endsWith(`.ts`)||t.endsWith(`.tsx`))&&i.push(t)}),{concurrency:1})});return yield*a(e),i}),s=n=>t.gen(function*(){let i=n.args.positionals[1]||`.`,a=r.resolve(n.cwd,i);return(yield*n.runtime.fs.stat(a)).isDirectory()||(yield*t.fail(e(`ValidationError`,`Target is not a directory: ${a}`))),yield*n.runtime.prompt.info(`Scanning ${a} for components...`),{targetDir:a,files:yield*o(a,n)}}),c=(e,n)=>t.gen(function*(){let i=yield*t.forEach(n.files,r=>t.gen(function*(){return a({path:r,content:yield*e.runtime.fs.readFile(r,`utf8`),targetDir:n.targetDir})}),{concurrency:10}),o=r.join(e.cwd,`registry.json`);return{items:Array.from(i),outPath:o,fileCount:n.files.length}});function l(e){return t.gen(function*(){let n=yield*s(e);if(n.files.length===0)return yield*e.runtime.prompt.warn(`No .ts or .tsx files found.`),{kind:`noop`,message:`No files found.`};let r=yield*c(e,n),i=JSON.stringify({name:`my-registry`,items:r.items},null,2);return yield*t.catchAll(e.runtime.fs.writeFile(r.outPath,i,`utf8`),n=>t.gen(function*(){return yield*e.runtime.prompt.error(`Failed to write registry file: ${r.outPath}`),yield*t.fail(n)})),yield*e.runtime.prompt.success(`Packed ${r.items.length} components into registry.json`),{kind:`success`,message:`Generated registry.json`}})}async function u(e){let r=await t.runPromise(t.either(l(e)));return r._tag===`Right`?n.right(r.right):n.left(r.left)}export{u as runPackCommand};
@@ -0,0 +1 @@
1
+ import{t as e}from"./index.mjs";import{Effect as t}from"effect";import n from"node:fs/promises";import{spawnSync as r}from"node:child_process";import i from"node:fs";const a=a=>({fs:{existsSync:e=>i.existsSync(e),pathExists:e=>t.promise(async()=>{try{return await n.access(e),!0}catch{return!1}}),remove:r=>t.tryPromise({try:()=>n.rm(r,{recursive:!0,force:!0}),catch:t=>e(`RuntimeError`,`Failed to remove ${r}`,t)}),ensureDir:r=>t.tryPromise({try:()=>n.mkdir(r,{recursive:!0}),catch:t=>e(`RuntimeError`,`Failed to ensure directory: ${r}`,t)}),writeFile:(r,i,a)=>t.tryPromise({try:()=>n.writeFile(r,i,a),catch:t=>e(`RuntimeError`,`Failed to write file: ${r}`,t)}),readFile:(r,i)=>t.tryPromise({try:()=>n.readFile(r,i).then(e=>e.toString()),catch:t=>e(`RuntimeError`,`Failed to read file: ${r}`,t)}),readJsonSync:n=>t.try({try:()=>{let e=i.readFileSync(n,`utf8`);return JSON.parse(e)},catch:t=>e(`RuntimeError`,`Failed to read JSON: ${n}`,t)}),writeJson:(r,i,a)=>t.tryPromise({try:()=>{let e=JSON.stringify(i,null,a?.spaces??2);return n.writeFile(r,e,`utf8`)},catch:t=>e(`RuntimeError`,`Failed to write JSON: ${r}`,t)}),stat:r=>t.tryPromise({try:()=>n.stat(r),catch:t=>e(`RuntimeError`,`Failed to stat path: ${r}`,t)}),readdir:r=>t.tryPromise({try:()=>n.readdir(r),catch:t=>e(`RuntimeError`,`Failed to read directory: ${r}`,t)})},http:{getJson:(n,r=15e3)=>t.tryPromise({try:async()=>{let e=await fetch(n,{signal:AbortSignal.timeout(r)});if(!e.ok)throw Error(`HTTP error! status: ${e.status} when fetching JSON from: ${n}`);return await e.json()},catch:t=>e(`RuntimeError`,`Failed to fetch JSON from: ${n}`,t)}),getText:(n,r=15e3)=>t.tryPromise({try:async()=>{let e=await fetch(n,{signal:AbortSignal.timeout(r)});if(!e.ok)throw Error(`HTTP error! status: ${e.status} when fetching text from: ${n}`);return await e.text()},catch:t=>e(`RuntimeError`,`Failed to fetch text from: ${n}`,t)})},prompt:{intro:e=>t.promise(async()=>{let{intro:t}=await import(`@clack/prompts`);t(e)}),outro:e=>t.promise(async()=>{let{outro:t}=await import(`@clack/prompts`);t(e)}),cancel:e=>t.promise(async()=>{let{cancel:t}=await import(`@clack/prompts`);t(e)}),isCancel:e=>t.promise(async()=>{let{isCancel:t}=await import(`@clack/prompts`);return t(e)}),info:e=>t.promise(async()=>{let{log:t}=await import(`@clack/prompts`);t.info(e)}),warn:e=>t.promise(async()=>{let{log:t}=await import(`@clack/prompts`);t.warn(e)}),error:e=>t.promise(async()=>{let{log:t}=await import(`@clack/prompts`);t.error(e)}),success:e=>t.promise(async()=>{let{log:t}=await import(`@clack/prompts`);t.success(e)}),text:e=>t.promise(async()=>{let{text:t}=await import(`@clack/prompts`);return t({signal:a?.signal,...e})}),confirm:e=>t.promise(async()=>{let{confirm:t}=await import(`@clack/prompts`);return t({signal:a?.signal,...e})}),select:e=>t.promise(async()=>{let{select:t}=await import(`@clack/prompts`);return t({signal:a?.signal,...e})}),multiselect:e=>t.promise(async()=>{let{multiselect:t}=await import(`@clack/prompts`);return t({signal:a?.signal,...e})}),autocompleteMultiselect:e=>t.promise(async()=>{let{autocompleteMultiselect:t}=await import(`@clack/prompts`);return t({signal:a?.signal,...e})})},process:{run:(e,t,n)=>r(e,t,{cwd:n,stdio:`inherit`,shell:process.platform===`win32`})}});export{a as createRuntimePorts};
@@ -0,0 +1 @@
1
+ import{t as e}from"./index.mjs";import{t}from"./config-DZUk9z9P.mjs";import{Effect as n,Either as r,Schema as i}from"effect";import a from"node:path";import{fileURLToPath as o,pathToFileURL as s}from"node:url";function c(e){return/^file:\/\//i.test(e)}function l(){return{name:`directory`,async resolveId(e,t,n){if(c(e))return e;let r;if(t&&c(t)){let n=a.dirname(o(new URL(t)));r=a.resolve(n,e)}else if(t&&a.isAbsolute(t)){let n=a.dirname(t);r=a.resolve(n,e)}else if(a.isAbsolute(e))r=e;else if(n)r=a.resolve(n.cwd,e);else return null;return s(r).toString()},async load(e,t){if(!c(e)||!t)return null;let r=o(new URL(e));if(!t.runtime?.fs)return null;let i;try{i=await n.runPromise(t.runtime.fs.stat(r))}catch{return null}if(!i.isDirectory())return null;let s=(await n.runPromise(t.runtime.fs.readdir(r))).filter(e=>e.endsWith(`.json`)),l=[];for(let e of s){let i=a.join(r,e);try{let e=await n.runPromise(t.runtime.fs.readFile(i,`utf8`)),r=JSON.parse(e);r&&typeof r==`object`&&`files`in r&&Array.isArray(r.files)&&l.push(r)}catch{}}return{items:l,resolvedSource:e}}}}function u(e){return/^file:\/\//i.test(e)}function d(){return{name:`file`,async resolveId(e,t,n){if(u(e))return e;let r;if(t&&u(t)){let n=a.dirname(o(new URL(t)));r=a.resolve(n,e)}else if(t&&a.isAbsolute(t)){let n=a.dirname(t);r=a.resolve(n,e)}else if(a.isAbsolute(e))r=e;else if(n&&e.endsWith(`.json`))r=a.resolve(n.cwd,e);else return null;return s(r).toString()},async load(e,t){if(!u(e)||!t)return null;let r=o(new URL(e));if(!t.runtime?.fs)return null;try{if((await n.runPromise(t.runtime.fs.stat(r))).isDirectory())return null;let e=await n.runPromise(t.runtime.fs.readFile(r,`utf8`));try{return JSON.parse(e)}catch{return e}}catch{return null}}}}function f(){return{name:`http`,async resolveId(e,t,n){return e.includes(`github.com`)&&e.includes(`/blob/`)&&(e=e.replace(`github.com`,`raw.githubusercontent.com`).replace(`/blob/`,`/`)),e.startsWith(`http://`)||e.startsWith(`https://`)?e:t&&(t.startsWith(`http://`)||t.startsWith(`https://`))?new URL(e,t).toString():null},async load(e,t){if(!e.startsWith(`http://`)&&!e.startsWith(`https://`)||!t)return null;let r=await n.runPromise(t.runtime.http.getText(e));try{return JSON.parse(r)}catch{return r}}}}async function p(e,n){let r=[],o=i.decodeUnknownSync(t);for(let t of e)if(typeof t==`string`)try{let e=t;(t.startsWith(`.`)||t.startsWith(`/`))&&(e=a.resolve(n,t));let i=await import(e),s=o(i.default||i.plugin||i);r.push(s)}catch(e){let n=e instanceof Error?e.message:String(e);console.warn(`[regpick] Failed to load plugin module: ${t} - ${n}`)}else try{let e=o(t);r.push(e)}catch(e){let t=e instanceof Error?e.message:String(e);console.warn(`[regpick] Invalid plugin provided: ${t}`)}return r}const m=i.Struct({path:i.optionalWith(i.String,{exact:!0}),target:i.optionalWith(i.String,{exact:!0}),type:i.optionalWith(i.String,{exact:!0,default:()=>`registry:file`}),content:i.optionalWith(i.String,{exact:!0}),url:i.optionalWith(i.String,{exact:!0})}),h=i.Struct({name:i.optionalWith(i.String,{exact:!0,default:()=>`unnamed-item`}),title:i.optionalWith(i.String,{exact:!0}),description:i.optionalWith(i.String,{exact:!0,default:()=>``}),type:i.optionalWith(i.String,{exact:!0,default:()=>`registry:file`}),dependencies:i.optionalWith(i.Array(i.String),{exact:!0,default:()=>[]}),devDependencies:i.optionalWith(i.Array(i.String),{exact:!0,default:()=>[]}),registryDependencies:i.optionalWith(i.Array(i.String),{exact:!0,default:()=>[]}),files:i.optionalWith(i.Array(m),{exact:!0,default:()=>[]})});i.Struct({type:i.String,originalSource:i.optionalWith(i.String,{exact:!0}),pluginState:i.optionalWith(i.Record({key:i.String,value:i.Unknown}),{exact:!0})});function g(e,t){let n=i.decodeUnknownSync(h)(e),r=n.name===`unnamed-item`&&n.title?n.title:n.name,a=n.title??r,o=n.files.map(e=>({...e,type:e.type===`registry:file`&&n.type!==`registry:file`?n.type:e.type}));return{...n,name:r,title:a,files:o,sourceMeta:t}}const _=i.Struct({url:i.optionalWith(i.String,{exact:!0}),href:i.optionalWith(i.String,{exact:!0}),path:i.optionalWith(i.String,{exact:!0}),files:i.optionalWith(i.Unknown,{exact:!0})}),v=i.Struct({items:i.Array(i.Union(i.Record({key:i.String,value:i.Unknown}),_))});function y(e){let t=i.decodeUnknownEither(v)(e);return t._tag===`Left`?[]:t.right.items.map(e=>{let t=e;return`files`in t&&Array.isArray(t.files)?null:typeof t.url==`string`?t.url:typeof t.href==`string`?t.href:typeof t.path==`string`?t.path:null}).filter(e=>!!e)}const b=i.Struct({files:i.Array(i.Unknown)});function x(t,n){try{if(Array.isArray(t)){let e=t.filter(e=>!!(e&&typeof e==`object`)).map(e=>g(e,n));return r.right(e)}let a=i.decodeUnknownEither(v)(t);if(a._tag===`Right`){let e=a.right.items.filter(e=>`files`in e&&Array.isArray(e.files));return r.right(e.map(e=>g(e,n)))}return i.decodeUnknownEither(b)(t)._tag===`Right`?r.right([g(t,n)]):r.left(e(`RegistryError`,`Unsupported manifest structure.`))}catch(t){return t?.name===`ParseError`?r.left(e(`ValidationError`,`Manifest validation failed: ${t.message}`)):r.left(e(`RegistryError`,`Failed to parse manifest`))}}async function S(t,n,i,a){let o=x(t,n);if(!t||typeof t!=`object`||Array.isArray(t))return o;let s=y(t);if(!s.length)return o;let c=r.isRight(o)?o.right:[],l=await Promise.all(s.map(async t=>{for(let o of a)if(!(!o.resolveId||!o.load))try{let a=await o.resolveId(t,n.originalSource,{cwd:process.cwd(),runtime:i});if(!a)continue;let s=await o.load(a,{cwd:process.cwd(),runtime:i});if(!s)continue;let c;if(typeof s==`string`)try{c=JSON.parse(s)}catch{return r.left(e(`RegistryError`,`Failed to parse JSON for ${a}`))}else c=s;return c&&typeof c==`object`?r.right(g(c,n)):r.right(null)}catch(n){let i=n instanceof Error?n.message:String(n);return n instanceof Error&&`kind`in n?r.left(n):r.left(e(`RegistryError`,`Failed to resolve ${t}: ${i}`,n))}return r.left(e(`RegistryError`,`Could not resolve reference: ${t}`))})),u=[];for(let e of l){if(r.isLeft(e))return r.left(e.left);e.right&&u.push(e.right)}return r.right([...c,...u])}async function C(t,n,i,a){if(!t)return r.left(e(`ValidationError`,`Registry source is required.`));for(let o of a)if(!(!o.resolveId||!o.load))try{let e=await o.resolveId(t,n,{cwd:process.cwd(),runtime:i});if(!e)continue;let s=await o.load(e,{cwd:process.cwd(),runtime:i});if(!s)continue;if(s&&typeof s==`object`&&`ok`in s&&s.ok===!1)return r.left(s.error);let c=s&&typeof s==`object`&&`value`in s?s.value:s,l=[];if(c&&typeof c==`object`&&`items`in c&&Array.isArray(c.items))l=c.items;else if(c&&typeof c==`object`&&`rawData`in c){let e=await S(c.rawData,c.sourceMeta,i,a);if(r.isLeft(e))return r.left(e.left);l=e.right}else if(c&&typeof c==`object`||Array.isArray(c)){let t=await S(c,{type:`system`,originalSource:e},i,a);if(r.isLeft(t))return r.left(t.left);l=t.right}let u=(c&&typeof c==`object`&&`resolvedSource`in c?c.resolvedSource:void 0)||t,d=l.map(e=>({...e,sourceMeta:{...e.sourceMeta,originalSource:u}}));return r.right({items:d,source:u})}catch(n){let i=n instanceof Error?n.message:String(n);return n&&typeof n==`object`&&`kind`in n?r.left(n):r.left(e(`RegistryError`,`Failed to load registry from ${t}: ${i}`,n))}return r.left(e(`RegistryError`,`No suitable plugin found for source: ${t}`))}async function w(t,n,i,a,o){if(typeof t.content==`string`)return r.right(t.content);let s=t.url||t.path;if(!s)return r.left(e(`ValidationError`,`File entry in "${n.name}" is missing both content and path/url.`));for(let t of o)if(!(!t.resolveId||!t.load))try{let e=n.sourceMeta.originalSource||i,o=await t.resolveId(s,e,{cwd:process.cwd(),runtime:a});if(!o)continue;let c=await t.load(o,{cwd:process.cwd(),runtime:a});if(c==null)continue;return r.right(typeof c==`string`?c:JSON.stringify(c,null,2))}catch(t){if(t&&typeof t==`object`&&`kind`in t)return r.left(t);let n=t instanceof Error?t.message:String(t);return r.left(e(`RegistryError`,`Failed to load file content for ${s}: ${n}`,t))}return r.left(e(`RegistryError`,`No suitable plugin found to resolve file content for: ${s}`))}export{d as a,f as i,w as n,l as o,p as r,C as t};
@@ -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-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};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "regpick",
3
- "version": "0.16.1",
3
+ "version": "0.16.3",
4
4
  "description": "Lightweight CLI for selecting and installing registry entries.",
5
5
  "keywords": [
6
6
  "cli",
@@ -57,10 +57,11 @@
57
57
  },
58
58
  "dependencies": {
59
59
  "@clack/prompts": "^1.0.1",
60
+ "@effect/schema": "^0.75.5",
60
61
  "diff": "^8.0.3",
62
+ "effect": "^3.19.19",
61
63
  "memfs": "^4.56.10",
62
- "unconfig": "^7.5.0",
63
- "valibot": "^1.2.0"
64
+ "unconfig": "^7.5.0"
64
65
  },
65
66
  "devDependencies": {
66
67
  "@commitlint/cli": "^20.4.2",
@@ -1,2 +0,0 @@
1
- import{t as e}from"./index.mjs";import{n as t,t as n}from"./result-Dmv-uoQK.mjs";import{a as r,i}from"./config-ChX89ix6.mjs";import{a,i as o,n as s,o as c,r as l,t as u}from"./registry-CoxNXsYX.mjs";import d from"node:path";import{Volume as f}from"memfs";import p from"node:fs/promises";import*as m from"valibot";import h from"node:crypto";var g=class{plugins=[];constructor(e){this.plugins=e}async run(t,n){try{for(let n of this.plugins)if(n.start)try{await n.start(t)}catch(t){throw e(`RuntimeError`,`[${n.name}] Failed during start hook: ${t.message}`)}await Promise.all(n.map(async n=>{let r=n.id,i=n.code;for(let n of this.plugins)if(n.resolveId)try{let e=await n.resolveId(r,void 0,t);if(e){r=e;break}}catch(t){throw e(`RuntimeError`,`[${n.name}] Failed to resolveId for '${r}': ${t.message}`)}for(let n of this.plugins)if(n.load)try{let e=await n.load(r,t);if(e!=null){i=e;break}}catch(t){throw e(`RuntimeError`,`[${n.name}] Failed to load '${r}': ${t.message}`)}if(i!==null){if(typeof i==`string`){for(let n of this.plugins)if(n.transform)try{let e=await n.transform(i,r,t);e!=null&&(i=e)}catch(t){throw e(`RuntimeError`,`[${n.name}] Failed to transform '${r}': ${t.message}`)}}await t.vfs.writeFile(r,i)}}));for(let n of this.plugins)if(n.finish)try{await n.finish(t)}catch(t){throw e(`RuntimeError`,`[${n.name}] Failed during finish hook: ${t.message}`)}}catch(e){for(let n of this.plugins)if(n.onError)try{await n.onError(e,t)}catch{}throw e}}};function _(e){return e.replace(/\\/g,`/`)}var v=class{memory=new f;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 p.readFile(e,`utf-8`):await p.readFile(e)}async writeFile(e,t){let n=_(e),r=d.dirname(n);await this.mkdir(r),this.memory.writeFileSync(n,t)}async exists(e){let t=_(e);try{return this.memory.existsSync(t)||await p.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=d.normalize(e);n.add(d.dirname(t))}try{for(let e of Array.from(n).sort())await p.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=d.normalize(e),n=this.memory.readFileSync(e);await p.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(r,i,a){let o=`${d.resolve(r)}${d.sep}`,s=d.resolve(i);return a?t(void 0):s!==d.resolve(r)&&!s.startsWith(o)?n(e(`ValidationError`,`Refusing to write outside project: ${s}`)):t(void 0)}function x(e,n,r,i){let a=n.type||e.type||`registry:file`,o=(i.resolve?.targets||{})?.[a],s=(i.registry?.preferManifestTarget??!0)!==!1,c=d.basename(n.path||`${e.name}.txt`),l;if(l=s&&n.target?n.target:o?d.join(o,c):n.target?n.target:d.join(`src`,c),i.plugins&&i.plugins.length>0){for(let t of i.plugins)if(typeof t==`object`&&t&&`resolvePath`in t&&typeof t.resolvePath==`function`){let r=t.resolvePath(n,e,l,i);if(r){l=r;break}}}let u=d.resolve(r,l),f=b(r,u,!!i.install?.allowOutsideProject);return f.ok?t({absoluteTarget:u,relativeTarget:y(d.relative(r,u))}):f}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,n,r,i=new Set){let a=[],o=[];for(let t of e)for(let e of t.files){let s=x(t,e,n,r);if(!s.ok)return s;let{absoluteTarget:c,relativeTarget:l}=s.value,u={itemName:t.name,sourceFile:e,absoluteTarget:c,relativeTarget:l};a.push(u),i.has(c)&&o.push(u)}return t({selectedItems:e,plannedWrites:a,dependencyPlan:C(e),conflicts:o})}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(r,i){let{flags:a}=i.args,o=D(a.select);if(a.all)return t(r);if(o.length){let i=r.filter(e=>o.includes(e.name));return i.length?t(i):n(e(`ValidationError`,`No items matched --select=${String(a.select)}`))}return t(null)}const k={npm:{name:`npm`,lockfiles:[`package-lock.json`],detect:(e,t)=>t.fs.existsSync(d.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(d.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(d.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(d.join(e,`bun.lockb`))||t.fs.existsSync(d.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?.plugins||[]).filter(e=>typeof e==`object`&&!!e&&`buildInstallCommands`in e),n=Object.values(k).filter(e=>!t.find(t=>t.name===e.name));return[...t,...n]}const M=m.object({dependencies:m.optional(m.record(m.string(),m.string()),{}),devDependencies:m.optional(m.record(m.string(),m.string()),{}),peerDependencies:m.optional(m.record(m.string(),m.string()),{})});function N(e){return[...new Set(e.filter(Boolean))]}function P(e,t,n){let r=d.join(t,`package.json`);if(!n.fs.existsSync(r))return{missingDependencies:[],missingDevDependencies:[]};let i=n.fs.readJsonSync(r),a=i.ok?i.value:{},o=m.safeParse(M,a),s=o.success?o.output:{dependencies:{},devDependencies:{},peerDependencies:{}},c={...s.dependencies,...s.devDependencies,...s.peerDependencies},l=N(e.flatMap(e=>e.dependencies||[])),u=N(e.flatMap(e=>e.devDependencies||[]));return{missingDependencies:l.filter(e=>!c[e]),missingDevDependencies:u.filter(e=>!c[e])}}function F(r,i,a,o,s,c){if(!a.length&&!o.length)return t(void 0);let l=A(i,c);if(!l)return n(e(`InstallError`,`Unknown package manager: ${i}`));let u=l.buildInstallCommands(a,o);for(let t of u)if(s.process.run(t.command,t.args,r).status!==0)return n(e(`InstallError`,`Dependency install failed: ${t.command} ${t.args.join(` `)}`));return t(void 0)}const I=m.object({version:m.optional(m.string()),source:m.optional(m.string()),hash:m.string()}),L=m.object({components:m.record(m.string(),I)});function R(e){return d.join(e,`regpick-lock.json`)}async function z(e,t){let n=R(e);if(!await t.fs.pathExists(n))return{components:{}};let r=t.fs.readJsonSync(n);if(!r.ok)return{components:{}};try{return m.parse(L,r.value)}catch{return{components:{}}}}async function B(e,t,n){let r=R(e);await 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(!a.ok)throw Error(`Failed to install dependencies: ${a.error.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(r){let a=await i(r.cwd);return a.configPath?t(a):(r.runtime.prompt.error(`No regpick.json configuration found. Please run 'init' first.`),n(e(`ValidationError`,`No config file found`)))}async function G(i,a){let o=i.args.positionals[0]===`add`?1:0,s=i.args.positionals[o];if(s)return t(r(s,a));let c=Object.entries(a.registry?.sources||{}).map(([e,t])=>({label:`${e} -> ${t}`,value:e}));if(c.length){let o=await i.runtime.prompt.multiselect({message:`Pick registry alias (or cancel and provide URL/path manually)`,options:c,maxItems:1,required:!1});if(await i.runtime.prompt.isCancel(o))return n(e(`UserCancelled`,`Operation cancelled.`));if(Array.isArray(o)&&o.length>0)return t(r(String(o[0]),a))}let l=await i.runtime.prompt.text({message:`Registry URL/path:`,placeholder:`https://example.com/registry.json`});return await i.runtime.prompt.isCancel(l)?n(e(`UserCancelled`,`Operation cancelled.`)):t(String(l))}async function K(r,i,a){let o=(r.args.positionals[0]===`add`?1:0)+1,s=await u(i,r.cwd,r.runtime,a);if(!s.ok)return s;let{items:c}=s.value;if(!c.length)return r.runtime.prompt.warn(`No installable items in registry.`),n(e(`ValidationError`,`No installable items in registry.`));let l=r.args.positionals[o];l&&!r.args.flags.select&&(r.args.flags.select=l);let d=O(c,r),f;if(d.ok&&d.value)f=d.value;else if(d.ok){let t=await r.runtime.prompt.autocompleteMultiselect({message:`Select items to install`,options:c.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 r.runtime.prompt.isCancel(t))return n(e(`UserCancelled`,`Operation cancelled.`));let i=new Set((Array.isArray(t)?t:[]).map(String));f=c.filter(e=>i.has(e.name))}else return n(d.error);if(!f.length)return r.runtime.prompt.warn(`No items selected.`),n(e(`ValidationError`,`No items selected.`));let{resolvedItems:p,missingDependencies:m}=w(f,c);return t({selectedItems:p,missingRegistryDeps:m})}async function q(e,r,i){let a=T(i,e.cwd,r);if(!a.ok)return n(a.error);let o=new Set,s=a.value.plannedWrites;for(let t of s)await e.runtime.fs.pathExists(t.absoluteTarget)&&o.add(t.absoluteTarget);let c=T(i,e.cwd,r,o);if(!c.ok)return n(c.error);let{missingDependencies:l,missingDevDependencies:u}=P(i,e.cwd,e.runtime);return t({selectedItems:i,missingDependencies:l,missingDevDependencies:u,plannedWrites:c.value.plannedWrites,existingTargets:o})}async function J(r,i,a){let o=!!r.args.flags.yes;if(!o){let t=await r.runtime.prompt.confirm({message:`Install ${a.selectedItems.length} item(s)?`,initialValue:!0});if(await r.runtime.prompt.isCancel(t)||!t)return n(e(`UserCancelled`,`Operation cancelled.`))}let s=[];for(let t of a.plannedWrites)if(a.existingTargets.has(t.absoluteTarget))if(o||(i.install?.overwritePolicy||`prompt`)===`overwrite`)s.push(t);else if((i.install?.overwritePolicy||`prompt`)===`skip`)r.runtime.prompt.warn(`Skipped existing file: ${t.absoluteTarget}`);else{let i=await r.runtime.prompt.select({message:`File exists: ${t.absoluteTarget}`,options:[{value:`overwrite`,label:`Overwrite this file`},{value:`skip`,label:`Skip this file`},{value:`abort`,label:`Abort installation`}]});if(await r.runtime.prompt.isCancel(i)||i===`abort`)return n(e(`UserCancelled`,`Installation aborted by user.`));i===`overwrite`&&s.push(t)}else s.push(t);let c=!1;if(a.missingDependencies.length||a.missingDevDependencies.length)if(o)c=!0;else{let t=H(r.cwd,i.install?.packageManager||`auto`,r.runtime),o=[];a.missingDependencies.length&&o.push(`dependencies: ${a.missingDependencies.join(`, `)}`),a.missingDevDependencies.length&&o.push(`devDependencies: ${a.missingDevDependencies.join(`, `)}`);let s=await r.runtime.prompt.confirm({message:`Install missing packages with ${t}? (${o.join(` | `)})`,initialValue:!0});if(await r.runtime.prompt.isCancel(s))return n(e(`UserCancelled`,`Dependency installation cancelled by user.`));c=!!s,c||r.runtime.prompt.warn(`Skipped dependency installation.`)}return t({selectedItems:a.selectedItems,shouldInstallDeps:c,finalWrites:s,dependencyPlan:{dependencies:a.missingDependencies,devDependencies:a.missingDevDependencies}})}async function Y(e,r,i,a){let o=[];for(let t of i.finalWrites){let c=i.selectedItems.find(e=>e.name===t.itemName);if(!c)continue;let l=await s(t.sourceFile,c,e.cwd,e.runtime,a);if(!l.ok)return n(l.error);let u=E(l.value,r);o.push({absoluteTarget:t.absoluteTarget,finalContent:u,itemName:t.itemName})}return t({...i,hydratedWrites:o})}async function X(r){let i=await W(r);if(!i.ok)return n(i.error);let s=await G(r,i.value.config);if(!s.ok)return n(s.error);if(!s.value)return t({kind:`noop`,message:`No source provided.`});let u=[...await l(i.value.config.plugins||[],r.cwd),o(),a(),c()],d=await K(r,s.value,u);if(!d.ok)return n(d.error);for(let e of d.value.missingRegistryDeps)r.runtime.prompt.warn(`Registry dependency "${e}" not found in current registry.`);let f=await q(r,i.value.config,d.value.selectedItems);if(!f.ok)return n(f.error);let p=await J(r,i.value.config,f.value);if(!p.ok)return n(p.error);let m=await Y(r,i.value.config,p.value,u);if(!m.ok)return n(m.error);let h=m.value.hydratedWrites.map(e=>({id:e.absoluteTarget,code:e.finalContent})),_=[];for(let e of m.value.hydratedWrites){let t=m.value.selectedItems.find(t=>t.name===e.itemName);t&&!_.some(e=>e.name===t.name)&&_.push(t)}let y=new v,b=new g([...i.value.config.plugins?.filter(e=>typeof e==`object`)||[],U(m.value.dependencyPlan,i.value.config,r.runtime,_)]);try{await b.run({vfs:y,cwd:r.cwd,runtime:r.runtime},h)}catch(t){return y.rollback(),r.runtime.prompt.error(`[Failed] Installation aborted: ${t}`),n(e(`RuntimeError`,String(t)))}return r.runtime.prompt.info(`Installed ${m.value.selectedItems.length} item(s), wrote ${m.value.hydratedWrites.length} file(s).`),t({kind:`success`,message:`Installed ${m.value.selectedItems.length} item(s), wrote ${m.value.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};
@@ -1 +0,0 @@
1
- import e from"node:path";import t from"node:fs/promises";import*as n from"valibot";import{loadConfig as r}from"unconfig";const i=n.union([n.literal(`prompt`),n.literal(`overwrite`),n.literal(`skip`)]),a=n.string(),o=n.custom(e=>typeof e==`function`,`Expected a function`),s=n.objectWithRest({name:n.string(),start:n.optional(o),resolveId:n.optional(o),load:n.optional(o),transform:n.optional(o),finish:n.optional(o),onError:n.optional(o)},n.any());n.objectWithRest({name:n.string(),lockfiles:n.array(n.string()),detect:o,buildInstallCommands:o},n.any()),n.objectWithRest({name:n.string(),resolvePath:o},n.any());const c=n.pipe(n.object({resolve:n.optional(n.object({targets:n.optional(n.record(n.string(),n.string()),{}),aliases:n.optional(n.record(n.string(),n.string()),{})}),{}),registry:n.optional(n.object({sources:n.optional(n.record(n.string(),n.string()),{}),preferManifestTarget:n.optional(n.boolean(),!0)}),{}),install:n.optional(n.object({packageManager:n.optional(a,`auto`),overwritePolicy:n.optional(i,`prompt`),allowOutsideProject:n.optional(n.boolean(),!1)}),{}),plugins:n.optional(n.array(n.union([s,n.string()])),[])}),n.check(t=>{if(!t.install?.allowOutsideProject){let n=t.resolve?.targets||{};for(let t of Object.values(n))if(typeof t==`string`&&(t.startsWith(`..`)||e.isAbsolute(t)))return!1}return!0},`Target paths outside project are disallowed when install.allowOutsideProject is false`)),l={resolve:{targets:{"registry:icon":`src/components/ui/icons`,"registry:component":`src/components/ui`,"registry:file":`src/components/ui`},aliases:{}},registry:{sources:{tebra:`./tebra-icon-registry/registry`},preferManifestTarget:!0},install:{overwritePolicy:`prompt`,packageManager:`auto`,allowOutsideProject:!1},plugins:[]};async function u(n){try{return await t.access(e.join(n,`tsconfig.json`)),`ts`}catch{}try{let r=await t.readFile(e.join(n,`package.json`),`utf-8`),i=JSON.parse(r);if(i.type===`module`)return`mjs`;if(i.type===`commonjs`)return`cjs`}catch{}return`mjs`}function d(e,t=1){if(e===null)return`null`;if(typeof e==`string`)return`"${e}"`;if(typeof e==`number`||typeof e==`boolean`)return String(e);if(Array.isArray(e)){if(e.length===0)return`[]`;let n=` `.repeat(t);return`[\n${n}${e.map(e=>d(e,t+1)).join(`,\n${n}`)}\n${` `.repeat(t-1)}]`}if(typeof e==`object`){let n=Object.keys(e);if(n.length===0)return`{}`;let r=` `.repeat(t);return`{\n${r}${n.map(n=>`${/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(n)?n:`"${n}"`}: ${d(e[n],t+1)}`).join(`,\n${r}`)}\n${` `.repeat(t-1)}}`}return`undefined`}function f(e,t){if(t===`json`)return JSON.stringify(e,null,2);let n=d(e,1);return t===`cjs`?`const { defineConfig } = require("regpick");\n\nmodule.exports = defineConfig(${n});\n`:`import { defineConfig } from "regpick";\n\nexport default defineConfig(${n});\n`}async function p(t){let{sources:n}=await r({sources:[{files:[`regpick`,`.regpickrc`,`regpickrc`],extensions:[`json`,`js`,`ts`,`mjs`,`cjs`,``]}],cwd:t});if(n.length>0)return n[0];let i=await u(t);return e.join(t,`regpick.config.${i}`)}async function m(e){let{config:t,sources:i}=await r({sources:[{files:[`regpick`,`.regpickrc`,`regpickrc`],extensions:[`json`,`js`,`ts`,`mjs`,`cjs`,``]},{files:`package.json`,extensions:[],rewrite(e){return e?.regpick}}],defaults:l,merge:!0,cwd:e});return{config:n.parse(c,t),configPath:i[0]||null}}function h(e,t){return e?t.registry?.sources?.[e]?String(t.registry.sources[e]):e:null}export{h as a,m as i,c as n,p as o,f as r,s as t};
@@ -1 +0,0 @@
1
- import{t as e}from"./index.mjs";import{n as t,t as n}from"./result-Dmv-uoQK.mjs";import{i as r,n as i,o as a,r as o}from"./config-ChX89ix6.mjs";import s from"node:path";import*as c from"valibot";function l(e,t){return e?`cancelled`:t?`overwrite`:`keep`}async function u(e){let n=await a(e.cwd),i=(await e.runtime.fs.stat(n)).ok,{config:o}=await r(e.cwd);return t({configPath:n,exists:i,existingConfig:o})}async function d(r,a){if(a.exists){let i=await r.runtime.prompt.confirm({message:`${a.configPath} already exists. Overwrite?`,initialValue:!1}),o=l(await r.runtime.prompt.isCancel(i),!!i);if(o===`cancelled`)return n(e(`UserCancelled`,`Operation cancelled.`));if(o===`keep`)return r.runtime.prompt.info(`Keeping existing configuration.`),t(null)}let o=!!r.args.flags.yes,s=o?`auto`:await r.runtime.prompt.select({message:`Jakiego menedżera pakietów używasz?`,options:[{value:`auto`,label:`Auto (wykrywanie)`},{value:`npm`,label:`npm`},{value:`yarn`,label:`yarn`},{value:`pnpm`,label:`pnpm`}]}),u=await r.runtime.prompt.isCancel(s);if(!o&&u)return n(e(`UserCancelled`,`Operation cancelled.`));let d=o?`src/components/ui`:await r.runtime.prompt.text({message:`W jakim folderze trzymasz komponenty UI?`,placeholder:`src/components/ui`}),f=await r.runtime.prompt.isCancel(d);if(!o&&f)return n(e(`UserCancelled`,`Operation cancelled.`));let p=o?`prompt`:await r.runtime.prompt.select({message:`Czy chcesz nadpisywać pliki automatycznie, czy wolisz być pytany?`,options:[{value:`prompt`,label:`Pytaj (prompt)`},{value:`overwrite`,label:`Zawsze nadpisuj (overwrite)`},{value:`skip`,label:`Pomijaj nadpisywanie (skip)`}]}),m=await r.runtime.prompt.isCancel(p);if(!o&&m)return n(e(`UserCancelled`,`Operation cancelled.`));let h={...a.existingConfig,install:{packageManager:String(s),overwritePolicy:String(p)},resolve:{targets:{...a.existingConfig.resolve?.targets,"registry:component":String(d||`src/components/ui`),"registry:file":String(d||`src/components/ui`),"registry:icon":`${String(d||`src/components/ui`)}/icons`}}};return t({newConfig:c.parse(i,h),configPath:a.configPath,isOverwrite:a.exists})}async function f(e){let r=await u(e);if(!r.ok)return n(r.error);let i=await d(e,r.value);if(!i.ok)return n(i.error);if(!i.value)return t({kind:`noop`,message:`Keeping existing configuration.`});let a=s.extname(i.value.configPath).slice(1),c=[`ts`,`mjs`,`cjs`,`js`,`json`].includes(a)?a:`json`,l=o(i.value.newConfig,c),f=await e.runtime.fs.writeFile(i.value.configPath,l,`utf8`);return f.ok?(e.runtime.prompt.success(`${i.value.isOverwrite?`Overwrote`:`Created`} ${i.value.configPath}`),t({kind:`success`,message:`${i.value.isOverwrite?`Overwrote`:`Created`} ${i.value.configPath}`})):(e.runtime.prompt.error(`Failed to write config file: ${i.value.configPath}`),n(f.error))}export{f as runInitCommand};
@@ -1 +0,0 @@
1
- import{t as e}from"./index.mjs";import{n as t,t as n}from"./result-Dmv-uoQK.mjs";import{i as r}from"./config-ChX89ix6.mjs";import{a as i,i as a,o,r as s,t as c}from"./registry-CoxNXsYX.mjs";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:n}=await r(e.cwd),c=u(e.args.positionals[1],n.registry?.sources||{}),l=[...await s(n.plugins||[],e.cwd),a(),i(),o()];return t({source:c.source,requiresPrompt:c.requiresPrompt,plugins:l})}async function f(r,i){if(!i.requiresPrompt)return t(i.source);let a=await r.runtime.prompt.text({message:`Registry URL/path:`,placeholder:`https://example.com/registry.json`});return await r.runtime.prompt.isCancel(a)?n(e(`UserCancelled`,`Operation cancelled.`)):t(String(a))}async function p(e,n,r){let i=await c(n,e.cwd,e.runtime,r);return i.ok?t(i.value.items):i}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 r=await d(e);if(!r.ok)return n(r.error);let i=await f(e,r.value);if(!i.ok)return n(i.error);if(!i.value)return t({kind:`noop`,message:`No registry source provided.`});let a=await p(e,i.value,r.value.plugins);if(!a.ok)return n(a.error);let o=a.value;return o.length?(h(e,o),t({kind:`success`,message:`Listed ${o.length} item(s).`})):(e.runtime.prompt.warn(`No items found in registry.`),t({kind:`noop`,message:`No items found in registry.`}))}export{g as runListCommand};
@@ -1 +0,0 @@
1
- import{t as e}from"./index.mjs";import{n as t,t as n}from"./result-Dmv-uoQK.mjs";import r from"node:path";function i(e){let t=/import\s+[\s\S]*?from\s+["']([^"']+)["']/g,n=/import\(["']([^"']+)["']\)/g,r=new Set,i;for(;(i=t.exec(e))!==null;){let e=i[1];if(!e.startsWith(`.`)&&!e.startsWith(`/`)&&!e.startsWith(`~`)&&!e.startsWith(`@/`)&&!e.startsWith(`@\\`)){let t=e.split(`/`);e.startsWith(`@`)&&t.length>1?r.add(`${t[0]}/${t[1]}`):r.add(t[0])}}for(;(i=n.exec(e))!==null;){let e=i[1];if(!e.startsWith(`.`)&&!e.startsWith(`/`)&&!e.startsWith(`~`)&&!e.startsWith(`@/`)&&!e.startsWith(`@\\`)){let t=e.split(`/`);e.startsWith(`@`)&&t.length>1?r.add(`${t[0]}/${t[1]}`):r.add(t[0])}}return Array.from(r)}function a(e){let t=i(e.content),n=r.relative(e.targetDir,e.path).replace(/\\/g,`/`),a=r.basename(e.path,r.extname(e.path));return{name:a,title:a,description:`Packed component`,type:`registry:component`,dependencies:t,devDependencies:[],registryDependencies:[],files:[{path:n,type:`registry:component`}]}}async function o(e,i){let a=[];async function o(e){let n=await i.runtime.fs.readdir(e);if(!n.ok)return n;let s=await Promise.all(n.value.map(async n=>{let s=r.join(e,n),c=await i.runtime.fs.stat(s);if(!c.ok)return c;if(c.value.isDirectory()){let e=await o(s);if(!e.ok)return e}else (s.endsWith(`.ts`)||s.endsWith(`.tsx`))&&a.push(s);return t(void 0)}));for(let e of s)if(!e.ok)return e;return t(void 0)}let s=await o(e);return s.ok?t(a):n(s.error)}async function s(i){let a=i.args.positionals[1]||`.`,s=r.resolve(i.cwd,a),c=await i.runtime.fs.stat(s);if(!c.ok||!c.value.isDirectory())return n(e(`ValidationError`,`Target is not a directory: ${s}`));i.runtime.prompt.info(`Scanning ${s} for components...`);let l=await o(s,i);return l.ok?t({targetDir:s,files:l.value}):l}async function c(e,i){let o=[],s=await Promise.all(i.files.map(async n=>{let r=await e.runtime.fs.readFile(n,`utf8`);return r.ok?t(a({path:n,content:r.value,targetDir:i.targetDir})):r}));for(let e of s){if(!e.ok)return n(e.error);o.push(e.value)}return t({items:o,outPath:r.join(e.cwd,`registry.json`),fileCount:i.files.length})}async function l(e){let r=await s(e);if(!r.ok)return n(r.error);if(r.value.files.length===0)return e.runtime.prompt.warn(`No .ts or .tsx files found.`),t({kind:`noop`,message:`No files found.`});let i=await c(e,r.value);if(!i.ok)return n(i.error);let a=JSON.stringify({name:`my-registry`,items:i.value.items},null,2),o=await e.runtime.fs.writeFile(i.value.outPath,a,`utf8`);return o.ok?(e.runtime.prompt.success(`Packed ${i.value.items.length} components into registry.json`),t({kind:`success`,message:`Generated registry.json`})):(e.runtime.prompt.error(`Failed to write registry file: ${i.value.outPath}`),n(o.error))}export{l as runPackCommand};
@@ -1 +0,0 @@
1
- import{t as e}from"./index.mjs";import{n as t,t as n}from"./result-Dmv-uoQK.mjs";import r from"node:fs/promises";import{spawnSync as i}from"node:child_process";import a from"node:fs";const o=o=>({fs:{existsSync:e=>a.existsSync(e),pathExists:async e=>{try{return await r.access(e),!0}catch{return!1}},remove:async i=>{try{return await r.rm(i,{recursive:!0,force:!0}),t(void 0)}catch(t){return n(e(`RuntimeError`,`Failed to remove ${i}`,t))}},ensureDir:async i=>{try{return await r.mkdir(i,{recursive:!0}),t(void 0)}catch(t){return n(e(`RuntimeError`,`Failed to ensure directory: ${i}`,t))}},writeFile:async(i,a,o)=>{try{return await r.writeFile(i,a,o),t(void 0)}catch(t){return n(e(`RuntimeError`,`Failed to write file: ${i}`,t))}},readFile:async(i,a)=>{try{return t(await r.readFile(i,a))}catch(t){return n(e(`RuntimeError`,`Failed to read file: ${i}`,t))}},readJsonSync:r=>{try{let e=a.readFileSync(r,`utf8`);return t(JSON.parse(e))}catch(t){return n(e(`RuntimeError`,`Failed to read JSON: ${r}`,t))}},writeJson:async(i,a,o)=>{try{let e=JSON.stringify(a,null,o?.spaces??2);return await r.writeFile(i,e,`utf8`),t(void 0)}catch(t){return n(e(`RuntimeError`,`Failed to write JSON: ${i}`,t))}},stat:async i=>{try{return t(await r.stat(i))}catch(t){return n(e(`RuntimeError`,`Failed to stat path: ${i}`,t))}},readdir:async i=>{try{return t(await r.readdir(i))}catch(t){return n(e(`RuntimeError`,`Failed to read directory: ${i}`,t))}}},http:{getJson:async(r,i=15e3)=>{try{let a=await fetch(r,{signal:AbortSignal.timeout(i)});return a.ok?t(await a.json()):n(e(`RuntimeError`,`HTTP error! status: ${a.status} when fetching JSON from: ${r}`))}catch(t){return n(e(`RuntimeError`,`Failed to fetch JSON from: ${r}`,t))}},getText:async(r,i=15e3)=>{try{let a=await fetch(r,{signal:AbortSignal.timeout(i)});return a.ok?t(await a.text()):n(e(`RuntimeError`,`HTTP error! status: ${a.status} when fetching text from: ${r}`))}catch(t){return n(e(`RuntimeError`,`Failed to fetch text from: ${r}`,t))}}},prompt:{intro:async e=>{let{intro:t}=await import(`@clack/prompts`);return t(e)},outro:async e=>{let{outro:t}=await import(`@clack/prompts`);return t(e)},cancel:async e=>{let{cancel:t}=await import(`@clack/prompts`);return t(e)},isCancel:async e=>{let{isCancel:t}=await import(`@clack/prompts`);return t(e)},info:async e=>{let{log:t}=await import(`@clack/prompts`);return t.info(e)},warn:async e=>{let{log:t}=await import(`@clack/prompts`);return t.warn(e)},error:async e=>{let{log:t}=await import(`@clack/prompts`);return t.error(e)},success:async e=>{let{log:t}=await import(`@clack/prompts`);return t.success(e)},text:async e=>{let{text:t}=await import(`@clack/prompts`);return t({signal:o?.signal,...e})},confirm:async e=>{let{confirm:t}=await import(`@clack/prompts`);return t({signal:o?.signal,...e})},select:async e=>{let{select:t}=await import(`@clack/prompts`);return t({signal:o?.signal,...e})},multiselect:async e=>{let{multiselect:t}=await import(`@clack/prompts`);return t({signal:o?.signal,...e})},autocompleteMultiselect:async e=>{let{autocompleteMultiselect:t}=await import(`@clack/prompts`);return t({signal:o?.signal,...e})}},process:{run:(e,t,n)=>i(e,t,{cwd:n,stdio:`inherit`,shell:process.platform===`win32`})}});export{o as createRuntimePorts};
@@ -1 +0,0 @@
1
- import{t as e}from"./index.mjs";import{n as t,t as n}from"./result-Dmv-uoQK.mjs";import{t as r}from"./config-ChX89ix6.mjs";import i from"node:path";import*as a from"valibot";import{fileURLToPath as o,pathToFileURL as s}from"node:url";function c(e){return/^file:\/\//i.test(e)}function l(){return{name:`directory`,async resolveId(e,t,n){if(c(e))return e;let r;if(t&&c(t)){let n=i.dirname(o(new URL(t)));r=i.resolve(n,e)}else if(t&&i.isAbsolute(t)){let n=i.dirname(t);r=i.resolve(n,e)}else if(i.isAbsolute(e))r=e;else if(n)r=i.resolve(n.cwd,e);else return null;return s(r).toString()},async load(e,t){if(!c(e)||!t)return null;let n=o(new URL(e)),r=t.runtime?.fs?await t.runtime.fs.stat(n):{ok:!1,value:null};if(!r||!r.ok||!r.value||!r.value.isDirectory())return null;let a=await t.runtime.fs.readdir(n);if(!a.ok)throw Error(a.error.message);let s=a.value.filter(e=>e.endsWith(`.json`)),l=[];for(let e of s){let r=i.join(n,e),a=await t.runtime.fs.readFile(r,`utf8`);if(a.ok)try{let e=JSON.parse(a.value);e&&typeof e==`object`&&`files`in e&&Array.isArray(e.files)&&l.push(e)}catch{}}return{items:l,resolvedSource:e}}}}function u(e){return/^file:\/\//i.test(e)}function d(){return{name:`file`,async resolveId(e,t,n){if(u(e))return e;let r;if(t&&u(t)){let n=i.dirname(o(new URL(t)));r=i.resolve(n,e)}else if(t&&i.isAbsolute(t)){let n=i.dirname(t);r=i.resolve(n,e)}else if(i.isAbsolute(e))r=e;else if(n&&e.endsWith(`.json`))r=i.resolve(n.cwd,e);else return null;return s(r).toString()},async load(e,t){if(!u(e)||!t)return null;let n=o(new URL(e)),r=t.runtime?.fs?await t.runtime.fs.stat(n):{ok:!1,value:null};if(!r||!r.ok||!r.value||r.value.isDirectory())return null;let i=await t.runtime.fs.readFile(n,`utf8`);if(!i.ok)throw Error(i.error.message);try{return JSON.parse(i.value)}catch{return i.value}}}}function f(){return{name:`http`,async resolveId(e,t,n){return e.includes(`github.com`)&&e.includes(`/blob/`)&&(e=e.replace(`github.com`,`raw.githubusercontent.com`).replace(`/blob/`,`/`)),e.startsWith(`http://`)||e.startsWith(`https://`)?e:t&&(t.startsWith(`http://`)||t.startsWith(`https://`))?new URL(e,t).toString():null},async load(e,t){if(!e.startsWith(`http://`)&&!e.startsWith(`https://`)||!t)return null;let n=await t.runtime.http.getText(e);if(!n||!n.ok)throw n?.error||Error(`Failed`);try{return JSON.parse(n.value)}catch{return n.value}}}}async function p(e,t){let n=[];for(let o of e)if(typeof o==`string`)try{let e=o;(o.startsWith(`.`)||o.startsWith(`/`))&&(e=i.resolve(t,o));let s=await import(e),c=s.default||s.plugin||s,l=a.parse(r,c);n.push(l)}catch(e){console.warn(`[regpick] Failed to load plugin module: ${o} - ${e.message}`)}else try{let e=a.parse(r,o);n.push(e)}catch(e){console.warn(`[regpick] Invalid plugin provided: ${e.message}`)}return n}const m=a.object({path:a.optional(a.string()),target:a.optional(a.string()),type:a.optional(a.string(),`registry:file`),content:a.optional(a.string()),url:a.optional(a.string())}),h=a.object({name:a.optional(a.string(),`unnamed-item`),title:a.optional(a.string()),description:a.optional(a.string(),``),type:a.optional(a.string(),`registry:file`),dependencies:a.optional(a.array(a.string()),[]),devDependencies:a.optional(a.array(a.string()),[]),registryDependencies:a.optional(a.array(a.string()),[]),files:a.optional(a.array(m),[])});a.object({type:a.string(),originalSource:a.optional(a.string()),pluginState:a.optional(a.record(a.string(),a.unknown()))});function g(e,t){let n=a.parse(h,e),r=n.name===`unnamed-item`&&n.title?n.title:n.name,i=n.title??r,o=n.files.map(e=>({...e,type:e.type===`registry:file`&&n.type!==`registry:file`?n.type:e.type}));return{...n,name:r,title:i,files:o,sourceMeta:t}}const _=a.object({url:a.optional(a.string()),href:a.optional(a.string()),path:a.optional(a.string()),files:a.optional(a.unknown())}),v=a.object({items:a.array(a.union([a.record(a.string(),a.unknown()),_]))});function y(e){let t=a.safeParse(v,e);return t.success?t.output.items.map(e=>{let t=e;return`files`in t&&Array.isArray(t.files)?null:typeof t.url==`string`?t.url:typeof t.href==`string`?t.href:typeof t.path==`string`?t.path:null}).filter(e=>!!e):[]}const b=a.object({files:a.array(a.unknown())});function x(r,i){try{if(Array.isArray(r))return t(r.filter(e=>!!(e&&typeof e==`object`)).map(e=>g(e,i)));let o=a.safeParse(v,r);return o.success?t(o.output.items.filter(e=>`files`in e&&Array.isArray(e.files)).map(e=>g(e,i))):a.safeParse(b,r).success?t([g(r,i)]):n(e(`RegistryError`,`Unsupported manifest structure.`))}catch(t){return a.isValiError(t)?n(e(`ValidationError`,`Manifest validation failed: ${t.message}`)):n(e(`RegistryError`,`Failed to parse manifest`))}}async function S(r,i,a,o){let s=x(r,i);if(!r||typeof r!=`object`||Array.isArray(r))return s;let c=y(r);if(!c.length)return s;let l=s.ok?s.value:[],u=await Promise.all(c.map(async r=>{for(let s of o)if(!(!s.resolveId||!s.load))try{let o=await s.resolveId(r,i.originalSource,{cwd:process.cwd(),runtime:a});if(!o)continue;let c=await s.load(o,{cwd:process.cwd(),runtime:a});if(!c)continue;let l;if(typeof c==`string`)try{l=JSON.parse(c)}catch{return n(e(`RegistryError`,`Failed to parse JSON for ${o}`))}else l=c;return t(l&&typeof l==`object`?g(l,i):null)}catch(t){let i=t instanceof Error?t.message:String(t);return t instanceof Error&&`kind`in t?n(t):n(e(`RegistryError`,`Failed to resolve ${r}: ${i}`,t))}return n(e(`RegistryError`,`Could not resolve reference: ${r}`))})),d=[];for(let e of u){if(!e.ok)return e;e.value&&d.push(e.value)}return t([...l,...d])}async function C(r,i,a,o){if(!r)return n(e(`ValidationError`,`Registry source is required.`));for(let s of o)if(!(!s.resolveId||!s.load))try{let e=await s.resolveId(r,i,{cwd:process.cwd(),runtime:a});if(!e)continue;let c=await s.load(e,{cwd:process.cwd(),runtime:a});if(!c)continue;if(c&&typeof c==`object`&&c.ok===!1)return n(c.error);let l=c&&typeof c==`object`&&`value`in c?c.value:c,u=[];if(l&&typeof l==`object`&&`items`in l&&Array.isArray(l.items))u=l.items;else if(l&&typeof l==`object`&&`rawData`in l){let e=await S(l.rawData,l.sourceMeta,a,o);if(!e.ok)return n(e.error);u=e.value}else if(l&&typeof l==`object`||Array.isArray(l)){let t=await S(l,{type:`system`,originalSource:e},a,o);if(!t.ok)return n(t.error);u=t.value}let d=l.resolvedSource||r;return t({items:u.map(e=>({...e,sourceMeta:{...e.sourceMeta,originalSource:d}})),source:d})}catch(t){let i=t instanceof Error?t.message:String(t);return t&&typeof t==`object`&&`kind`in t?n(t):n(e(`RegistryError`,`Failed to load registry from ${r}: ${i}`,t))}return n(e(`RegistryError`,`No suitable plugin found for source: ${r}`))}async function w(r,i,a,o,s){if(typeof r.content==`string`)return t(r.content);let c=r.url||r.path;if(!c)return n(e(`ValidationError`,`File entry in "${i.name}" is missing both content and path/url.`));for(let r of s)if(!(!r.resolveId||!r.load))try{let e=i.sourceMeta.originalSource||a,n=await r.resolveId(c,e,{cwd:process.cwd(),runtime:o});if(!n)continue;let s=await r.load(n,{cwd:process.cwd(),runtime:o});if(s==null)continue;return t(typeof s==`string`?s:JSON.stringify(s,null,2))}catch(t){return t&&typeof t==`object`&&`kind`in t?n(t):n(e(`RegistryError`,`Failed to load file content for ${c}: ${t instanceof Error?t.message:String(t)}`,t))}return n(e(`RegistryError`,`No suitable plugin found to resolve file content for: ${c}`))}export{d as a,f as i,w as n,l as o,p as r,C as t};
@@ -1 +0,0 @@
1
- function e(e){return{ok:!0,value:e}}function t(e){return{ok:!1,error:e}}export{e as n,t};
@@ -1,2 +0,0 @@
1
- import{t as e}from"./index.mjs";import{n as t,t as n}from"./result-Dmv-uoQK.mjs";import{i as r}from"./config-ChX89ix6.mjs";import{a as i,i as a,n as o,o as s,r as c,t as l}from"./registry-CoxNXsYX.mjs";import{a as u,i as d,n as f,o as p,r as m,s as h,t as g}from"./add-rEVW6oa_.mjs";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,n,r,i,a,o){let s=[],c=[];for(let{file:e,content:t}of r){let r=d(t,o);s.push(r);let i=u(n,e,a,o);if(!i.ok)return i;c.push({target:i.value.absoluteTarget,content:r})}let l=g(s.sort().join(``));return t({itemName:e,status:l===i?`up-to-date`:`requires-diff-prompt`,newHash:l,files:c})}async function b(i){let[a,o]=await Promise.all([r(i.cwd),f(i.cwd,i.runtime)]);return a.configPath?t({config:a.config,lockfile:o}):(i.runtime.prompt.error(`No regpick.json configuration found. Please run 'init' first.`),n(e(`ValidationError`,`No config file found`)))}async function x(e,n,r,i){let a=v(r),s=[];for(let[t,c]of Object.entries(a)){let a=await l(t,e.cwd,e.runtime,i);if(!a.ok){e.runtime.prompt.warn(`Failed to load registry ${t}`);continue}let u=a.value.items;for(let t of c){let a=u.find(e=>e.name===t);if(!a)continue;let c=(await Promise.all(a.files.map(async t=>{let n=await o(t,a,e.cwd,e.runtime,i);return n.ok?{file:t,content:n.value}:null}))).filter(e=>e!==null),l=r.components[t].hash,d=y(t,a,c,l,e.cwd,n);if(!d.ok)continue;let f=d.value;if(f.status===`requires-diff-prompt`){let n=[];for(let t of f.files){let r=await e.runtime.fs.readFile(t.target,`utf8`);n.push({target:t.target,remoteContent:t.content,localContent:r.ok?r.value:``})}s.push({itemName:t,newHash:f.newHash,files:n})}}}return t(s)}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,n){let r=[];for(let t of n){e.runtime.prompt.info(`Update available for ${t.itemName}`);let n=await e.runtime.prompt.select({message:`What do you want to do with ${t.itemName}?`,options:[{value:`diff`,label:`Show diff`},{value:`update`,label:`Update`},{value:`skip`,label:`Skip`}]});if(!(await e.runtime.prompt.isCancel(n)||n===`skip`)){if(n===`diff`){for(let e of t.files)console.log(_(`bold`,`\nDiff for ${e.target}:`)),await S(e.localContent,e.remoteContent);let n=await e.runtime.prompt.confirm({message:`Update ${t.itemName} now?`,initialValue:!0});if(await e.runtime.prompt.isCancel(n)||!n)continue}r.push(t)}}return t({approvedUpdates:r})}async function w(r){let o=await b(r);if(!o.ok)return n(o.error);if(Object.keys(o.value.lockfile.components).length===0)return r.runtime.prompt.info(`No components installed. Nothing to update.`),t({kind:`noop`,message:`No components to update.`});let l=[...await c(o.value.config.plugins||[],r.cwd),a(),i(),s()],u=await x(r,o.value.config,o.value.lockfile,l);if(!u.ok)return n(u.error);if(u.value.length===0)return t({kind:`noop`,message:`All components are up to date.`});let d;if(d=r.args?.flags?.yes?t({approvedUpdates:u.value}):await C(r,u.value),!d.ok)return n(d.error);let f=d.value.approvedUpdates.length;if(f===0)return t({kind:`noop`,message:`No updates approved.`});let g=JSON.parse(JSON.stringify(o.value.lockfile)),_=[];for(let e of d.value.approvedUpdates){for(let t of e.files)_.push({id:t.target,code:t.remoteContent});g.components[e.itemName].hash=e.newHash}let v=o.value.config.plugins?.filter(e=>typeof e==`object`)||[],y=new p,S=new h([...v,{name:`regpick:core-update`,async finish(e){`flushToDisk`in e.vfs&&await e.vfs.flushToDisk(),await m(e.cwd,g,r.runtime)}}]);try{await S.run({vfs:y,cwd:r.cwd,runtime:r.runtime},_)}catch(t){return y.rollback(),r.runtime.prompt.error(`[Failed] Update aborted: ${t}`),n(e(`RuntimeError`,String(t)))}return t({kind:`success`,message:`Updated ${f} components.`})}export{w as runUpdateCommand};