regpick 0.6.2 → 0.6.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.
@@ -0,0 +1 @@
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,n as a,r as o,t as s}from"./aliasCore-8ZASFnrn.mjs";import{n as c,r as l}from"./config-BFyeS-_Z.mjs";import{n as u,t as d}from"./registry-fWDewXBZ.mjs";import f from"node:path";function p(e){return[...new Set(e.filter(Boolean))]}function m(e){return{dependencies:p(e.flatMap(e=>e.dependencies||[])),devDependencies:p(e.flatMap(e=>e.devDependencies||[]))}}function h(e,n,i,a=new Set){let o=[],s=[];for(let t of e)for(let e of t.files){let c=r(t,e,n,i);if(!c.ok)return c;let{absoluteTarget:l,relativeTarget:u}=c.value,d={itemName:t.name,sourceFile:e,absoluteTarget:l,relativeTarget:u};o.push(d),a.has(l)&&s.push(d)}return t({selectedItems:e,plannedWrites:o,dependencyPlan:m(e),conflicts:s})}function g(e){return e?String(e).split(`,`).map(e=>e.trim()).filter(Boolean):[]}function _(r,i){let{flags:a}=i.args,o=g(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)}function v(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}function y(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}function b(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}const x={npm:{manager:`npm`,buildInstallCommands:v},yarn:{manager:`yarn`,buildInstallCommands:y},pnpm:{manager:`pnpm`,buildInstallCommands:b}};function S(e){return x[e]}function C(e){return[...new Set(e.filter(Boolean))]}function w(e,t,n){let r=f.join(t,`package.json`);if(!n.fs.existsSync(r))return{missingDependencies:[],missingDevDependencies:[]};let i=n.fs.readJsonSync(r),a=i.ok?i.value:{},o={...a.dependencies||{},...a.devDependencies||{},...a.peerDependencies||{}},s=C(e.flatMap(e=>e.dependencies||[])),c=C(e.flatMap(e=>e.devDependencies||[]));return{missingDependencies:s.filter(e=>!o[e]),missingDevDependencies:c.filter(e=>!o[e])}}function T(r,i,a,o,s){if(!a.length&&!o.length)return t(void 0);let c=S(i).buildInstallCommands(a,o);for(let t of c)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)}function E(e,t,n){return t&&t!==`auto`?t:n.fs.existsSync(f.join(e,`pnpm-lock.yaml`))?`pnpm`:n.fs.existsSync(f.join(e,`yarn.lock`))?`yarn`:(n.fs.existsSync(f.join(e,`package-lock.json`)),`npm`)}async function D(r,i,a){let o=a[1];if(o)return t(l(o,i));let s=Object.entries(i.registries||{}).map(([e,t])=>({label:`${e} -> ${t}`,value:e}));if(s.length){let a=await r.runtime.prompt.multiselect({message:`Pick registry alias (or cancel and provide URL/path manually)`,options:s,maxItems:1,required:!1});if(r.runtime.prompt.isCancel(a))return n(e(`UserCancelled`,`Operation cancelled.`));if(Array.isArray(a)&&a.length>0)return t(l(String(a[0]),i))}let c=await r.runtime.prompt.text({message:`Registry URL/path:`,placeholder:`https://example.com/registry.json`});return r.runtime.prompt.isCancel(c)?n(e(`UserCancelled`,`Operation cancelled.`)):t(String(c))}function O(e){return e.map(e=>({value:e.name,label:`${e.name} (${e.type||`registry:file`})`,hint:e.description||`${e.files.length} file(s)`}))}async function k(r,i){if(!i.length)return t([]);let a=await r.runtime.prompt.autocompleteMultiselect({message:`Select items to install`,options:O(i),maxItems:10,required:!0});if(r.runtime.prompt.isCancel(a))return n(e(`UserCancelled`,`Operation cancelled.`));let o=Array.isArray(a)?a:[],s=new Set(o.map(e=>String(e)));return t(i.filter(e=>s.has(e.name)))}async function A(r){let l=!!r.args.flags.yes,{config:p}=await c(r.cwd),m=await D(r,p,r.args.positionals);if(!m.ok)return m;let g=m.value;if(!g)return t({kind:`noop`,message:`No registry source provided.`});let v=await d(g,r.cwd,r.runtime);if(!v.ok)return v;let{items:y}=v.value;if(!y.length)return r.runtime.prompt.warn(`No installable items in registry.`),t({kind:`noop`,message:`No installable items in registry.`});let b=_(y,r),x=b.ok&&b.value?b:await k(r,y);if(!x.ok)return x;let S=x.value;if(!S||!S.length)return r.runtime.prompt.warn(`No items selected.`),t({kind:`noop`,message:`No items selected.`});if(!l){let t=await r.runtime.prompt.confirm({message:`Install ${S.length} item(s)?`,initialValue:!0});if(r.runtime.prompt.isCancel(t)||!t)return n(e(`UserCancelled`,`Operation cancelled.`))}let C=new Set,O=h(S,r.cwd,p);if(!O.ok)return O;let A=O.value;for(let e of A.plannedWrites)await r.runtime.fs.pathExists(e.absoluteTarget)&&C.add(e.absoluteTarget);let j=h(S,r.cwd,p,C);if(!j.ok)return j;let M=j.value,N=[];for(let t of M.plannedWrites)if(C.has(t.absoluteTarget))if(l||p.overwritePolicy===`overwrite`)N.push(t);else if(p.overwritePolicy===`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(r.runtime.prompt.isCancel(i)||i===`abort`)return n(e(`UserCancelled`,`Installation aborted by user.`));i===`overwrite`&&N.push(t)}else N.push(t);let{missingDependencies:P,missingDevDependencies:F}=w(S,r.cwd,r.runtime),I=!1;if(P.length||F.length)if(l)I=!0;else{let t=E(r.cwd,p.packageManager,r.runtime),i=[];P.length&&i.push(`dependencies: ${P.join(`, `)}`),F.length&&i.push(`devDependencies: ${F.join(`, `)}`);let a=await r.runtime.prompt.confirm({message:`Install missing packages with ${t}? (${i.join(` | `)})`,initialValue:!0});if(r.runtime.prompt.isCancel(a))return n(e(`UserCancelled`,`Dependency installation cancelled by user.`));I=!!a,I||r.runtime.prompt.warn(`Skipped dependency installation.`)}let L=0,R=await o(r.cwd,r.runtime),z={};for(let e of N){let t=S.find(t=>t.name===e.itemName);if(!t)continue;let n=await u(e.sourceFile,t,r.cwd,r.runtime);if(!n.ok)return n;let i=s(n.value,p),o=await r.runtime.fs.ensureDir(f.dirname(e.absoluteTarget));if(!o.ok)return o;let c=await r.runtime.fs.writeFile(e.absoluteTarget,i,`utf8`);if(!c.ok)return c;let l=a(i);z[t.name]||(z[t.name]=[]),z[t.name].push(l),L+=1,r.runtime.prompt.success(`Wrote ${e.relativeTarget}`)}if(L>0){for(let[e,t]of Object.entries(z)){let n=a(t.sort().join(``));R.components[e]={source:g,hash:n}}await i(r.cwd,R,r.runtime)}if(I){let e=E(r.cwd,p.packageManager,r.runtime),t=T(r.cwd,e,P,F,r.runtime);if(!t.ok)return t}return r.runtime.prompt.info(`Installed ${S.length} item(s), wrote ${L} file(s).`),t({kind:`success`,message:`Installed ${S.length} item(s), wrote ${L} file(s).`})}export{A as runAddCommand};
@@ -0,0 +1 @@
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";import i from"node:crypto";function a(e){return e.replace(/\\/g,`/`)}function o(i,a,o){let s=`${r.resolve(i)}${r.sep}`,c=r.resolve(a);return o?t(void 0):c!==r.resolve(i)&&!c.startsWith(s)?n(e(`ValidationError`,`Refusing to write outside project: ${c}`)):t(void 0)}function s(e,n,i,s){let c=n.type||e.type||`registry:file`,l=s.targetsByType?.[c],u=s.preferManifestTarget!==!1,d=r.basename(n.path||`${e.name}.txt`),f;f=u&&n.target?n.target:l?r.join(l,d):n.target?n.target:r.join(`src`,d);let p=r.resolve(i,f),m=o(i,p,!!s.allowOutsideProject);return m.ok?t({absoluteTarget:p,relativeTarget:a(r.relative(i,p))}):m}function c(e){return r.join(e,`regpick-lock.json`)}async function l(e,t){let n=c(e);if(!await t.fs.pathExists(n))return{components:{}};let r=t.fs.readJsonSync(n);return r.ok?r.value:{components:{}}}async function u(e,t,n){let r=c(e);await n.fs.writeJson(r,t,{spaces:2})}function d(e){return i.createHash(`sha256`).update(e).digest(`hex`)}function f(e,t){let n=e;for(let[e,r]of Object.entries(t.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}export{s as a,u as i,d as n,l as r,f as t};
@@ -0,0 +1 @@
1
+ import e from"node:path";import t from"node:fs/promises";import{loadConfig as n}from"unconfig";const r={registries:{tebra:`./tebra-icon-registry/registry`},targetsByType:{"registry:icon":`src/components/ui/icons`,"registry:component":`src/components/ui`,"registry:file":`src/components/ui`},aliases:{},overwritePolicy:`prompt`,packageManager:`auto`,preferManifestTarget:!0,allowOutsideProject:!1};function i(t){return e.join(t,`regpick.json`)}async function a(e){let{config:t,sources:i}=await n({sources:[{files:[`regpick`,`.regpickrc`,`regpickrc`],extensions:[`json`,``]}],defaults:r,cwd:e});return i.length?{config:{...r,...t,registries:{...r.registries,...t.registries||{}},targetsByType:{...r.targetsByType,...t.targetsByType||{}},aliases:{...r.aliases,...t.aliases||{}}},configPath:i[0]}:{config:{...r},configPath:null}}async function o(e,n,{overwrite:r=!1}={}){let a=i(e),o=!1;try{await t.access(a),o=!0}catch{}return o&&!r?{filePath:a,written:!1}:(await t.writeFile(a,JSON.stringify(n,null,2),`utf8`),{filePath:a,written:!0})}function s(e,t){return e?t.registries[e]?String(t.registries[e]):e:null}export{o as i,a as n,s as r,i as t};
package/dist/index.mjs CHANGED
@@ -1,5 +1,4 @@
1
- import e from"node:path";import{styleText as t}from"node:util";import n from"node:fs/promises";import{loadConfig as r}from"unconfig";import{fileURLToPath as i}from"node:url";import a from"node:crypto";import*as o from"diff";import s from"node:fs";import{autocompleteMultiselect as c,cancel as l,confirm as u,intro as d,isCancel as f,log as p,multiselect as m,outro as h,select as g,text as _}from"@clack/prompts";import{spawnSync as v}from"node:child_process";function y(e,t,n){return{kind:e,message:t,cause:n}}function b(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?y(t,e.message,e):y(t,String(e))}function x(e){return{ok:!0,value:e}}function S(e){return{ok:!1,error:e}}function C(e){return e.replace(/\\/g,`/`)}function w(t,n,r){let i=`${e.resolve(t)}${e.sep}`,a=e.resolve(n);return r?x(void 0):a!==e.resolve(t)&&!a.startsWith(i)?S(y(`ValidationError`,`Refusing to write outside project: ${a}`)):x(void 0)}function T(t,n,r,i){let a=n.type||t.type||`registry:file`,o=i.targetsByType?.[a],s=i.preferManifestTarget!==!1,c=e.basename(n.path||`${t.name}.txt`),l;l=s&&n.target?n.target:o?e.join(o,c):n.target?n.target:e.join(`src`,c);let u=e.resolve(r,l),d=w(r,u,!!i.allowOutsideProject);return d.ok?x({absoluteTarget:u,relativeTarget:C(e.relative(r,u))}):d}function E(e){return[...new Set(e.filter(Boolean))]}function D(e){return{dependencies:E(e.flatMap(e=>e.dependencies||[])),devDependencies:E(e.flatMap(e=>e.devDependencies||[]))}}function O(e,t,n,r=new Set){let i=[],a=[];for(let o of e)for(let e of o.files){let s=T(o,e,t,n);if(!s.ok)return s;let{absoluteTarget:c,relativeTarget:l}=s.value,u={itemName:o.name,sourceFile:e,absoluteTarget:c,relativeTarget:l};i.push(u),r.has(c)&&a.push(u)}return x({selectedItems:e,plannedWrites:i,dependencyPlan:D(e),conflicts:a})}function ee(e){return e?String(e).split(`,`).map(e=>e.trim()).filter(Boolean):[]}function te(e,t){let{flags:n}=t.args,r=ee(n.select);if(n.all)return x(e);if(r.length){let t=e.filter(e=>r.includes(e.name));return t.length?x(t):S(y(`ValidationError`,`No items matched --select=${String(n.select)}`))}return x(null)}const k={registries:{tebra:`./tebra-icon-registry/registry`},targetsByType:{"registry:icon":`src/components/ui/icons`,"registry:component":`src/components/ui`,"registry:file":`src/components/ui`},aliases:{},overwritePolicy:`prompt`,packageManager:`auto`,preferManifestTarget:!0,allowOutsideProject:!1};function A(t){return e.join(t,`regpick.json`)}async function j(e){let{config:t,sources:n}=await r({sources:[{files:[`regpick`,`.regpickrc`,`regpickrc`],extensions:[`json`,``]}],defaults:k,cwd:e});return n.length?{config:{...k,...t,registries:{...k.registries,...t.registries||{}},targetsByType:{...k.targetsByType,...t.targetsByType||{}},aliases:{...k.aliases,...t.aliases||{}}},configPath:n[0]}:{config:{...k},configPath:null}}async function ne(e,t,{overwrite:r=!1}={}){let i=A(e),a=!1;try{await n.access(i),a=!0}catch{}return a&&!r?{filePath:i,written:!1}:(await n.writeFile(i,JSON.stringify(t,null,2),`utf8`),{filePath:i,written:!0})}function M(e,t){return e?t.registries[e]?String(t.registries[e]):e:null}function N(e){return e?Array.isArray(e)?e.filter(e=>typeof e==`string`):typeof e==`string`?[e]:[]:[]}function P(e){return Array.isArray(e)?e.filter(e=>!!(e&&typeof e==`object`)):[]}function F(e,t){let n=P(e.files).map(t=>({path:typeof t.path==`string`?t.path:void 0,target:typeof t.target==`string`?t.target:void 0,type:typeof t.type==`string`?t.type:typeof e.type==`string`?e.type:`registry:file`,content:typeof t.content==`string`?t.content:void 0,url:typeof t.url==`string`?t.url:void 0})),r=typeof e.name==`string`?e.name:typeof e.title==`string`?e.title:`unnamed-item`;return{name:r,title:typeof e.title==`string`?e.title:r,description:typeof e.description==`string`?e.description:``,type:typeof e.type==`string`?e.type:`registry:file`,dependencies:N(e.dependencies),devDependencies:N(e.devDependencies),registryDependencies:N(e.registryDependencies),files:n,sourceMeta:t}}function re(e){return P(e.items).map(e=>Array.isArray(e.files)?null:typeof e.url==`string`?e.url:typeof e.href==`string`?e.href:typeof e.path==`string`?e.path:null).filter(e=>!!e)}function ie(e,t){return Array.isArray(e)?x(e.filter(e=>!!(e&&typeof e==`object`)).map(e=>F(e,t))):e&&typeof e==`object`&&Array.isArray(e.items)?x(P(e.items).filter(e=>Array.isArray(e.files)).map(e=>F(e,t))):e&&typeof e==`object`&&Array.isArray(e.files)?x([F(e,t)]):S(y(`RegistryError`,`Unsupported manifest structure.`))}function I(e){return/^https?:\/\//i.test(e)}function L(e){return/^file:\/\//i.test(e)}function R(e,t){return new URL(t,e).toString()}async function z(t,n,r){let i=ie(t,n);if(!t||typeof t!=`object`||Array.isArray(t))return i;let a=re(t);if(!a.length)return i;let o=i.ok?i.value:[],s=[];for(let t of a){let i;if(I(t)){let e=await r.http.getJson(t);if(!e.ok)return S(e.error);i=e.value}else if(n.type===`http`&&n.baseUrl){let e=await r.http.getJson(R(n.baseUrl,t));if(!e.ok)return S(e.error);i=e.value}else if((n.type===`file`||n.type===`directory`)&&n.baseDir){let a=await r.fs.readFile(e.resolve(n.baseDir,t),`utf8`);if(!a.ok)return S(a.error);try{i=JSON.parse(a.value)}catch{return S(y(`RegistryError`,`Invalid JSON: ${t}`))}}else{let n=await r.fs.readFile(e.resolve(t),`utf8`);if(!n.ok)return S(n.error);try{i=JSON.parse(n.value)}catch{return S(y(`RegistryError`,`Invalid JSON: ${t}`))}}i&&typeof i==`object`&&s.push(F(i,n))}return x([...o,...s])}async function ae(t,n){let r=e.resolve(t),i=await n.fs.readdir(r);if(!i.ok)return S(i.error);let a=i.value.filter(e=>e.endsWith(`.json`)),o=[];for(let t of a){let i=e.join(r,t),a=await n.fs.readFile(i,`utf8`);if(!a.ok)return S(a.error);let s;try{s=JSON.parse(a.value)}catch{continue}!s||typeof s!=`object`||!Array.isArray(s.files)||o.push(F(s,{type:`directory`,baseDir:r}))}return x(o)}async function B(t,n,r){if(!t)return S(y(`ValidationError`,`Registry source is required.`));let a=I(t)||L(t)?t:e.resolve(n,t);if(I(a)){let e=await r.http.getJson(a);if(!e.ok)return S(e.error);let t=a.endsWith(`/`)?a:a.replace(/[^/]*$/,``),n=await z(e.value,{type:`http`,baseUrl:t},r);return n.ok?x({items:n.value,source:a}):S(n.error)}let o=L(a)?i(new URL(a)):e.resolve(a),s=await r.fs.stat(o);if(!s.ok)return S(y(`RegistryError`,`Registry source not found: ${t}`));if(s.value.isDirectory()){let e=await ae(o,r);return e.ok?x({items:e.value,source:o}):S(e.error)}let c=await r.fs.readFile(o,`utf8`);if(!c.ok)return S(c.error);let l;try{l=JSON.parse(c.value)}catch(e){return S(y(`RegistryError`,`Failed to parse registry JSON.`,e))}let u=await z(l,{type:`file`,baseDir:e.dirname(o)},r);return u.ok?x({items:u.value,source:o}):S(u.error)}async function V(t,n,r,i){if(typeof t.content==`string`)return x(t.content);let a=t.url||t.path;if(!a)return S(y(`ValidationError`,`File entry in "${n.name}" is missing both content and path/url.`));if(I(a))return await i.http.getText(a);if(n.sourceMeta.type===`http`&&n.sourceMeta.baseUrl){let e=R(n.sourceMeta.baseUrl,a);return await i.http.getText(e)}let o=n.sourceMeta.baseDir&&!e.isAbsolute(a)?e.resolve(n.sourceMeta.baseDir,a):e.resolve(r,a);return await i.fs.readFile(o,`utf8`)}function oe(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}function se(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}function ce(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}const le={npm:{manager:`npm`,buildInstallCommands:oe},yarn:{manager:`yarn`,buildInstallCommands:se},pnpm:{manager:`pnpm`,buildInstallCommands:ce}};function H(e){return le[e]}function U(e){return[...new Set(e.filter(Boolean))]}function ue(t,n,r){let i=e.join(n,`package.json`);if(!r.fs.existsSync(i))return{missingDependencies:[],missingDevDependencies:[]};let a=r.fs.readJsonSync(i),o=a.ok?a.value:{},s={...o.dependencies||{},...o.devDependencies||{},...o.peerDependencies||{}},c=U(t.flatMap(e=>e.dependencies||[])),l=U(t.flatMap(e=>e.devDependencies||[]));return{missingDependencies:c.filter(e=>!s[e]),missingDevDependencies:l.filter(e=>!s[e])}}function de(e,t,n,r,i){if(!n.length&&!r.length)return x(void 0);let a=H(t).buildInstallCommands(n,r);for(let t of a)if(i.process.run(t.command,t.args,e).status!==0)return S(y(`InstallError`,`Dependency install failed: ${t.command} ${t.args.join(` `)}`));return x(void 0)}function W(t,n,r){return n&&n!==`auto`?n:r.fs.existsSync(e.join(t,`pnpm-lock.yaml`))?`pnpm`:r.fs.existsSync(e.join(t,`yarn.lock`))?`yarn`:(r.fs.existsSync(e.join(t,`package-lock.json`)),`npm`)}function G(t){return e.join(t,`regpick-lock.json`)}async function K(e,t){let n=G(e);if(!await t.fs.pathExists(n))return{components:{}};let r=t.fs.readJsonSync(n);return r.ok?r.value:{components:{}}}async function q(e,t,n){let r=G(e);await n.fs.writeJson(r,t,{spaces:2})}function J(e){return a.createHash(`sha256`).update(e).digest(`hex`)}function Y(e,t){let n=e;for(let[e,r]of Object.entries(t.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}async function fe(e,t,n){let r=n[1];if(r)return x(M(r,t));let i=Object.entries(t.registries||{}).map(([e,t])=>({label:`${e} -> ${t}`,value:e}));if(i.length){let n=await e.runtime.prompt.multiselect({message:`Pick registry alias (or cancel and provide URL/path manually)`,options:i,maxItems:1,required:!1});if(e.runtime.prompt.isCancel(n))return S(y(`UserCancelled`,`Operation cancelled.`));if(Array.isArray(n)&&n.length>0)return x(M(String(n[0]),t))}let a=await e.runtime.prompt.text({message:`Registry URL/path:`,placeholder:`https://example.com/registry.json`});return e.runtime.prompt.isCancel(a)?S(y(`UserCancelled`,`Operation cancelled.`)):x(String(a))}function pe(e){return e.map(e=>({value:e.name,label:`${e.name} (${e.type||`registry:file`})`,hint:e.description||`${e.files.length} file(s)`}))}async function me(e,t){if(!t.length)return x([]);let n=await e.runtime.prompt.autocompleteMultiselect({message:`Select items to install`,options:pe(t),maxItems:10,required:!0});if(e.runtime.prompt.isCancel(n))return S(y(`UserCancelled`,`Operation cancelled.`));let r=Array.isArray(n)?n:[],i=new Set(r.map(e=>String(e)));return x(t.filter(e=>i.has(e.name)))}async function he(t){let n=!!t.args.flags.yes,{config:r}=await j(t.cwd),i=await fe(t,r,t.args.positionals);if(!i.ok)return i;let a=i.value;if(!a)return x({kind:`noop`,message:`No registry source provided.`});let o=await B(a,t.cwd,t.runtime);if(!o.ok)return o;let{items:s}=o.value;if(!s.length)return t.runtime.prompt.warn(`No installable items in registry.`),x({kind:`noop`,message:`No installable items in registry.`});let c=te(s,t),l=c.ok&&c.value?c:await me(t,s);if(!l.ok)return l;let u=l.value;if(!u||!u.length)return t.runtime.prompt.warn(`No items selected.`),x({kind:`noop`,message:`No items selected.`});if(!n){let e=await t.runtime.prompt.confirm({message:`Install ${u.length} item(s)?`,initialValue:!0});if(t.runtime.prompt.isCancel(e)||!e)return S(y(`UserCancelled`,`Operation cancelled.`))}let d=new Set,f=O(u,t.cwd,r);if(!f.ok)return f;let p=f.value;for(let e of p.plannedWrites)await t.runtime.fs.pathExists(e.absoluteTarget)&&d.add(e.absoluteTarget);let m=O(u,t.cwd,r,d);if(!m.ok)return m;let h=m.value,g=[];for(let e of h.plannedWrites)if(d.has(e.absoluteTarget))if(n||r.overwritePolicy===`overwrite`)g.push(e);else if(r.overwritePolicy===`skip`)t.runtime.prompt.warn(`Skipped existing file: ${e.absoluteTarget}`);else{let n=await t.runtime.prompt.select({message:`File exists: ${e.absoluteTarget}`,options:[{value:`overwrite`,label:`Overwrite this file`},{value:`skip`,label:`Skip this file`},{value:`abort`,label:`Abort installation`}]});if(t.runtime.prompt.isCancel(n)||n===`abort`)return S(y(`UserCancelled`,`Installation aborted by user.`));n===`overwrite`&&g.push(e)}else g.push(e);let{missingDependencies:_,missingDevDependencies:v}=ue(u,t.cwd,t.runtime),b=!1;if(_.length||v.length)if(n)b=!0;else{let e=W(t.cwd,r.packageManager,t.runtime),n=[];_.length&&n.push(`dependencies: ${_.join(`, `)}`),v.length&&n.push(`devDependencies: ${v.join(`, `)}`);let i=await t.runtime.prompt.confirm({message:`Install missing packages with ${e}? (${n.join(` | `)})`,initialValue:!0});if(t.runtime.prompt.isCancel(i))return S(y(`UserCancelled`,`Dependency installation cancelled by user.`));b=!!i,b||t.runtime.prompt.warn(`Skipped dependency installation.`)}let C=0,w=await K(t.cwd,t.runtime),T={};for(let n of g){let i=u.find(e=>e.name===n.itemName);if(!i)continue;let a=await V(n.sourceFile,i,t.cwd,t.runtime);if(!a.ok)return a;let o=Y(a.value,r),s=await t.runtime.fs.ensureDir(e.dirname(n.absoluteTarget));if(!s.ok)return s;let c=await t.runtime.fs.writeFile(n.absoluteTarget,o,`utf8`);if(!c.ok)return c;let l=J(o);T[i.name]||(T[i.name]=[]),T[i.name].push(l),C+=1,t.runtime.prompt.success(`Wrote ${n.relativeTarget}`)}if(C>0){for(let[e,t]of Object.entries(T)){let n=J(t.sort().join(``));w.components[e]={source:a,hash:n}}await q(t.cwd,w,t.runtime)}if(b){let e=W(t.cwd,r.packageManager,t.runtime),n=de(t.cwd,e,_,v,t.runtime);if(!n.ok)return n}return t.runtime.prompt.info(`Installed ${u.length} item(s), wrote ${C} file(s).`),x({kind:`success`,message:`Installed ${u.length} item(s), wrote ${C} file(s).`})}function ge(e,t){return e?`cancelled`:t?`overwrite`:`keep`}async function _e(e){let t=A(e.cwd),n=await e.runtime.fs.stat(t);if(n.ok){let n=await e.runtime.prompt.confirm({message:`${t} already exists. Overwrite?`,initialValue:!1}),r=ge(e.runtime.prompt.isCancel(n),!!n);if(r===`cancelled`)return S(y(`UserCancelled`,`Operation cancelled.`));if(r===`keep`)return e.runtime.prompt.info(`Keeping existing configuration.`),x({kind:`noop`,message:`Keeping existing configuration.`})}let{config:r}=await j(e.cwd),i=await e.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`}]});if(e.runtime.prompt.isCancel(i))return S(y(`UserCancelled`,`Operation cancelled.`));let a=await e.runtime.prompt.text({message:`W jakim folderze trzymasz komponenty UI?`,placeholder:`src/components/ui`});if(e.runtime.prompt.isCancel(a))return S(y(`UserCancelled`,`Operation cancelled.`));let o=await e.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)`}]});if(e.runtime.prompt.isCancel(o))return S(y(`UserCancelled`,`Operation cancelled.`));let s={...r,packageManager:String(i),overwritePolicy:String(o),targetsByType:{...r.targetsByType,"registry:component":String(a||`src/components/ui`),"registry:file":String(a||`src/components/ui`),"registry:icon":`${String(a||`src/components/ui`)}/icons`}};return await ne(e.cwd,s,{overwrite:!0}),e.runtime.prompt.success(`${n.ok?`Overwrote`:`Created`} ${t}`),x({kind:`success`,message:`${n.ok?`Overwrote`:`Created`} ${t}`})}function X(e,t){return e?t[e]?String(t[e]):e:null}function ve(e,t){let n=X(e,t);if(n)return{source:n,requiresPrompt:!1};let r=Object.keys(t)[0];return r?{source:X(r,t),requiresPrompt:!1}:{source:null,requiresPrompt:!0}}function ye(e){let t=e.type||`registry:file`,n=Array.isArray(e.files)?e.files.length:0;return`${e.name} (${t}, files: ${n})`}async function be(e){let{config:t}=await j(e.cwd),n=ve(e.args.positionals[1],t.registries),r=n.source;if(n.requiresPrompt){let t=await e.runtime.prompt.text({message:`Registry URL/path:`,placeholder:`https://example.com/registry.json`});if(e.runtime.prompt.isCancel(t))return S(y(`UserCancelled`,`Operation cancelled.`));r=String(t)}if(!r)return x({kind:`noop`,message:`No registry source provided.`});let i=await B(r,e.cwd,e.runtime);if(!i.ok)return i;let{items:a}=i.value;if(!a.length)return e.runtime.prompt.warn(`No items found in registry.`),x({kind:`noop`,message:`No items found in registry.`});e.runtime.prompt.info(`Found ${a.length} items.`);for(let e of a)console.log(`- ${ye(e)}`);return x({kind:`success`,message:`Listed ${a.length} item(s).`})}function xe(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)}async function Se(t,n){let r=[];async function i(t){let a=await n.runtime.fs.readdir(t);if(!a.ok)return a;for(let o of a.value){let a=e.join(t,o),s=await n.runtime.fs.stat(a);if(!s.ok)return s;if(s.value.isDirectory()){let e=await i(a);if(!e.ok)return e}else (a.endsWith(`.ts`)||a.endsWith(`.tsx`))&&r.push(a)}return x(void 0)}let a=await i(t);return a.ok?x(r):S(a.error)}async function Ce(t){let n=t.args.positionals[1]||`.`,r=e.resolve(t.cwd,n),i=await t.runtime.fs.stat(r);if(!i.ok||!i.value.isDirectory())return S(y(`ValidationError`,`Target is not a directory: ${r}`));t.runtime.prompt.info(`Scanning ${r} for components...`);let a=await Se(r,t);if(!a.ok)return a;let o=a.value;if(o.length===0)return t.runtime.prompt.warn(`No .ts or .tsx files found.`),x({kind:`noop`,message:`No files found.`});let s=[];for(let n of o){let i=await t.runtime.fs.readFile(n,`utf8`);if(!i.ok)return S(i.error);let a=xe(i.value),o=e.relative(r,n).replace(/\\/g,`/`),c=e.basename(n,e.extname(n));s.push({name:c,title:c,description:`Packed component`,type:`registry:component`,dependencies:a,devDependencies:[],registryDependencies:[],files:[{path:o,type:`registry:component`}]})}let c={items:s},l=e.join(t.cwd,`registry.json`),u=await t.runtime.fs.writeJson(l,c,{spaces:2});return u.ok?(t.runtime.prompt.success(`Packed ${s.length} components into registry.json`),x({kind:`success`,message:`Generated registry.json`})):S(u.error)}function we(e,n){let r=o.diffLines(e,n);for(let e of r){let n=e.added?`green`:e.removed?`red`:`gray`,r=e.added?`+ `:e.removed?`- `:` `,i=e.value.replace(/\n$/,``).split(`
2
- `);for(let e of i)console.log(t(n,`${r}${e}`))}}async function Z(n){let r=await K(n.cwd,n.runtime),i=Object.keys(r.components);if(i.length===0)return n.runtime.prompt.info(`No components installed. Nothing to update.`),x({kind:`noop`,message:`No components to update.`});let{config:a}=await j(n.cwd),o={};for(let e of i){let t=r.components[e].source;t&&(o[t]||(o[t]=[]),o[t].push(e))}let s=0;for(let[i,c]of Object.entries(o)){let o=await B(i,n.cwd,n.runtime);if(!o.ok){n.runtime.prompt.warn(`Failed to load registry ${i}`);continue}let l=o.value.items;for(let i of c){let o=l.find(e=>e.name===i);if(!o)continue;let c=[],u=[];for(let e of o.files){let t=await V(e,o,n.cwd,n.runtime);if(!t.ok)continue;let r=Y(t.value,a);c.push(r);let i=T(o,e,n.cwd,a);i.ok&&u.push({target:i.value.absoluteTarget,content:r})}let d=J(c.sort().join(``));if(d!==r.components[i].hash){n.runtime.prompt.info(`Update available for ${i}`);let a=await n.runtime.prompt.select({message:`What do you want to do with ${i}?`,options:[{value:`diff`,label:`Show diff`},{value:`update`,label:`Update`},{value:`skip`,label:`Skip`}]});if(n.runtime.prompt.isCancel(a)||a===`skip`)continue;if(a===`diff`){for(let e of u){let r=await n.runtime.fs.readFile(e.target,`utf8`),i=r.ok?r.value:``;console.log(t(`bold`,`\nDiff for ${e.target}:`)),we(i,e.content)}let e=await n.runtime.prompt.confirm({message:`Update ${i} now?`,initialValue:!0});if(n.runtime.prompt.isCancel(e)||!e)continue}for(let t of u){let r=await n.runtime.fs.ensureDir(e.dirname(t.target));if(!r.ok)return r;let i=await n.runtime.fs.writeFile(t.target,t.content,`utf8`);if(!i.ok)return i}r.components[i].hash=d,s++,n.runtime.prompt.success(`Updated ${i}`)}}}return s>0?(await q(n.cwd,r,n.runtime),x({kind:`success`,message:`Updated ${s} components.`})):x({kind:`noop`,message:`All components are up to date.`})}function Te(e){return e===`true`?!0:e===`false`?!1:e}function Ee(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]=Te(e.slice(i+1))}return{flags:t,positionals:n}}const De=e=>({fs:{existsSync:e=>s.existsSync(e),pathExists:async e=>{try{return await n.access(e),!0}catch{return!1}},ensureDir:async e=>{try{return await n.mkdir(e,{recursive:!0}),x(void 0)}catch(t){return S(y(`RuntimeError`,`Failed to ensure directory: ${e}`,t))}},writeFile:async(e,t,r)=>{try{return await n.writeFile(e,t,r),x(void 0)}catch(t){return S(y(`RuntimeError`,`Failed to write file: ${e}`,t))}},readFile:async(e,t)=>{try{return x(await n.readFile(e,t))}catch(t){return S(y(`RuntimeError`,`Failed to read file: ${e}`,t))}},readJsonSync:e=>{try{let t=s.readFileSync(e,`utf8`);return x(JSON.parse(t))}catch(t){return S(y(`RuntimeError`,`Failed to read JSON: ${e}`,t))}},writeJson:async(e,t,r)=>{try{let i=JSON.stringify(t,null,r?.spaces??2);return await n.writeFile(e,i,`utf8`),x(void 0)}catch(t){return S(y(`RuntimeError`,`Failed to write JSON: ${e}`,t))}},stat:async e=>{try{return x(await n.stat(e))}catch(t){return S(y(`RuntimeError`,`Failed to stat path: ${e}`,t))}},readdir:async e=>{try{return x(await n.readdir(e))}catch(t){return S(y(`RuntimeError`,`Failed to read directory: ${e}`,t))}}},http:{getJson:async(e,t=15e3)=>{try{let n=await fetch(e,{signal:AbortSignal.timeout(t)});return n.ok?x(await n.json()):S(y(`RuntimeError`,`HTTP error! status: ${n.status} when fetching JSON from: ${e}`))}catch(t){return S(y(`RuntimeError`,`Failed to fetch JSON from: ${e}`,t))}},getText:async(e,t=15e3)=>{try{let n=await fetch(e,{signal:AbortSignal.timeout(t)});return n.ok?x(await n.text()):S(y(`RuntimeError`,`HTTP error! status: ${n.status} when fetching text from: ${e}`))}catch(t){return S(y(`RuntimeError`,`Failed to fetch text from: ${e}`,t))}}},prompt:{intro:e=>d(e),outro:e=>h(e),cancel:e=>l(e),isCancel:e=>f(e),info:e=>p.info(e),warn:e=>p.warn(e),error:e=>p.error(e),success:e=>p.success(e),text:t=>_({signal:e?.signal,...t}),confirm:t=>u({signal:e?.signal,...t}),select:t=>g({signal:e?.signal,...t}),multiselect:t=>m({signal:e?.signal,...t}),autocompleteMultiselect:t=>c({signal:e?.signal,...t})},process:{run:(e,t,n)=>v(e,t,{cwd:n,stdio:`inherit`,shell:process.platform===`win32`})}});function Q(){console.log(`
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(`
3
2
  Usage:
4
3
  regpick init
5
4
  regpick list [registry-name-or-url]
@@ -13,4 +12,4 @@ Options:
13
12
  --select=a,b,c Select explicit item names in add flow
14
13
  --yes Skip confirmation prompts where safe
15
14
  --help Show this help
16
- `)}async function Oe(){let n=new AbortController,r=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`,()=>r()),process.on(`SIGTERM`,()=>r()),process.on(`uncaughtException`,r),process.on(`unhandledRejection`,e=>r(e instanceof Error?e:Error(String(e))));let i=De({signal:n.signal}),a=Ee(process.argv.slice(2)),o=a.positionals[0];if(!o||a.flags.help){Q();return}let s={cwd:a.flags.cwd?e.resolve(process.cwd(),String(a.flags.cwd)):process.cwd(),args:a,runtime:i};i.prompt.intro(t(`cyan`,`regpick`));try{let e;if(o===`init`)e=await _e(s);else if(o===`list`)e=await be(s);else if(o===`add`)e=await he(s);else if(o===`update`)e=await Z(s);else if(o===`pack`)e=await Ce(s);else{i.prompt.error(`Unknown command: ${o}`),Q(),process.exitCode=1;return}if(!e.ok){$(e.error,i.prompt.error),i.prompt.outro(t(`red`,`Failed.`)),process.exitCode=1;return}if(e.value.kind===`noop`){i.prompt.outro(t(`yellow`,e.value.message));return}i.prompt.outro(t(`green`,`Done.`))}catch(e){$(b(e),i.prompt.error),i.prompt.outro(t(`red`,`Failed.`)),process.exitCode=1}}function $(e,t){if(e.kind===`UserCancelled`){t(e.message);return}t(`[${e.kind}] ${e.message}`)}Oe();export{};
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-CmlwTKIj.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-r4EPhNZZ.mjs`).then(e=>e.runInitCommand(f));else if(l===`list`)e=await import(`./list-I3ADGqiS.mjs`).then(e=>e.runListCommand(f));else if(l===`add`)e=await import(`./add-DDA8WHAX.mjs`).then(e=>e.runAddCommand(f));else if(l===`update`)e=await import(`./update-BjMnPt20.mjs`).then(e=>e.runUpdateCommand(f));else if(l===`pack`)e=await import(`./pack-B2wXgNav.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};
@@ -0,0 +1 @@
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,t as a}from"./config-BFyeS-_Z.mjs";function o(e,t){return e?`cancelled`:t?`overwrite`:`keep`}async function s(s){let c=a(s.cwd),l=await s.runtime.fs.stat(c);if(l.ok){let r=await s.runtime.prompt.confirm({message:`${c} already exists. Overwrite?`,initialValue:!1}),i=o(s.runtime.prompt.isCancel(r),!!r);if(i===`cancelled`)return n(e(`UserCancelled`,`Operation cancelled.`));if(i===`keep`)return s.runtime.prompt.info(`Keeping existing configuration.`),t({kind:`noop`,message:`Keeping existing configuration.`})}let{config:u}=await i(s.cwd),d=await s.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`}]});if(s.runtime.prompt.isCancel(d))return n(e(`UserCancelled`,`Operation cancelled.`));let f=await s.runtime.prompt.text({message:`W jakim folderze trzymasz komponenty UI?`,placeholder:`src/components/ui`});if(s.runtime.prompt.isCancel(f))return n(e(`UserCancelled`,`Operation cancelled.`));let p=await s.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)`}]});if(s.runtime.prompt.isCancel(p))return n(e(`UserCancelled`,`Operation cancelled.`));let m={...u,packageManager:String(d),overwritePolicy:String(p),targetsByType:{...u.targetsByType,"registry:component":String(f||`src/components/ui`),"registry:file":String(f||`src/components/ui`),"registry:icon":`${String(f||`src/components/ui`)}/icons`}};return await r(s.cwd,m,{overwrite:!0}),s.runtime.prompt.success(`${l.ok?`Overwrote`:`Created`} ${c}`),t({kind:`success`,message:`${l.ok?`Overwrote`:`Created`} ${c}`})}export{s as runInitCommand};
@@ -0,0 +1 @@
1
+ import{t as e}from"./index.mjs";import{n as t,t as n}from"./result-Dmv-uoQK.mjs";import{n as r}from"./config-BFyeS-_Z.mjs";import{t as i}from"./registry-fWDewXBZ.mjs";function a(e,t){return e?t[e]?String(t[e]):e:null}function o(e,t){let n=a(e,t);if(n)return{source:n,requiresPrompt:!1};let r=Object.keys(t)[0];return r?{source:a(r,t),requiresPrompt:!1}:{source:null,requiresPrompt:!0}}function s(e){let t=e.type||`registry:file`,n=Array.isArray(e.files)?e.files.length:0;return`${e.name} (${t}, files: ${n})`}async function c(a){let{config:c}=await r(a.cwd),l=o(a.args.positionals[1],c.registries),u=l.source;if(l.requiresPrompt){let t=await a.runtime.prompt.text({message:`Registry URL/path:`,placeholder:`https://example.com/registry.json`});if(a.runtime.prompt.isCancel(t))return n(e(`UserCancelled`,`Operation cancelled.`));u=String(t)}if(!u)return t({kind:`noop`,message:`No registry source provided.`});let d=await i(u,a.cwd,a.runtime);if(!d.ok)return d;let{items:f}=d.value;if(!f.length)return a.runtime.prompt.warn(`No items found in registry.`),t({kind:`noop`,message:`No items found in registry.`});a.runtime.prompt.info(`Found ${f.length} items.`);for(let e of f)console.log(`- ${s(e)}`);return t({kind:`success`,message:`Listed ${f.length} item(s).`})}export{c as runListCommand};
@@ -0,0 +1 @@
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)}async function a(e,i){let a=[];async function o(e){let n=await i.runtime.fs.readdir(e);if(!n.ok)return n;for(let t of n.value){let n=r.join(e,t),s=await i.runtime.fs.stat(n);if(!s.ok)return s;if(s.value.isDirectory()){let e=await o(n);if(!e.ok)return e}else (n.endsWith(`.ts`)||n.endsWith(`.tsx`))&&a.push(n)}return t(void 0)}let s=await o(e);return s.ok?t(a):n(s.error)}async function o(o){let s=o.args.positionals[1]||`.`,c=r.resolve(o.cwd,s),l=await o.runtime.fs.stat(c);if(!l.ok||!l.value.isDirectory())return n(e(`ValidationError`,`Target is not a directory: ${c}`));o.runtime.prompt.info(`Scanning ${c} for components...`);let u=await a(c,o);if(!u.ok)return u;let d=u.value;if(d.length===0)return o.runtime.prompt.warn(`No .ts or .tsx files found.`),t({kind:`noop`,message:`No files found.`});let f=[];for(let e of d){let t=await o.runtime.fs.readFile(e,`utf8`);if(!t.ok)return n(t.error);let a=i(t.value),s=r.relative(c,e).replace(/\\/g,`/`),l=r.basename(e,r.extname(e));f.push({name:l,title:l,description:`Packed component`,type:`registry:component`,dependencies:a,devDependencies:[],registryDependencies:[],files:[{path:s,type:`registry:component`}]})}let p={items:f},m=r.join(o.cwd,`registry.json`),h=await o.runtime.fs.writeJson(m,p,{spaces:2});return h.ok?(o.runtime.prompt.success(`Packed ${f.length} components into registry.json`),t({kind:`success`,message:`Generated registry.json`})):n(h.error)}export{o as runPackCommand};
@@ -0,0 +1 @@
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 i from"node:fs";import{autocompleteMultiselect as a,cancel as o,confirm as s,intro as c,isCancel as l,log as u,multiselect as d,outro as f,select as p,text as m}from"@clack/prompts";import{spawnSync as h}from"node:child_process";const g=g=>({fs:{existsSync:e=>i.existsSync(e),pathExists:async e=>{try{return await r.access(e),!0}catch{return!1}},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=i.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:e=>c(e),outro:e=>f(e),cancel:e=>o(e),isCancel:e=>l(e),info:e=>u.info(e),warn:e=>u.warn(e),error:e=>u.error(e),success:e=>u.success(e),text:e=>m({signal:g?.signal,...e}),confirm:e=>s({signal:g?.signal,...e}),select:e=>p({signal:g?.signal,...e}),multiselect:e=>d({signal:g?.signal,...e}),autocompleteMultiselect:e=>a({signal:g?.signal,...e})},process:{run:(e,t,n)=>h(e,t,{cwd:n,stdio:`inherit`,shell:process.platform===`win32`})}});export{g as createRuntimePorts};
@@ -0,0 +1 @@
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";import{fileURLToPath as i}from"node:url";function a(e){return e?Array.isArray(e)?e.filter(e=>typeof e==`string`):typeof e==`string`?[e]:[]:[]}function o(e){return Array.isArray(e)?e.filter(e=>!!(e&&typeof e==`object`)):[]}function s(e,t){let n=o(e.files).map(t=>({path:typeof t.path==`string`?t.path:void 0,target:typeof t.target==`string`?t.target:void 0,type:typeof t.type==`string`?t.type:typeof e.type==`string`?e.type:`registry:file`,content:typeof t.content==`string`?t.content:void 0,url:typeof t.url==`string`?t.url:void 0})),r=typeof e.name==`string`?e.name:typeof e.title==`string`?e.title:`unnamed-item`;return{name:r,title:typeof e.title==`string`?e.title:r,description:typeof e.description==`string`?e.description:``,type:typeof e.type==`string`?e.type:`registry:file`,dependencies:a(e.dependencies),devDependencies:a(e.devDependencies),registryDependencies:a(e.registryDependencies),files:n,sourceMeta:t}}function c(e){return o(e.items).map(e=>Array.isArray(e.files)?null:typeof e.url==`string`?e.url:typeof e.href==`string`?e.href:typeof e.path==`string`?e.path:null).filter(e=>!!e)}function l(r,i){return Array.isArray(r)?t(r.filter(e=>!!(e&&typeof e==`object`)).map(e=>s(e,i))):r&&typeof r==`object`&&Array.isArray(r.items)?t(o(r.items).filter(e=>Array.isArray(e.files)).map(e=>s(e,i))):r&&typeof r==`object`&&Array.isArray(r.files)?t([s(r,i)]):n(e(`RegistryError`,`Unsupported manifest structure.`))}function u(e){return/^https?:\/\//i.test(e)}function d(e){return/^file:\/\//i.test(e)}function f(e,t){return new URL(t,e).toString()}async function p(i,a,o){let d=l(i,a);if(!i||typeof i!=`object`||Array.isArray(i))return d;let p=c(i);if(!p.length)return d;let m=d.ok?d.value:[],h=[];for(let t of p){let i;if(u(t)){let e=await o.http.getJson(t);if(!e.ok)return n(e.error);i=e.value}else if(a.type===`http`&&a.baseUrl){let e=await o.http.getJson(f(a.baseUrl,t));if(!e.ok)return n(e.error);i=e.value}else if((a.type===`file`||a.type===`directory`)&&a.baseDir){let s=await o.fs.readFile(r.resolve(a.baseDir,t),`utf8`);if(!s.ok)return n(s.error);try{i=JSON.parse(s.value)}catch{return n(e(`RegistryError`,`Invalid JSON: ${t}`))}}else{let a=await o.fs.readFile(r.resolve(t),`utf8`);if(!a.ok)return n(a.error);try{i=JSON.parse(a.value)}catch{return n(e(`RegistryError`,`Invalid JSON: ${t}`))}}i&&typeof i==`object`&&h.push(s(i,a))}return t([...m,...h])}async function m(e,i){let a=r.resolve(e),o=await i.fs.readdir(a);if(!o.ok)return n(o.error);let c=o.value.filter(e=>e.endsWith(`.json`)),l=[];for(let e of c){let t=r.join(a,e),o=await i.fs.readFile(t,`utf8`);if(!o.ok)return n(o.error);let c;try{c=JSON.parse(o.value)}catch{continue}!c||typeof c!=`object`||!Array.isArray(c.files)||l.push(s(c,{type:`directory`,baseDir:a}))}return t(l)}async function h(a,o,s){if(!a)return n(e(`ValidationError`,`Registry source is required.`));let c=u(a)||d(a)?a:r.resolve(o,a);if(u(c)){let e=await s.http.getJson(c);if(!e.ok)return n(e.error);let r=c.endsWith(`/`)?c:c.replace(/[^/]*$/,``),i=await p(e.value,{type:`http`,baseUrl:r},s);return i.ok?t({items:i.value,source:c}):n(i.error)}let l=d(c)?i(new URL(c)):r.resolve(c),f=await s.fs.stat(l);if(!f.ok)return n(e(`RegistryError`,`Registry source not found: ${a}`));if(f.value.isDirectory()){let e=await m(l,s);return e.ok?t({items:e.value,source:l}):n(e.error)}let h=await s.fs.readFile(l,`utf8`);if(!h.ok)return n(h.error);let g;try{g=JSON.parse(h.value)}catch(t){return n(e(`RegistryError`,`Failed to parse registry JSON.`,t))}let _=await p(g,{type:`file`,baseDir:r.dirname(l)},s);return _.ok?t({items:_.value,source:l}):n(_.error)}async function g(i,a,o,s){if(typeof i.content==`string`)return t(i.content);let c=i.url||i.path;if(!c)return n(e(`ValidationError`,`File entry in "${a.name}" is missing both content and path/url.`));if(u(c))return await s.http.getText(c);if(a.sourceMeta.type===`http`&&a.sourceMeta.baseUrl){let e=f(a.sourceMeta.baseUrl,c);return await s.http.getText(e)}let l=a.sourceMeta.baseDir&&!r.isAbsolute(c)?r.resolve(a.sourceMeta.baseDir,c):r.resolve(o,c);return await s.fs.readFile(l,`utf8`)}export{g as n,h as t};
@@ -0,0 +1 @@
1
+ function e(e){return{ok:!0,value:e}}function t(e){return{ok:!1,error:e}}export{e as n,t};
@@ -0,0 +1,2 @@
1
+ import{n as e}from"./result-Dmv-uoQK.mjs";import{a as t,i as n,n as r,r as i,t as a}from"./aliasCore-8ZASFnrn.mjs";import{n as o}from"./config-BFyeS-_Z.mjs";import{n as s,t as c}from"./registry-fWDewXBZ.mjs";import l from"node:path";import{styleText as u}from"node:util";async function d(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(u(t,`${n}${e}`))}}async function f(f){let p=await i(f.cwd,f.runtime),m=Object.keys(p.components);if(m.length===0)return f.runtime.prompt.info(`No components installed. Nothing to update.`),e({kind:`noop`,message:`No components to update.`});let{config:h}=await o(f.cwd),g={};for(let e of m){let t=p.components[e].source;t&&(g[t]||(g[t]=[]),g[t].push(e))}let _=0;for(let[e,n]of Object.entries(g)){let i=await c(e,f.cwd,f.runtime);if(!i.ok){f.runtime.prompt.warn(`Failed to load registry ${e}`);continue}let o=i.value.items;for(let e of n){let n=o.find(t=>t.name===e);if(!n)continue;let i=[],c=[];for(let e of n.files){let r=await s(e,n,f.cwd,f.runtime);if(!r.ok)continue;let o=a(r.value,h);i.push(o);let l=t(n,e,f.cwd,h);l.ok&&c.push({target:l.value.absoluteTarget,content:o})}let m=r(i.sort().join(``));if(m!==p.components[e].hash){f.runtime.prompt.info(`Update available for ${e}`);let t=await f.runtime.prompt.select({message:`What do you want to do with ${e}?`,options:[{value:`diff`,label:`Show diff`},{value:`update`,label:`Update`},{value:`skip`,label:`Skip`}]});if(f.runtime.prompt.isCancel(t)||t===`skip`)continue;if(t===`diff`){for(let e of c){let t=await f.runtime.fs.readFile(e.target,`utf8`),n=t.ok?t.value:``;console.log(u(`bold`,`\nDiff for ${e.target}:`)),await d(n,e.content)}let t=await f.runtime.prompt.confirm({message:`Update ${e} now?`,initialValue:!0});if(f.runtime.prompt.isCancel(t)||!t)continue}for(let e of c){let t=await f.runtime.fs.ensureDir(l.dirname(e.target));if(!t.ok)return t;let n=await f.runtime.fs.writeFile(e.target,e.content,`utf8`);if(!n.ok)return n}p.components[e].hash=m,_++,f.runtime.prompt.success(`Updated ${e}`)}}}return _>0?(await n(f.cwd,p,f.runtime),e({kind:`success`,message:`Updated ${_} components.`})):e({kind:`noop`,message:`All components are up to date.`})}export{f as runUpdateCommand};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "regpick",
3
- "version": "0.6.2",
3
+ "version": "0.6.4",
4
4
  "description": "Lightweight CLI for selecting and installing registry entries.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.mjs",