regpick 0.21.0 → 0.22.0

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.
package/dist/index.d.mts CHANGED
@@ -1 +1,199 @@
1
- export { };
1
+ import { Schema } from "effect";
2
+
3
+ //#region src/sdk/RegistryAdapter.d.ts
4
+ interface AdapterContext {
5
+ cwd: string;
6
+ fs: {
7
+ existsSync(path: string): boolean;
8
+ readFile(path: string, encoding?: BufferEncoding): Promise<string | Uint8Array>;
9
+ stat(path: string): Promise<{
10
+ isDirectory(): boolean;
11
+ isFile(): boolean;
12
+ }>;
13
+ readdir(path: string): Promise<string[]>;
14
+ };
15
+ http: {
16
+ getJson<T = unknown>(url: string, timeoutMs?: number): Promise<T>;
17
+ getText(url: string, timeoutMs?: number): Promise<string>;
18
+ };
19
+ }
20
+ interface RawRegistryData {
21
+ items: unknown[];
22
+ source: string;
23
+ }
24
+ interface RegistryAdapter {
25
+ readonly type: "registry-adapter";
26
+ readonly name: string;
27
+ /** INV-08: czysta heurystyka, zero I/O */
28
+ canHandle(source: string): boolean;
29
+ load(source: string, ctx: AdapterContext): Promise<RawRegistryData>;
30
+ loadFileContent(file: {
31
+ path?: string;
32
+ url?: string;
33
+ content?: string;
34
+ }, item: {
35
+ sourceMeta: {
36
+ originalSource?: string;
37
+ };
38
+ }, ctx: AdapterContext): Promise<string>;
39
+ }
40
+ //#endregion
41
+ //#region src/domain/models/plan.d.ts
42
+ interface InstallCommand {
43
+ command: string;
44
+ args: string[];
45
+ }
46
+ //#endregion
47
+ //#region src/sdk/TransformPlugin.d.ts
48
+ interface TransformContext {
49
+ cwd: string;
50
+ config: ResolvedRegpickConfig;
51
+ meta?: Record<string, unknown>;
52
+ }
53
+ interface TransformPlugin {
54
+ readonly type: "transform";
55
+ readonly name: string;
56
+ /**
57
+ * Promise<> dozwolony tylko dla operacji CPU (np. parsowanie AST).
58
+ * ZAKAZ I/O. INV-04
59
+ */
60
+ transform(code: string, fileId: string, ctx: TransformContext): string | null | Promise<string | null>;
61
+ }
62
+ //#endregion
63
+ //#region src/sdk/PackageManagerPlugin.d.ts
64
+ interface PackageManagerPlugin {
65
+ readonly type: "package-manager";
66
+ readonly name: string;
67
+ readonly lockfiles: string[];
68
+ detect(cwd: string, fs: {
69
+ existsSync(path: string): boolean;
70
+ }): boolean | Promise<boolean>;
71
+ buildInstallCommands(deps: string[], devDeps: string[]): InstallCommand[];
72
+ }
73
+ //#endregion
74
+ //#region src/sdk/PathResolverPlugin.d.ts
75
+ interface PathResolverPlugin {
76
+ readonly type: "path-resolver";
77
+ readonly name: string;
78
+ resolve(file: {
79
+ path?: string;
80
+ type?: string;
81
+ }, item: {
82
+ type: string;
83
+ name: string;
84
+ }, defaultPath: string, config: ResolvedRegpickConfig): string | null | undefined;
85
+ }
86
+ //#endregion
87
+ //#region src/sdk/index.d.ts
88
+ type RegpickPlugin = RegistryAdapter | TransformPlugin | PackageManagerPlugin | PathResolverPlugin;
89
+ //#endregion
90
+ //#region src/domain/configModel.d.ts
91
+ declare const RegpickConfigSchema: Schema.filter<Schema.Struct<{
92
+ resolve: Schema.optionalWith<Schema.Struct<{
93
+ targets: Schema.optionalWith<Schema.Record$<typeof Schema.String, typeof Schema.String>, {
94
+ exact: true;
95
+ default: () => {};
96
+ }>;
97
+ aliases: Schema.optionalWith<Schema.Record$<typeof Schema.String, typeof Schema.String>, {
98
+ exact: true;
99
+ default: () => {};
100
+ }>;
101
+ }>, {
102
+ exact: true;
103
+ default: () => {
104
+ targets: {};
105
+ aliases: {};
106
+ };
107
+ }>;
108
+ registry: Schema.optionalWith<Schema.Struct<{
109
+ sources: Schema.optionalWith<Schema.Record$<typeof Schema.String, typeof Schema.String>, {
110
+ exact: true;
111
+ default: () => {};
112
+ }>;
113
+ preferManifestTarget: Schema.optionalWith<typeof Schema.Boolean, {
114
+ exact: true;
115
+ default: () => true;
116
+ }>;
117
+ }>, {
118
+ exact: true;
119
+ default: () => {
120
+ sources: {};
121
+ preferManifestTarget: true;
122
+ };
123
+ }>;
124
+ install: Schema.optionalWith<Schema.Struct<{
125
+ packageManager: Schema.optionalWith<typeof Schema.String, {
126
+ exact: true;
127
+ default: () => string;
128
+ }>;
129
+ overwritePolicy: Schema.optionalWith<Schema.Union<[Schema.Literal<["prompt"]>, Schema.Literal<["overwrite"]>, Schema.Literal<["skip"]>]>, {
130
+ exact: true;
131
+ default: () => "prompt";
132
+ }>;
133
+ allowOutsideProject: Schema.optionalWith<typeof Schema.Boolean, {
134
+ exact: true;
135
+ default: () => false;
136
+ }>;
137
+ }>, {
138
+ exact: true;
139
+ default: () => {
140
+ packageManager: "auto";
141
+ overwritePolicy: "prompt";
142
+ allowOutsideProject: false;
143
+ };
144
+ }>;
145
+ plugins: Schema.optionalWith<Schema.Array$<Schema.Union<[Schema.Union<[Schema.SchemaClass<{
146
+ readonly type: "registry-adapter";
147
+ readonly name: string;
148
+ readonly canHandle: Function;
149
+ readonly load: Function;
150
+ readonly loadFileContent: Function;
151
+ }, {
152
+ readonly type: "registry-adapter";
153
+ readonly name: string;
154
+ readonly canHandle: Function;
155
+ readonly load: Function;
156
+ readonly loadFileContent: Function;
157
+ }, never>, Schema.SchemaClass<{
158
+ readonly type: "transform";
159
+ readonly name: string;
160
+ readonly transform: Function;
161
+ }, {
162
+ readonly type: "transform";
163
+ readonly name: string;
164
+ readonly transform: Function;
165
+ }, never>, Schema.SchemaClass<{
166
+ readonly type: "package-manager";
167
+ readonly name: string;
168
+ readonly lockfiles: readonly string[];
169
+ readonly detect: Function;
170
+ readonly buildInstallCommands: Function;
171
+ }, {
172
+ readonly type: "package-manager";
173
+ readonly name: string;
174
+ readonly lockfiles: readonly string[];
175
+ readonly detect: Function;
176
+ readonly buildInstallCommands: Function;
177
+ }, never>, Schema.SchemaClass<{
178
+ readonly type: "path-resolver";
179
+ readonly name: string;
180
+ readonly resolve: Function;
181
+ }, {
182
+ readonly type: "path-resolver";
183
+ readonly name: string;
184
+ readonly resolve: Function;
185
+ }, never>]>, typeof Schema.String]>>, {
186
+ exact: true;
187
+ default: () => never[];
188
+ }>;
189
+ }>>;
190
+ type BaseRegpickConfig = Schema.Schema.Type<typeof RegpickConfigSchema>;
191
+ type RegpickConfig = Omit<BaseRegpickConfig, "plugins"> & {
192
+ plugins?: (string | RegpickPlugin)[];
193
+ };
194
+ type ResolvedRegpickConfig = Omit<BaseRegpickConfig, "plugins"> & {
195
+ plugins?: RegpickPlugin[];
196
+ };
197
+ declare function defineConfig(config: RegpickConfig): RegpickConfig;
198
+ //#endregion
199
+ export { type RegpickConfig, defineConfig };
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import{Context as e,Data as t,Effect as n,Layer as r,Schema as i}from"effect";import a from"node:path";import{styleText as o}from"node:util";import s from"node:crypto";var c=class extends e.Tag(`CommandContext`)(){},l=class extends e.Tag(`RegpickConfig`)(){},u=class extends t.TaggedError(`ConfigError`){},d=class extends t.TaggedError(`RegistryError`){},f=class extends t.TaggedError(`InstallError`){},p=class extends t.TaggedError(`UserCancelled`){},m=class extends t.TaggedError(`ValidationError`){},h=class extends t.TaggedError(`RuntimeError`){},g=class extends t.TaggedError(`FileSystemError`){},_=class extends t.TaggedError(`JsonError`){},v=class extends t.TaggedError(`NetworkError`){},y=class extends t.TaggedError(`PluginError`){},b=class extends t.TaggedError(`VfsError`){};function x(e,t,n){switch(e){case`ConfigError`:return new u({message:t,cause:n});case`RegistryError`:return new d({message:t,cause:n});case`InstallError`:return new f({message:t,cause:n});case`UserCancelled`:return new p({message:t,cause:n});case`ValidationError`:return new m({message:t,cause:n});case`RuntimeError`:return new h({message:t,cause:n});case`FileSystemError`:return new g({message:t,cause:n});case`JsonError`:return new _({message:t,cause:n});case`NetworkError`:return new v({message:t,cause:n});case`PluginError`:return new y({message:t,cause:n});case`VfsError`:return new b({message:t,cause:n})}}const S=new Set([`ConfigError`,`RegistryError`,`InstallError`,`UserCancelled`,`ValidationError`,`RuntimeError`,`FileSystemError`,`JsonError`,`NetworkError`,`PluginError`,`VfsError`]);function C(e,t=`RuntimeError`){return typeof e==`object`&&e&&`_tag`in e&&typeof e._tag==`string`&&S.has(e._tag)?e:e instanceof Error?x(t,e.message,e):x(t,typeof e==`object`&&e&&`message`in e?String(e.message):String(e),e)}var w=class extends e.Tag(`JournalService`)(){},T=class extends e.Tag(`FileSystemPort`)(){},E=class extends e.Tag(`HttpPort`)(){},D=class extends e.Tag(`PromptPort`)(){},O=class extends e.Tag(`ProcessPort`)(){};const k=i.Struct({path:i.String,hash:i.String}),A=i.Struct({version:i.optional(i.String),installedAt:i.String,source:i.optional(i.String),dependencies:i.optional(i.Array(i.String)),files:i.Array(k)}),j=i.mutable(i.Struct({lockfileVersion:i.Literal(2),components:i.mutable(i.Record({key:i.String,value:A}))}));function M(e){return a.join(e,`regpick-lock.json`)}function N(e,t){let r=M(e);return n.gen(function*(){if(!(yield*t.fs.pathExists(r)))return{lockfileVersion:2,components:{}};let e=yield*n.exit(t.fs.readJsonSync(r));if(e._tag!==`Success`)return{lockfileVersion:2,components:{}};let a=i.decodeUnknownEither(j)(e.value);return a._tag===`Right`?a.right:{lockfileVersion:2,components:{}}})}function P(e,t,n){let r=M(e),i={};for(let e of Object.keys(t.components).sort()){let n=t.components[e];i[e]={...n,files:[...n.files].sort((e,t)=>e.path.localeCompare(t.path))}}let a={lockfileVersion:2,components:i};return n.fs.writeJson(r,a,{spaces:2})}function F(e){return s.createHash(`sha256`).update(e).digest(`hex`)}function I(e){return a.join(e,`node_modules`,`.cache`,`regpick`,`journal.json`)}const L=w.of({writeIntent:(e,t)=>n.gen(function*(){let n=yield*T,r=I(t);yield*n.ensureDir(a.dirname(r)),yield*n.writeJson(r,e,{spaces:2})}),clearIntent:e=>n.gen(function*(){let t=yield*T,r=I(e);yield*t.remove(r).pipe(n.ignore)}),rollbackIntent:e=>n.gen(function*(){let t=yield*T,r=I(e);if(!(yield*t.pathExists(r)))return!1;let i=yield*t.readJsonSync(r).pipe(n.catchAll(()=>n.succeed(null)));if(!i||i.status!==`pending`)return yield*t.remove(r).pipe(n.ignore),!1;for(let e of i.plannedFiles||[])yield*t.remove(e).pipe(n.ignore);if(i.lockfileBackup){let r={fs:t,http:{},process:{},prompt:{}};yield*P(e,i.lockfileBackup,r).pipe(n.ignore)}return yield*t.remove(r).pipe(n.ignore),!0})});function R(e){return e===`true`?!0:e===`false`?!1:e}function z(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]=R(e.slice(i+1))}return{flags:t,positionals:n}}function B(){console.log(`
1
+ import{Array as e,Context as t,Data as n,Effect as r,Layer as i,Option as a,Schema as o}from"effect";import*as s from"node:path";import c from"node:path";import{parseArgs as l,styleText as u}from"node:util";import d from"node:fs";import f from"node:fs/promises";import*as p from"@clack/prompts";import{spawnSync as m}from"child_process";import h from"fs/promises";import g from"path";import{loadConfig as _}from"unconfig";import v from"node:crypto";var y=Object.create,b=Object.defineProperty,x=Object.getOwnPropertyDescriptor,ee=Object.getOwnPropertyNames,S=Object.getPrototypeOf,C=Object.prototype.hasOwnProperty,w=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),te=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=ee(t),a=0,o=i.length,s;a<o;a++)s=i[a],!C.call(e,s)&&s!==n&&b(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=x(t,s))||r.enumerable});return e},ne=(e,t,n)=>(n=e==null?{}:y(S(e)),te(t||!e||!e.__esModule?b(n,`default`,{value:e,enumerable:!0}):n,e)),T=class extends t.Tag(`CommandContext`)(){},E=class extends t.Tag(`RegpickConfig`)(){},re=class extends n.TaggedError(`ConfigError`){},D=class extends n.TaggedError(`RegistryError`){},O=class extends n.TaggedError(`InstallError`){},k=class extends n.TaggedError(`UserCancelled`){},ie=class extends n.TaggedError(`ValidationError`){},ae=class extends n.TaggedError(`RuntimeError`){},A=class extends n.TaggedError(`FileSystemError`){},j=class extends n.TaggedError(`JsonError`){},M=class extends n.TaggedError(`NetworkError`){},N=class extends n.TaggedError(`PluginError`){},oe=class extends n.TaggedError(`VfsError`){};function P(e,t,n){switch(e){case`ConfigError`:return new re({message:t,cause:n});case`RegistryError`:return new D({message:t,cause:n});case`InstallError`:return new O({message:t,cause:n});case`UserCancelled`:return new k({message:t,cause:n});case`ValidationError`:return new ie({message:t,cause:n});case`RuntimeError`:return new ae({message:t,cause:n});case`FileSystemError`:return new A({message:t,cause:n});case`JsonError`:return new j({message:t,cause:n});case`NetworkError`:return new M({message:t,cause:n});case`PluginError`:return new N({message:t,cause:n});case`VfsError`:return new oe({message:t,cause:n})}}const se=new Set([`ConfigError`,`RegistryError`,`InstallError`,`UserCancelled`,`ValidationError`,`RuntimeError`,`FileSystemError`,`JsonError`,`NetworkError`,`PluginError`,`VfsError`]);function ce(e,t=`RuntimeError`){return typeof e==`object`&&e&&`_tag`in e&&typeof e._tag==`string`&&se.has(e._tag)?e:e instanceof Error?P(t,e.message,e):P(t,typeof e==`object`&&e&&`message`in e?String(e.message):String(e),e)}var F=class extends t.Tag(`JournalPort`)(){};function I(e){if(e.status!==`pending`)return`cleanup_journal`;switch(e.lastCompletedStep){case`write_journal`:case`hydrate_files`:case`transform_files`:return`rollback_files`;case`commit_files`:return`rollback_full`;case`commit_lockfile`:return`restore_lockfile_only`;case`reconcile_deps`:case`finalize`:return`warn_deps_incomplete`;default:return`cleanup_journal`}}function le(e,t){return r.gen(function*(){let n=I(e);if(n===`rollback_files`||n===`rollback_full`)for(let n of e.plannedFiles||[])yield*r.catchAll(t.removeFile(n),()=>r.succeed(void 0));(n===`rollback_full`||n===`restore_lockfile_only`)&&e.lockfileBackup&&(yield*r.catchAll(t.restoreLockfile(e.lockfilePath,e.lockfileBackup),()=>r.succeed(void 0))),n===`warn_deps_incomplete`&&t.warn&&(yield*r.catchAll(t.warn(`Previous install completed but dependency installation may be incomplete. Run your package manager manually if needed.`),()=>r.succeed(void 0))),n!==`none`&&(yield*r.catchAll(t.deleteJournalEntry(e.id),()=>r.succeed(void 0)))})}var L=class extends t.Tag(`LockfilePort`)(){},R=class extends t.Tag(`FileSystemPort`)(){};const ue=()=>i.succeed(R,{existsSync:e=>d.existsSync(e),pathExists:e=>r.tryPromise({try:()=>f.access(e),catch:()=>!1}).pipe(r.map(()=>!0),r.catchAll(()=>r.succeed(!1))),remove:e=>r.tryPromise({try:()=>f.rm(e,{recursive:!0,force:!0}),catch:t=>new A({message:`Failed to remove ${e}`,cause:t})}),ensureDir:e=>r.tryPromise({try:()=>f.mkdir(e,{recursive:!0}),catch:t=>new A({message:`Failed to ensure directory: ${e}`,cause:t})}),writeFile:(e,t,n)=>r.tryPromise({try:()=>f.writeFile(e,t,n),catch:t=>new A({message:`Failed to write file: ${e}`,cause:t})}),readFile:(e,t)=>r.tryPromise({try:()=>f.readFile(e,t),catch:t=>new A({message:`Failed to read file: ${e}`,cause:t})}),readJsonSync:e=>r.try({try:()=>{let t=d.readFileSync(e,`utf8`);return JSON.parse(t)},catch:t=>new j({message:`Failed to read JSON: ${e}`,cause:t})}),writeJson:(e,t,n)=>r.tryPromise({try:()=>{let r=JSON.stringify(t,null,n?.spaces??2);return f.writeFile(e,r,`utf8`)},catch:t=>new j({message:`Failed to write JSON: ${e}`,cause:t})}),stat:e=>r.tryPromise({try:()=>f.stat(e),catch:t=>new A({message:`Failed to stat path: ${e}`,cause:t})}),readdir:e=>r.tryPromise({try:()=>f.readdir(e),catch:t=>new A({message:`Failed to read directory: ${e}`,cause:t})})});var z=class extends t.Tag(`HttpPort`)(){};const de=e=>i.succeed(z,{getJson:(t,n=15e3)=>r.tryPromise({try:async()=>{let r=await fetch(t,{signal:e?.signal||AbortSignal.timeout(n)});if(!r.ok)throw Error(`HTTP error! status: ${r.status} when fetching JSON from: ${t}`);return await r.json()},catch:e=>new M({message:`Failed to fetch JSON from: ${t}`,cause:e})}),getText:(t,n=15e3)=>r.tryPromise({try:async()=>{let r=await fetch(t,{signal:e?.signal||AbortSignal.timeout(n)});if(!r.ok)throw Error(`HTTP error! status: ${r.status} when fetching text from: ${t}`);return await r.text()},catch:e=>new M({message:`Failed to fetch text from: ${t}`,cause:e})})});var fe=ne(w(((e,t)=>{let n=process||{},r=n.argv||[],i=n.env||{},a=!(i.NO_COLOR||r.includes(`--no-color`))&&(!!i.FORCE_COLOR||r.includes(`--color`)||n.platform===`win32`||(n.stdout||{}).isTTY&&i.TERM!==`dumb`||!!i.CI),o=(e,t,n=e)=>r=>{let i=``+r,a=i.indexOf(t,e.length);return~a?e+s(i,t,n,a)+t:e+i+t},s=(e,t,n,r)=>{let i=``,a=0;do i+=e.substring(a,r)+n,a=r+t.length,r=e.indexOf(t,a);while(~r);return i+e.substring(a)},c=(e=a)=>{let t=e?o:()=>String;return{isColorSupported:e,reset:t(`\x1B[0m`,`\x1B[0m`),bold:t(`\x1B[1m`,`\x1B[22m`,`\x1B[22m\x1B[1m`),dim:t(`\x1B[2m`,`\x1B[22m`,`\x1B[22m\x1B[2m`),italic:t(`\x1B[3m`,`\x1B[23m`),underline:t(`\x1B[4m`,`\x1B[24m`),inverse:t(`\x1B[7m`,`\x1B[27m`),hidden:t(`\x1B[8m`,`\x1B[28m`),strikethrough:t(`\x1B[9m`,`\x1B[29m`),black:t(`\x1B[30m`,`\x1B[39m`),red:t(`\x1B[31m`,`\x1B[39m`),green:t(`\x1B[32m`,`\x1B[39m`),yellow:t(`\x1B[33m`,`\x1B[39m`),blue:t(`\x1B[34m`,`\x1B[39m`),magenta:t(`\x1B[35m`,`\x1B[39m`),cyan:t(`\x1B[36m`,`\x1B[39m`),white:t(`\x1B[37m`,`\x1B[39m`),gray:t(`\x1B[90m`,`\x1B[39m`),bgBlack:t(`\x1B[40m`,`\x1B[49m`),bgRed:t(`\x1B[41m`,`\x1B[49m`),bgGreen:t(`\x1B[42m`,`\x1B[49m`),bgYellow:t(`\x1B[43m`,`\x1B[49m`),bgBlue:t(`\x1B[44m`,`\x1B[49m`),bgMagenta:t(`\x1B[45m`,`\x1B[49m`),bgCyan:t(`\x1B[46m`,`\x1B[49m`),bgWhite:t(`\x1B[47m`,`\x1B[49m`),blackBright:t(`\x1B[90m`,`\x1B[39m`),redBright:t(`\x1B[91m`,`\x1B[39m`),greenBright:t(`\x1B[92m`,`\x1B[39m`),yellowBright:t(`\x1B[93m`,`\x1B[39m`),blueBright:t(`\x1B[94m`,`\x1B[39m`),magentaBright:t(`\x1B[95m`,`\x1B[39m`),cyanBright:t(`\x1B[96m`,`\x1B[39m`),whiteBright:t(`\x1B[97m`,`\x1B[39m`),bgBlackBright:t(`\x1B[100m`,`\x1B[49m`),bgRedBright:t(`\x1B[101m`,`\x1B[49m`),bgGreenBright:t(`\x1B[102m`,`\x1B[49m`),bgYellowBright:t(`\x1B[103m`,`\x1B[49m`),bgBlueBright:t(`\x1B[104m`,`\x1B[49m`),bgMagentaBright:t(`\x1B[105m`,`\x1B[49m`),bgCyanBright:t(`\x1B[106m`,`\x1B[49m`),bgWhiteBright:t(`\x1B[107m`,`\x1B[49m`)}};t.exports=c(),t.exports.createColors=c}))(),1),B=class extends t.Tag(`PromptPort`)(){};const pe=e=>typeof e==`symbol`&&e.description===`clack:cancel`,V=e=>r.tryPromise({try:()=>e,catch:()=>new k({message:`User cancelled`})}).pipe(r.flatMap(e=>pe(e)?r.fail(new k({message:`User cancelled`})):r.succeed(e))),me=()=>i.succeed(B,{selectItems:(e,t)=>r.gen(function*(){let t=yield*V(p.multiselect({message:`Which components would you like to install?`,options:e.map(e=>({value:e.name,label:e.name,hint:e.description})),required:!0}));return e.filter(e=>t.includes(e.name))}),resolveConflicts:(e,t)=>r.gen(function*(){if(e.length===0)return{writes:[],skipped:[]};if(t===`overwrite`)return{writes:e,skipped:[]};if(t===`skip`)return{writes:[],skipped:e};let n=[],r=[];for(let t of e){let i=t.absoluteTarget||t.targetPath||`unknown`,a=yield*V(p.select({message:`File ${fe.default.cyan(i)} already exists. Overwrite?`,options:[{value:`yes`,label:`Yes`,hint:`Overwrite the file`},{value:`no`,label:`No`,hint:`Skip this file`},{value:`all`,label:`Yes to all`,hint:`Overwrite this and all following conflicts`},{value:`none`,label:`No to all`,hint:`Skip this and all following conflicts`}]}));if(a===`all`){n.push(t),n.push(...e.slice(e.indexOf(t)+1));break}if(a===`none`){r.push(t),r.push(...e.slice(e.indexOf(t)+1));break}a===`yes`?n.push(t):r.push(t)}return{writes:n,skipped:r}}),confirmInstall:e=>r.gen(function*(){(e.finalWrites??e.plannedWrites??[]).length!==0&&((yield*V(p.confirm({message:`Proceed with installation?`,initialValue:!0})))||(yield*r.fail(new k({message:`User cancelled`}))))}),confirmDependencyInstall:(e,t,n)=>V(p.confirm({message:`Install dependencies using ${n}?`,initialValue:!0})),intro:e=>r.sync(()=>p.intro(e)),outro:e=>r.sync(()=>p.outro(e)),info:e=>r.sync(()=>p.log.info(e)),warn:e=>r.sync(()=>p.log.warn(e)),error:e=>r.sync(()=>p.log.error(e)),success:e=>r.sync(()=>p.log.success(e)),log:e=>r.sync(()=>console.log(e)),text:e=>V(p.text(e)),confirm:e=>V(p.confirm(e)),select:e=>V(p.select(e)),multiselect:e=>V(p.multiselect(e))});var H=class extends t.Tag(`ExecPort`)(){};const he={npm:{type:`package-manager`,name:`npm`,lockfiles:[`package-lock.json`],detect:(e,t)=>t.existsSync(c.join(e,`package-lock.json`)),buildInstallCommands:(e,t)=>{let n=[];return e.length&&n.push({command:`npm`,args:[`install`,...e]}),t.length&&n.push({command:`npm`,args:[`install`,`-D`,...t]}),n}},yarn:{type:`package-manager`,name:`yarn`,lockfiles:[`yarn.lock`],detect:(e,t)=>t.existsSync(c.join(e,`yarn.lock`)),buildInstallCommands:(e,t)=>{let n=[];return e.length&&n.push({command:`yarn`,args:[`add`,...e]}),t.length&&n.push({command:`yarn`,args:[`add`,`-D`,...t]}),n}},pnpm:{type:`package-manager`,name:`pnpm`,lockfiles:[`pnpm-lock.yaml`],detect:(e,t)=>t.existsSync(c.join(e,`pnpm-lock.yaml`)),buildInstallCommands:(e,t)=>{let n=[];return e.length&&n.push({command:`pnpm`,args:[`add`,...e]}),t.length&&n.push({command:`pnpm`,args:[`add`,`-D`,...t]}),n}},bun:{type:`package-manager`,name:`bun`,lockfiles:[`bun.lockb`,`bun.lock`],detect:(e,t)=>t.existsSync(c.join(e,`bun.lockb`))||t.existsSync(c.join(e,`bun.lock`)),buildInstallCommands:(e,t)=>{let n=[];return e.length&&n.push({command:`bun`,args:[`add`,...e]}),t.length&&n.push({command:`bun`,args:[`add`,`-D`,...t]}),n}}};function ge(e,t){return t?.plugins?.find(t=>typeof t==`object`&&!!t&&`type`in t&&t.type===`package-manager`&&t.name===e)??he[e]}function _e(e){let t=(e?.plugins||[]).filter(e=>typeof e==`object`&&!!e&&`type`in e&&e.type===`package-manager`),n=Object.values(he).filter(e=>!t.some(t=>t.name===e.name));return[...t,...n]}function ve(e,t,n,i){return r.gen(function*(){if(t&&t!==`auto`)return t;let a=_e(i);for(let t of a)if(yield*r.tryPromise({try:()=>Promise.resolve(t.detect(e,n.fs)),catch:()=>!1}).pipe(r.catchAll(()=>r.succeed(!1))))return t.name;return`npm`})}const ye=(e,t)=>H.of({installPackages:(e,n,i)=>r.gen(function*(){let a=yield*ve(e,t.install?.packageManager,{fs:{existsSync:d.existsSync}},t),o=ge(a,t);if(!o)return yield*r.fail(new O({message:`Package manager plugin not found for ${a}`}));let s=o.buildInstallCommands(n,i);for(let t of s)yield*r.try({try:()=>{let n=m(t.command,t.args,{cwd:e,stdio:`inherit`,shell:!0});if(n.error)throw n.error;if(n.status!==0)throw Error(`Command failed with status ${n.status}`)},catch:e=>new O({message:`Failed to execute ${t.command}`,cause:e})})})}),be=`regpick.lock.json`;function U(){return{lockfileVersion:2,components:{}}}const W=L.of({read:e=>r.gen(function*(){let t=g.join(e,be),n=yield*r.tryPromise({try:()=>h.readFile(t,`utf-8`),catch:()=>null});if(!n)return U();try{let e=JSON.parse(n);return!e.components||e.lockfileVersion!==2&&e.lockfileVersion!==1?U():{lockfileVersion:2,components:e.components||{}}}catch{return U()}}).pipe(r.catchAll(()=>r.succeed(U()))),write:(e,t)=>r.gen(function*(){let n=g.join(e,be),i=JSON.stringify(t,null,2);yield*r.tryPromise({try:()=>h.writeFile(n,i,`utf-8`),catch:e=>new A({message:`Failed to write lockfile to ${n}`,cause:e})})})});r.succeed(W);const G=`.regpick-journal.json`,K=F.of({write:(e,t)=>r.gen(function*(){let n=g.join(t,G),i=JSON.stringify(e,null,2);yield*r.tryPromise({try:()=>h.writeFile(n,i,`utf-8`),catch:e=>new A({message:`Failed to write journal to ${n}`,cause:e})})}),updateStep:(e,t,n)=>r.gen(function*(){let i=g.join(n,G),a=yield*r.tryPromise({try:()=>h.readFile(i,`utf-8`),catch:e=>new A({message:`Failed to read journal for update at ${i}`,cause:e})}),o=JSON.parse(a);if(o.id!==e)return yield*r.fail(new A({message:`Journal ID mismatch`}));o.lastCompletedStep=t,yield*r.tryPromise({try:()=>h.writeFile(i,JSON.stringify(o,null,2),`utf-8`),catch:e=>new A({message:`Failed to update journal step at ${i}`,cause:e})})}),clear:e=>{let t=g.join(e,G);return r.tryPromise({try:()=>h.unlink(t),catch:()=>!1}).pipe(r.catchAll(()=>r.succeed(void 0))).pipe(r.map(()=>void 0))},read:e=>{let t=g.join(e,G);return r.tryPromise({try:()=>h.readFile(t,`utf-8`),catch:()=>null}).pipe(r.map(e=>{if(!e)return null;try{return JSON.parse(e)}catch{return null}}),r.catchAll(()=>r.succeed(null)))}});r.succeed(K);var q=class extends t.Tag(`VFSPort`)(){},J=class extends t.Tag(`RegistryPort`)(){};const xe=o.Struct({path:o.optionalWith(o.String,{exact:!0}),target:o.optionalWith(o.String,{exact:!0}),type:o.optionalWith(o.String,{exact:!0,default:()=>`registry:file`}),content:o.optionalWith(o.String,{exact:!0}),url:o.optionalWith(o.String,{exact:!0})}),Se=o.Struct({name:o.optionalWith(o.String,{exact:!0,default:()=>`unnamed-item`}),title:o.optionalWith(o.String,{exact:!0}),description:o.optionalWith(o.String,{exact:!0,default:()=>``}),type:o.optionalWith(o.String,{exact:!0,default:()=>`registry:file`}),dependencies:o.optionalWith(o.mutable(o.Array(o.String)),{exact:!0,default:()=>[]}),devDependencies:o.optionalWith(o.mutable(o.Array(o.String)),{exact:!0,default:()=>[]}),registryDependencies:o.optionalWith(o.mutable(o.Array(o.String)),{exact:!0,default:()=>[]}),files:o.optionalWith(o.mutable(o.Array(xe)),{exact:!0,default:()=>[]})}),Ce=o.Struct({type:o.String,originalSource:o.optionalWith(o.String,{exact:!0}),pluginState:o.optionalWith(o.Record({key:o.String,value:o.Unknown}),{exact:!0})});function Y(e,t){return r.gen(function*(){let n=yield*o.decodeUnknown(Se)(e).pipe(r.mapError(e=>P(`ValidationError`,`Manifest validation failed: ${e.message}`))),i=n.name===`unnamed-item`&&n.title?n.title:n.name,a=n.title??i,s=n.files.map(e=>({...e,type:e.type===`registry:file`&&n.type!==`registry:file`?n.type:e.type}));return{...n,name:i,title:a,files:s,sourceMeta:t}})}const we=o.Struct({url:o.optionalWith(o.String,{exact:!0}),href:o.optionalWith(o.String,{exact:!0}),path:o.optionalWith(o.String,{exact:!0})});o.Struct({items:o.Array(o.Union(o.Record({key:o.String,value:o.Unknown}),we))});const Te=o.Array(o.Unknown),Ee=o.Struct({items:o.Array(o.Unknown)}),De=o.Struct({name:o.optionalWith(o.String,{exact:!0}),files:o.Array(o.Unknown)});o.Struct({rawData:o.Unknown,sourceMeta:Ce});function Oe(e,t){return r.gen(function*(){let n=o.decodeUnknownEither(Te)(e);if(n._tag===`Right`){let e=n.right.filter(e=>!!(e&&typeof e==`object`));return yield*r.all(e.map(e=>Y(e,t)))}let i=o.decodeUnknownEither(Ee)(e);if(i._tag===`Right`){let e=i.right.items.filter(e=>e&&typeof e==`object`&&`files`in e&&Array.isArray(e.files));return yield*r.all(e.map(e=>Y(e,t)))}return o.decodeUnknownEither(De)(e)._tag===`Right`?[yield*Y(e,t)]:yield*r.fail(P(`RegistryError`,`Unsupported manifest structure. Allowed formats: Array of items, { items: array }, or { files: array }`))})}const ke=(e,t)=>{let n=t=>e.find(e=>e.canHandle(t));return J.of({loadManifest:e=>r.gen(function*(){let i=n(e);if(!i)return yield*r.fail(new D({message:`No registry adapter found for: ${e}`}));let a=yield*r.tryPromise({try:()=>i.load(e,t),catch:t=>new D({message:`[${i.name}] load failed for '${e}': ${String(t)}`})});return{items:yield*Oe(a.items,{type:i.name,originalSource:a.source}).pipe(r.mapError(t=>new D({message:`Failed to normalize manifest from ${e}: ${t.message}`}))),source:a.source}}),loadFileContent:(e,i)=>r.gen(function*(){if(typeof e.content==`string`)return e.content;let a=n(i.sourceMeta?.originalSource??``);return a?yield*r.tryPromise({try:()=>a.loadFileContent(e,i,t),catch:e=>new D({message:`[${a.name}] loadFileContent failed: ${String(e)}`})}):yield*r.fail(new D({message:`No adapter for file: ${e.path??e.url}`}))})})};var Ae=class{type=`registry-adapter`;name=`shadcn-v4`;canHandle(e){return e.includes(`ui.shadcn.com`)||e.startsWith(`shadcn://`)||e.includes(`/r/`)&&e.endsWith(`.json`)}async load(e,t){let n=this.normalizeUrl(e),r=await t.http.getText(n),i=JSON.parse(r);return{items:Array.isArray(i)?i:i.items??[],source:n}}async loadFileContent(e,t,n){if(e.url)return n.http.getText(e.url);let r=t.sourceMeta.originalSource??``,i=new URL(e.path??``,r).toString();return n.http.getText(i)}normalizeUrl(e){return e.includes(`github.com`)&&e.includes(`/blob/`)?e.replace(`github.com`,`raw.githubusercontent.com`).replace(`/blob/`,`/`):e.startsWith(`shadcn://`)?`https://ui.shadcn.com/r/${e.slice(9)}`:e}},je=class{type=`registry-adapter`;name=`http`;canHandle(e){return e.startsWith(`http://`)||e.startsWith(`https://`)}async load(e,t){let n=await t.http.getText(e),r=JSON.parse(n);return{items:Array.isArray(r)?r:r.items??[],source:e}}async loadFileContent(e,t,n){if(e.url)return n.http.getText(e.url);let r=t.sourceMeta.originalSource??``,i=new URL(e.path??``,r).toString();return n.http.getText(i)}},Me=class{type=`registry-adapter`;name=`file`;canHandle(e){return e.startsWith(`file://`)||e.endsWith(`.json`)}async load(e,t){let n=e.startsWith(`file://`)?e.slice(7):e,r=await t.fs.readFile(n,`utf-8`),i=JSON.parse(r.toString());return{items:Array.isArray(i)?i:i.items??[],source:n}}async loadFileContent(e,t,n){if(!e.path)throw Error(`File path is missing`);let r=t.sourceMeta.originalSource??``,i=r.startsWith(`file://`)?r.slice(7):r,a=c.resolve(c.dirname(i),e.path);return(await n.fs.readFile(a,`utf-8`)).toString()}},Ne=class{type=`registry-adapter`;name=`directory`;canHandle(e){return e.startsWith(`file://`)&&!e.endsWith(`.json`)?!0:!e.startsWith(`http://`)&&!e.startsWith(`https://`)&&!e.endsWith(`.json`)&&!e.startsWith(`file://`)}async load(e,t){let n=e.startsWith(`file://`)?e.slice(7):e,r=c.join(n,`registry.json`);if(!t.fs.existsSync(r))throw Error(`No registry.json found in directory: ${n}`);let i=await t.fs.readFile(r,`utf-8`),a=JSON.parse(i.toString());return{items:Array.isArray(a)?a:a.items??[],source:r}}async loadFileContent(e,t,n){if(!e.path)throw Error(`File path is missing`);let r=t.sourceMeta.originalSource??``,i=c.resolve(c.dirname(r),e.path);return(await n.fs.readFile(i,`utf-8`)).toString()}};const Pe=(e,t,n)=>({cwd:n,fs:{existsSync:e=>t.existsSync(e),readFile:(e,n)=>r.runPromise(t.readFile(e,n)),stat:e=>r.runPromise(t.stat(e)),readdir:e=>r.runPromise(t.readdir(e))},http:{getJson:(t,n)=>r.runPromise(e.getJson(t,n)),getText:(t,n)=>r.runPromise(e.getText(t,n))}}),Fe=o.Union(o.Literal(`prompt`),o.Literal(`overwrite`),o.Literal(`skip`)),Ie=o.String,X=o.declare(e=>typeof e==`function`,{identifier:`Function`}),Le=o.Struct({type:o.Literal(`registry-adapter`),name:o.String,canHandle:X,load:X,loadFileContent:X}).pipe(o.typeSchema),Re=o.Struct({type:o.Literal(`transform`),name:o.String,transform:X}).pipe(o.typeSchema),ze=o.Struct({type:o.Literal(`package-manager`),name:o.String,lockfiles:o.Array(o.String),detect:X,buildInstallCommands:X}).pipe(o.typeSchema),Be=o.Struct({type:o.Literal(`path-resolver`),name:o.String,resolve:X}).pipe(o.typeSchema),Ve=o.Union(Le,Re,ze,Be),He=o.Struct({resolve:o.optionalWith(o.Struct({targets:o.optionalWith(o.Record({key:o.String,value:o.String}),{exact:!0,default:()=>({})}),aliases:o.optionalWith(o.Record({key:o.String,value:o.String}),{exact:!0,default:()=>({})})}),{exact:!0,default:()=>({targets:{},aliases:{}})}),registry:o.optionalWith(o.Struct({sources:o.optionalWith(o.Record({key:o.String,value:o.String}),{exact:!0,default:()=>({})}),preferManifestTarget:o.optionalWith(o.Boolean,{exact:!0,default:()=>!0})}),{exact:!0,default:()=>({sources:{},preferManifestTarget:!0})}),install:o.optionalWith(o.Struct({packageManager:o.optionalWith(Ie,{exact:!0,default:()=>`auto`}),overwritePolicy:o.optionalWith(Fe,{exact:!0,default:()=>`prompt`}),allowOutsideProject:o.optionalWith(o.Boolean,{exact:!0,default:()=>!1})}),{exact:!0,default:()=>({packageManager:`auto`,overwritePolicy:`prompt`,allowOutsideProject:!1})}),plugins:o.optionalWith(o.Array(o.Union(Ve,o.String)),{exact:!0,default:()=>[]})}).pipe(o.filter(e=>{if(!e.install?.allowOutsideProject){let t=e.resolve?.targets||{};for(let e of Object.values(t))if(typeof e==`string`&&(e.startsWith(`..`)||c.isAbsolute(e)))return!1}return!0},{message:()=>`Target paths outside project are disallowed when install.allowOutsideProject is false`}));function Ue(e){return e}const We={resolve:{targets:{"registry:icon":`src/components/ui/icons`,"registry:component":`src/components/ui`,"registry:file":`src/components/ui`},aliases:{}},registry:{sources:{},preferManifestTarget:!0},install:{overwritePolicy:`prompt`,packageManager:`auto`,allowOutsideProject:!1},plugins:[]};function Z(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=>Z(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}"`}: ${Z(r[e],t+1)}`).join(`,\n${i}`)}\n${` `.repeat(t-1)}}`}return`undefined`}function Ge(e,t){if(t===`json`)return JSON.stringify(e,null,2);let n=Z(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`}function Ke(e){return r.gen(function*(){if(yield*r.tryPromise({try:()=>f.access(c.join(e,`tsconfig.json`)),catch:()=>!1}).pipe(r.map(()=>!0),r.catchAll(()=>r.succeed(!1))))return`ts`;let t=yield*r.tryPromise({try:()=>f.readFile(c.join(e,`package.json`),`utf-8`),catch:()=>!1}).pipe(r.flatMap(e=>r.try({try:()=>JSON.parse(e),catch:()=>!1})),r.map(e=>typeof e?.type==`string`?e.type:null),r.catchAll(()=>r.succeed(null)));return t===`module`?`mjs`:t===`commonjs`?`cjs`:`mjs`})}function qe(e){return r.gen(function*(){let{sources:t}=yield*r.tryPromise({try:()=>_({sources:[{files:[`regpick`,`.regpickrc`,`regpickrc`],extensions:[`json`,`js`,`ts`,`mjs`,`cjs`,``]}],cwd:e}),catch:e=>P(`ConfigError`,`Failed to resolve config sources`,e)});if(t.length>0)return t[0];let n=yield*Ke(e);return c.join(e,`regpick.config.${n}`)})}function Je(e){return r.gen(function*(){let{config:t,sources:n}=yield*r.tryPromise({try:()=>_({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:We,merge:!0,cwd:e}),catch:e=>P(`ConfigError`,`Failed to load config`,e)});return{config:yield*o.decodeUnknown(He)(t).pipe(r.mapError(e=>P(`ConfigError`,`Config validation failed: ${e.message}`,e))),configPath:n[0]||null}})}function Ye(e,{overwrite:t=!1}={}){return Xe(e,We,{overwrite:t})}function Xe(e,t,{overwrite:n=!1}={}){return r.gen(function*(){let i=yield*qe(e);if((yield*r.tryPromise({try:()=>f.access(i),catch:()=>!1}).pipe(r.map(()=>!0),r.catchAll(()=>r.succeed(!1))))&&!n)return{filePath:i,written:!1};let a=c.extname(i),o=`mjs`;a===`.ts`?o=`ts`:a===`.cjs`?o=`cjs`:a===`.json`&&(o=`json`);let s=Ge(t,o);return yield*r.tryPromise({try:()=>f.writeFile(i,s,`utf-8`),catch:e=>P(`ConfigError`,`Failed to write config to ${i}`,e)}),{filePath:i,written:!0}})}function Ze(e,t){let n=o.decodeUnknownOption(Ve);return r.gen(function*(){return yield*B,(yield*r.all(e.map(e=>{if(typeof e==`string`){let i=e;return(e.startsWith(`.`)||e.startsWith(`/`))&&(i=c.resolve(t,e)),r.tryPromise({try:()=>import(i).then(e=>e.default||e.plugin||e),catch:t=>P(`PluginError`,`Failed to load plugin module: ${e} - ${t instanceof Error?t.message:String(t)}`,t)}).pipe(r.flatMap(t=>a.match(n(t),{onNone:()=>r.fail(P(`PluginError`,`Invalid plugin provided from module: ${e}`)),onSome:e=>r.succeed(e)})))}return a.match(n(e),{onNone:()=>r.fail(P(`PluginError`,`Invalid inline plugin provided`)),onSome:e=>r.succeed(e)})}),{concurrency:`unbounded`})).filter(e=>e!==null)})}const Qe=e=>r.gen(function*(){let t=[];for(let n of e.files){let i=n.content;for(let t of e.plugins){let a=t.transform(i,n.id,e.ctx);if(a!=null){let e=typeof a==`string`?a:yield*r.tryPromise({try:()=>Promise.resolve(a),catch:e=>new N({message:`Plugin ${t.name} transform failed: ${String(e)}`})});e!=null&&(i=e)}}t.push({...n,content:i})}return{mutations:t,additionalDeps:[]}}),$e=()=>i.effect(q,r.gen(function*(){let e=yield*R;return q.of({transform:(e,t,n)=>Qe({files:e,plugins:t,ctx:n}),flush:(t,n)=>r.gen(function*(){for(let r of t.mutations){let t=c.resolve(n,r.id);yield*e.ensureDir(c.dirname(t)),yield*e.writeFile(t,r.content,`utf-8`)}})})})),et=()=>i.succeed(L,W),tt=()=>i.succeed(F,K),nt=(e,t)=>Ze(e??[],t),rt=(e=>{let t=ue(),n=de({signal:e?.signal}),a=me(),o=i.mergeAll(t,n,a),s=$e().pipe(i.provideMerge(o)),c=et(),l=tt(),u=i.effect(E,r.gen(function*(){let e=yield*T,{config:t}=yield*Je(e.cwd),n=yield*nt(t.plugins??[],e.cwd);return{...t,plugins:n}})).pipe(i.provideMerge(o)),d=i.effect(H,r.gen(function*(){let e=yield*T,t=yield*E;return ye(e.cwd,t)})).pipe(i.provideMerge(u)),f=i.effect(J,r.gen(function*(){let e=yield*z,t=yield*R,n=yield*T,i=yield*r.serviceOption(E),a=(i._tag===`Some`&&i.value.plugins||[]).filter(e=>typeof e==`object`&&!!e&&e.type===`registry-adapter`),o=Pe(e,t,n.cwd);return ke([...a,new Ae,new je,new Me,new Ne],o)})).pipe(i.provideMerge(i.mergeAll(o,u)));return i.mergeAll(s,c,l,f,d)})();function it(e){let t=e.positionals.indexOf(`add`),n=t>-1?t+1:0,r=e.positionals[n];if(!r)throw Error(`Missing registry source for 'add' command.`);let i=e.positionals.slice(n+1),a=e.flags.components,o=a?a.split(`,`).map(e=>e.trim()):[],s=[...i,...o];return{source:r,flags:{cwd:e.flags.cwd||process.cwd(),yes:e.flags.yes,all:e.flags.all,overwrite:e.flags.overwrite,components:s}}}function at(e){return{flags:{cwd:e.flags.cwd||process.cwd(),yes:e.flags.yes,force:e.flags.force}}}function ot(e){return{source:e.positionals[1],flags:{cwd:e.flags.cwd||process.cwd()}}}function st(e){let t=e.positionals.indexOf(`pack`),n=e.positionals[t>-1?t+1:0],r=e.positionals[t>-1?t+2:1];if(!n)throw Error(`Missing source directory for 'pack'`);return{source:n,output:r||`registry`,flags:{cwd:e.flags.cwd||process.cwd()}}}function ct(e){let{values:t,positionals:n}=l({args:e,options:{cwd:{type:`string`},yes:{type:`boolean`,short:`y`},all:{type:`boolean`,short:`a`},force:{type:`boolean`,short:`f`},overwrite:{type:`boolean`},components:{type:`string`},help:{type:`boolean`,short:`h`}},strict:!1,allowPositionals:!0}),r={};for(let[e,n]of Object.entries(t))n!==void 0&&(r[e]=n);return{flags:r,positionals:n}}function lt(e){return e.replace(/\\/g,`/`)}function ut(e,t,n){let i=`${c.resolve(e)}${c.sep}`,a=c.resolve(t);return n?r.succeed(void 0):a!==c.resolve(e)&&!a.startsWith(i)?r.fail(P(`ValidationError`,`Refusing to write outside project: ${a}`)):r.succeed(void 0)}const Q=(e,t,n,i)=>r.gen(function*(){let a=t.type||e.type||`registry:file`,o=i.resolve.targets[a],s=i.registry.preferManifestTarget,l=c.basename(t.path||`${e.name}.txt`),u;if(u=s&&t.target?t.target:o?c.join(o,l):t.target?t.target:c.join(`src`,l),i.plugins&&i.plugins.length>0){for(let n of i.plugins)if(n.type===`path-resolver`){let r=n.resolve;if(typeof r==`function`){let n=r(t,e,u,i);if(n){u=n;break}}}}let d=c.resolve(n,u);return yield*ut(n,d,i.install.allowOutsideProject),yield*r.succeed({absoluteTarget:d,relativeTarget:lt(c.relative(n,d))})});function dt(t){return{dependencies:e.dedupe(t.flatMap(e=>e.dependencies||[]).filter(Boolean)),devDependencies:e.dedupe(t.flatMap(e=>e.devDependencies||[]).filter(Boolean))}}const ft=(t,n)=>r.gen(function*(){let i=new Map,a=[],o=new Set,s=(e,t)=>r.gen(function*(){if(!i.has(e.name)){if(o.has(e.name))return yield*new D({message:`Cyclic registry dependency detected: ${[...t,e.name].join(` -> `)}`});if(o.add(e.name),t.push(e.name),e.registryDependencies&&e.registryDependencies.length>0)for(let r of e.registryDependencies){if(i.has(r))continue;let e=n.find(e=>e.name===r);e?yield*s(e,t):a.push(r)}t.pop(),o.delete(e.name),i.set(e.name,e)}});for(let e of t)yield*s(e,[]);return{resolvedItems:e.fromIterable(i.values()),missingDependencies:e.dedupe(a.filter(Boolean))}}),pt=(e,t,n,i=new Set)=>r.gen(function*(){let a=[],o=[];for(let r of e)for(let e of r.files){let{absoluteTarget:s,relativeTarget:c}=yield*Q(r,e,t,n),l={itemName:r.name,sourceFile:e,absoluteTarget:s,relativeTarget:c};a.push(l),i.has(s)&&o.push(l)}return yield*r.succeed({selectedItems:e,plannedWrites:a,dependencyPlan:dt(e),conflicts:o})});function mt(e,t,n,r,i=`prompt`){let a=[];for(let o of e)if(t.has(o.absoluteTarget))if(r||i===`overwrite`)a.push(o);else if(i===`skip`)continue;else n.get(o.absoluteTarget)===`overwrite`&&a.push(o);else a.push(o);return a}function ht(e,t){let n=e;for(let[e,r]of Object.entries(t.resolve.aliases)){let t=e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`),i=RegExp(`from ["']${t}(.*?)["']`,`g`);n=n.replace(i,`from "${r}$1"`);let a=RegExp(`import\\(["']${t}(.*?)["']\\)`,`g`);n=n.replace(a,`import("${r}$1")`)}return n}function gt(e){return e?String(e).split(`,`).map(e=>e.trim()).filter(Boolean):[]}function _t(e,t){let n=t.args?.flags||t.flags||{},i=gt(n.select);if(i.length===0&&Array.isArray(n.components)&&(i=n.components),n.all)return r.succeed(e);if(i.length){let t=e.filter(e=>i.includes(e.name));return t.length?r.succeed(t):r.fail(P(`ValidationError`,`No items matched the provided selection.`))}return r.succeed(null)}function vt(e,t,n){return r.gen(function*(){let r=yield*R,i=new Set;for(let a of e)for(let e of a.files){let{absoluteTarget:o}=yield*Q(a,e,t,n);(yield*r.pathExists(o))&&i.add(o)}return i})}function yt(e,t){return r.gen(function*(){let n=yield*R;return yield*ve(e,t.install?.packageManager,{fs:{existsSync:n.existsSync}},t)})}function bt(e){return(e.plugins||[]).filter(e=>e.type===`transform`)}function xt(e){return s.join(e,`regpick.lock.json`)}function St(e,t,n,r){let i={...(e||{lockfileVersion:2,components:{}}).components};for(let e of t.selectedItems){let a=t.finalWrites.filter(t=>t.itemName===e.name).map(e=>{let t=n.mutations.find(t=>t.id===e.absoluteTarget),r=t?v.createHash(`sha256`).update(t.content).digest(`hex`):void 0;return{path:e.relativeTarget,hash:r}});i[e.name]={version:e.version||`0.0.0`,installedAt:new Date().toISOString(),source:r,dependencies:e.dependencies,files:a}}return{lockfileVersion:2,components:i}}const Ct=e=>r.gen(function*(){let t=yield*J,n=yield*B,i=yield*q,a=yield*H,o=yield*L,s=yield*F,c=yield*E,l=yield*t.loadManifest(e.source),{resolvedItems:u,missingDependencies:d}=yield*ft((yield*_t(l.items,e))||(yield*n.selectItems(l.items,e)),l.items);d.length>0&&(yield*n.warn(`Missing registry dependencies: ${d.join(`, `)}`));let f=yield*o.read(e.flags.cwd).pipe(r.catchAll(()=>r.succeed(void 0))),p=yield*vt(u,e.flags.cwd,c),m=yield*pt(u,e.flags.cwd,c,p),h=e.flags.overwrite||e.flags.yes?`overwrite`:c.install?.overwritePolicy??`prompt`,{writes:g}=yield*n.resolveConflicts(m.conflicts,h);e.flags.yes||(yield*n.confirmInstall(m));let _=yield*yt(e.flags.cwd,c),y=e.flags.yes||(m.dependencyPlan.dependencies.length>0||m.dependencyPlan.devDependencies.length>0?yield*n.confirmDependencyInstall(m.dependencyPlan.dependencies,m.dependencyPlan.devDependencies,_):!1),b={selectedItems:u,finalWrites:mt(m.plannedWrites,p,new Map(g.map(e=>[e.absoluteTarget,`overwrite`])),e.flags.yes||!1,h===`prompt`||h===`overwrite`||h===`skip`?h:`prompt`),dependencyPlan:m.dependencyPlan,shouldInstallDeps:y},x=yield*r.forEach(b.finalWrites,e=>r.gen(function*(){let n=b.selectedItems.find(t=>t.name===e.itemName),r=yield*t.loadFileContent(e.sourceFile,n);return{id:e.absoluteTarget,content:ht(r,c)}}),{concurrency:`unbounded`}),ee=bt(c),S=yield*i.transform(x,ee,{cwd:e.flags.cwd,config:c}),C={id:v.randomUUID(),command:`add`,status:`pending`,currentStep:`write_journal`,lastCompletedStep:`transform_files`,plannedFiles:b.finalWrites.map(e=>e.absoluteTarget),lockfileBackup:f,lockfilePath:xt(e.flags.cwd)};yield*s.write(C,e.flags.cwd),yield*i.flush(S,e.flags.cwd),yield*s.updateStep(C.id,`commit_files`,e.flags.cwd);let w=St(f,b,S,l.source);yield*o.write(e.flags.cwd,w),yield*s.updateStep(C.id,`commit_lockfile`,e.flags.cwd),b.shouldInstallDeps&&(yield*a.installPackages(e.flags.cwd,b.dependencyPlan.dependencies,b.dependencyPlan.devDependencies)),yield*s.clear(e.flags.cwd)});function wt(e){return e?`created`:`ask-overwrite`}const Tt=e=>r.gen(function*(){let t=yield*R,n=yield*B,i=yield*qe(e.flags.cwd),a=c.basename(i),o=wt(!(yield*t.pathExists(i)));o===`ask-overwrite`&&(o=e.flags.force||(yield*n.confirm({message:`File ${a} already exists. Overwrite?`,initialValue:!1}).pipe(r.catchAll(()=>r.succeed(!1))))?`overwrite`:`keep`),o===`created`||o===`overwrite`?(yield*Ye(e.flags.cwd,{overwrite:!0}),yield*n.success(`Successfully initialized ${a}`)):yield*n.info(`Skipped overwriting ${a}`)});function Et(e,t){return e?t[e]?String(t[e]):e:null}function Dt(e,t){let n=Et(e,t);if(n)return{source:n,requiresPrompt:!1};let r=Object.keys(t)[0];return r?{source:Et(r,t),requiresPrompt:!1}:{source:null,requiresPrompt:!0}}const Ot=e=>r.gen(function*(){let t=yield*J,n=yield*B,r=(yield*E).registry?.sources||{},{source:i,requiresPrompt:a}=Dt(e.source,r),o=i;if((a||!o)&&(o=yield*n.text({message:`Enter registry URL to list components from:`,defaultValue:Object.keys(r)[0]||``})),!o)return;yield*n.info(`Translating registry from ${o}...`);let s=yield*t.loadManifest(o);yield*n.success(`Registry loaded (${s.items.length} items)`);for(let e of s.items)yield*n.info(`- ${e.name} [${e.type}]`)});function kt(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 At(e){let t=kt(e.content),n=c.relative(e.targetDir,e.path).replace(/\\/g,`/`),r=c.basename(e.path,c.extname(e.path));return{name:r,title:r,description:`Packed component`,type:`registry:component`,dependencies:t,devDependencies:[],registryDependencies:[],files:[{path:n,type:`registry:component`}],sourceMeta:{type:`directory`,originalSource:e.targetDir}}}const jt=e=>r.gen(function*(){let t=yield*R,n=yield*B,i=c.resolve(e.flags.cwd,e.source);yield*n.info(`Packing components from: ${i}`);let a=yield*t.stat(i).pipe(r.catchAll(()=>r.succeed(null)));if(!a||!a.isDirectory()){yield*n.error(`Source directory not found: ${i}`);return}let o=(yield*t.readdir(i)).filter(e=>e.endsWith(`.ts`)||e.endsWith(`.tsx`));if(o.length===0){yield*n.warn(`No .ts or .tsx files found to pack.`);return}let s=[];for(let e of o){let n=c.join(i,e),r=yield*t.readFile(n),a=At({path:n,content:typeof r==`string`?r:new TextDecoder().decode(r),targetDir:i});s.push(a)}let l=c.resolve(e.flags.cwd,e.output||`registry.json`);yield*t.writeFile(l,JSON.stringify({name:`Packed Registry`,description:`Auto-generated registry`,items:s},null,2),`utf-8`),yield*n.success(`Packed ${s.length} items to ${l}`)});function Mt(e){return v.createHash(`sha256`).update(e).digest(`hex`)}function Nt(e){let t={};for(let n of Object.keys(e.components)){let r=e.components[n].source;r&&(t[r]||(t[r]=[]),t[r].push(n))}return t}const Pt=(e,t,n,i,a,o)=>r.gen(function*(){let s=[],c=[];for(let{file:e,content:r}of n){let n=ht(r,o),i=yield*Q(t,e,a,o);s.push({target:i.absoluteTarget,content:n}),c.push({path:i.relativeTarget,hash:Mt(n)})}c.sort((e,t)=>e.path.localeCompare(t.path));let l=i.files?[...i.files].sort((e,t)=>e.path.localeCompare(t.path)):[],u=l.length===0,d=!1;if(l.length!==c.length)d=!0;else for(let e=0;e<c.length;e++)if(c[e].path!==l[e].path||c[e].hash!==l[e].hash){d=!0;break}let f=u||d?`requires-diff-prompt`:`up-to-date`;return yield*r.succeed({itemName:e,status:f,newFiles:c,files:s})});function Ft(e){return s.join(e,`regpick.lock.json`)}function It(e){return(e.plugins||[]).filter(e=>e.type===`transform`)}const Lt=e=>r.gen(function*(){let t=yield*J,n=yield*B,i=yield*q,a=yield*L,o=yield*F,s=yield*E,c=yield*R,l=yield*a.read(e.flags.cwd).pipe(r.catchAll(()=>r.succeed({lockfileVersion:2,components:{}})));if(Object.keys(l.components||{}).length===0){yield*n.info(`No components installed. Nothing to update.`);return}let u=Nt(l),d=[];for(let n of Object.keys(u)){let i=yield*t.loadManifest(n).pipe(r.catchAll(()=>r.succeed(null)));if(i)for(let a of u[n]){let o=l.components[a],u=i.items.find(e=>e.name===a);if(!u)continue;let f=yield*Pt(a,u,yield*r.forEach(u.files,e=>r.gen(function*(){return{file:e,content:yield*t.loadFileContent(e,u)}})),o,e.flags.cwd,s);if(f.status===`requires-diff-prompt`){let e=yield*r.forEach(f.files,e=>r.gen(function*(){let t=``;if(yield*c.pathExists(e.target)){let n=yield*c.readFile(e.target,`utf-8`);t=typeof n==`string`?n:n.toString()}return{target:e.target,remoteContent:e.content,localContent:t}}));d.push({itemName:a,newFiles:f.newFiles,files:Array.from(e),version:u.version,dependencies:u.dependencies,source:n})}}}if(d.length===0){yield*n.info(`All components are up to date.`);return}let f=[];if(e.flags.all||e.flags.yes)f=d;else{let e=yield*n.multiselect({message:`Select components to update`,options:d.map(e=>({value:e.itemName,label:e.itemName}))});f=d.filter(t=>e.includes(t.itemName))}let p=f.length;if(p===0){yield*n.info(`No updates approved.`);return}let m=[];for(let e of f)for(let t of e.files)m.push({id:t.target,content:t.remoteContent});let h=l,g={id:v.randomUUID(),command:`update`,status:`pending`,currentStep:`write_journal`,lastCompletedStep:`transform_files`,plannedFiles:m.map(e=>e.id),lockfileBackup:h,lockfilePath:Ft(e.flags.cwd)};yield*o.write(g,e.flags.cwd);let _=It(s),y=yield*i.transform(m,_,{cwd:e.flags.cwd,config:s});yield*i.flush(y,e.flags.cwd),yield*o.updateStep(g.id,`commit_files`,e.flags.cwd);let b={...h,components:{...h.components}};for(let e of f)b.components[e.itemName]={...b.components[e.itemName],files:e.newFiles,installedAt:new Date().toISOString(),version:e.version||b.components[e.itemName].version,dependencies:e.dependencies||b.components[e.itemName].dependencies,source:e.source||b.components[e.itemName].source};yield*a.write(e.flags.cwd,b),yield*o.updateStep(g.id,`commit_lockfile`,e.flags.cwd),yield*o.clear(e.flags.cwd),yield*n.success(`Updated ${p} components.`)});function Rt(e){return{flags:{cwd:e.flags.cwd||process.cwd(),yes:e.flags.yes,all:e.flags.all}}}function zt(){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
- `)}function V(){return n.gen(function*(){let e=new AbortController,t=t=>{e.signal.aborted||e.abort(t),t instanceof Error&&console.error(o(`red`,`\n[Fatal Error] ${t.message}`)),process.exit(1)};process.on(`SIGINT`,()=>t()),process.on(`SIGTERM`,()=>t()),process.on(`uncaughtException`,t),process.on(`unhandledRejection`,e=>t(e instanceof Error?e:Error(String(e))));let i=z(process.argv.slice(2)),s=i.positionals[0];if(!s||i.flags.help){B();return}let l={cwd:i.flags.cwd?a.resolve(process.cwd(),String(i.flags.cwd)):process.cwd(),args:i};console.log(o(`cyan`,`regpick`));let u=n.gen(function*(){let e=yield*w,t=yield*D;(yield*e.rollbackIntent(l.cwd))&&(yield*t.error(o(`yellow`,`Previous incomplete operation detected and rolled back.`)));let r;switch(s){case`init`:r=yield*n.promise(()=>import(`./init-BJHMJEVX.mjs`).then(e=>e.runInitCommand()));break;case`list`:r=yield*n.promise(()=>import(`./list-Day4athC.mjs`).then(e=>e.runListCommand()));break;case`add`:r=yield*n.promise(()=>import(`./add-B8oUsJip.mjs`).then(e=>e.runAddCommand()));break;case`update`:r=yield*n.promise(()=>import(`./update-DEQzgzFl.mjs`).then(e=>e.runUpdateCommand()));break;case`pack`:r=yield*n.promise(()=>import(`./pack-BABPyC5g.mjs`).then(e=>e.runPackCommand()));break;default:return yield*t.error(`Unknown command: ${s}`),B(),process.exitCode=1,yield*n.succeed(void 0)}let i=yield*r;if(i.kind===`noop`){t.outro(o(`yellow`,i.message));return}t.outro(o(`green`,`Done.`))}).pipe(n.catchAll(e=>n.gen(function*(){let t=yield*D;H(e,console.error),t.outro(o(`red`,`Failed.`)),process.exitCode=1})),n.catchAllDefect(e=>n.gen(function*(){let t=yield*D;H(C(e),console.error),t.outro(o(`red`,`Failed.`)),process.exitCode=1}))),d=yield*n.promise(()=>import(`./runtime-BbkpTdca.mjs`).then(t=>t.createRuntimeLive({signal:e.signal}))),f=r.mergeAll(d,r.succeed(c,l),r.succeed(w,L));yield*u.pipe(n.provide(f))})}function H(e,t){if(e._tag===`UserCancelled`){t(e.message);return}let n=`[${e._tag}] ${e.message}`;if(e.cause)if(e.cause instanceof Error)n+=`\n\nCause:\n${e.cause.stack||e.cause.message}`;else if(typeof e.cause==`object`)try{n+=`\n\nCause:\n${JSON.stringify(e.cause,null,2)}`}catch{n+=`\n\nCause: ${String(e.cause)}`}else n+=`\n\nCause: ${String(e.cause)}`;console.error(n)}n.runPromise(V());export{E as a,w as c,C as d,c as f,T as i,d as l,N as n,O as o,l as p,P as r,D as s,F as t,x as u};
15
+ `)}function Bt(){return r.gen(function*(){let e=new AbortController,t=t=>{e.signal.aborted||e.abort(t),t instanceof Error&&console.error(u(`red`,`\n[Fatal Error] ${t.message}`)),process.exit(1)};process.on(`SIGINT`,()=>t()),process.on(`SIGTERM`,()=>t()),process.on(`uncaughtException`,t),process.on(`unhandledRejection`,e=>t(e instanceof Error?e:Error(String(e))));let n=ct(process.argv.slice(2)),i=n.positionals[0];if(!i||n.flags.help){zt();return}let a={cwd:n.flags.cwd?c.resolve(process.cwd(),String(n.flags.cwd)):process.cwd(),args:n};console.log(u(`cyan`,`regpick`)),yield*r.gen(function*(){let e=yield*F,t=yield*R,o=yield*L,s=yield*B,l=yield*e.read(a.cwd);if(l){let n=I(l);if(n!==`none`&&n!==`cleanup_journal`){yield*s.warn(u(`yellow`,`Previous incomplete operation detected. Recovering (${n})...`));let i=yield*r.either(le(l,{removeFile:e=>t.remove(e),restoreLockfile:(e,t)=>o.write(c.dirname(e),t),deleteJournalEntry:t=>e.clear(a.cwd),warn:e=>s.warn(u(`yellow`,e))}));i._tag===`Left`?yield*s.error(u(`red`,`Recovery failed: ${i.left.message}`)):yield*s.outro(u(`green`,`Recovery completed.`))}}let d;switch(i){case`add`:d=Ct(it(n));break;case`init`:d=Tt(at(n));break;case`list`:d=Ot(ot(n));break;case`pack`:d=jt(st(n));break;case`update`:d=Lt(Rt(n));break;default:return yield*s.error(`Unknown command: ${i}`),zt(),process.exitCode=1,yield*r.succeed(void 0)}let f=yield*d;if(f&&f.kind===`noop`){yield*s.outro(u(`yellow`,f.message));return}yield*s.outro(u(`green`,`Done.`))}).pipe(r.catchAll(e=>r.gen(function*(){let t=yield*B;$(e,console.error),t.outro(u(`red`,`Failed.`)),process.exitCode=1})),r.catchAllDefect(e=>r.gen(function*(){let t=yield*B;$(ce(e),console.error),t.outro(u(`red`,`Failed.`)),process.exitCode=1}))).pipe(r.provide(rt),r.provideService(T,a))})}function $(e,t){if(e._tag===`UserCancelled`){t(e.message);return}let n=`[${e._tag||`Error`}] ${e.message}`;if(e.cause)if(e.cause instanceof Error)n+=`\n\nCause:\n${e.cause.stack||e.cause.message}`;else if(typeof e.cause==`object`)try{n+=`\n\nCause:\n${JSON.stringify(e.cause,null,2)}`}catch{n+=`\n\nCause: ${String(e.cause)}`}else n+=`\n\nCause: ${String(e.cause)}`;console.error(n)}r.runPromise(Bt().pipe(r.catchAll(e=>(console.error(`UNCAUGHT:`,e),process.exit(1),r.succeed(void 0))),r.catchAllDefect(e=>(console.error(`DEFECT:`,e),process.exit(1),r.succeed(void 0)))));export{Ue as defineConfig};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "regpick",
3
- "version": "0.21.0",
3
+ "version": "0.22.0",
4
4
  "description": "Lightweight CLI for selecting and installing registry entries.",
5
5
  "keywords": [
6
6
  "cli",
@@ -1,2 +0,0 @@
1
- import{a as e,c as t,d as n,f as r,i,l as a,n as o,o as s,p as c,r as l,s as u,t as d,u as f}from"./index.mjs";import{a as p,c as m,i as h,n as g,o as _,r as v,s as y,t as b}from"./plugins-oE708wun.mjs";import{o as x,t as S}from"./config-DEEdBTsb.mjs";import{Array as C,Effect as w,Schema as T}from"effect";import E from"node:path";import D from"node:crypto";import{Volume as O}from"memfs";import k from"node:fs/promises";const A=(e,t,n)=>w.gen(function*(){yield*w.forEach(t,t=>w.gen(function*(){t.start&&(yield*t.start(e).pipe(w.catchAll(e=>w.fail(f(`PluginError`,`[${t.name}] Failed during start hook: ${e instanceof Error?e.message:String(e)}`)))))}),{concurrency:1,discard:!0});let r=yield*w.forEach(n,n=>w.gen(function*(){let r=n.id;for(let n of t)if(n.resolveId){let t=yield*n.resolveId(r,void 0,e).pipe(w.catchAll(e=>w.fail(f(`PluginError`,`[${n.name}] Failed to resolveId for '${r}': ${e instanceof Error?e.message:String(e)}`))));if(t){r=t;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*w.forEach(i.values(),n=>w.gen(function*(){for(let r of n){let n=r.file.code,i=r.currentId;for(let r of t)if(r.load){let t=yield*r.load(i,e).pipe(w.catchAll(e=>w.fail(f(`PluginError`,`[${r.name}] Failed to load '${i}': ${e instanceof Error?e.message:String(e)}`))));if(t!=null){n=t;break}}if(n!==null){if(typeof n==`string`){for(let r of t)if(r.transform){let t=yield*r.transform(n,i,e).pipe(w.catchAll(e=>w.fail(f(`PluginError`,`[${r.name}] Failed to transform '${i}': ${e instanceof Error?e.message:String(e)}`))));t!=null&&(n=t)}}yield*w.tryPromise({try:()=>e.vfs.writeFile(i,n),catch:e=>f(`VfsError`,`Failed to write ${i}: ${e instanceof Error?e.message:String(e)}`)})}}}),{concurrency:`unbounded`,discard:!0}),yield*w.forEach(t,t=>w.gen(function*(){t.finish&&(yield*t.finish(e).pipe(w.catchAll(e=>w.fail(f(`PluginError`,`[${t.name}] Failed during finish hook: ${e instanceof Error?e.message:String(e)}`)))))}),{concurrency:1,discard:!0})}).pipe(w.catchAll(n=>w.gen(function*(){return yield*w.forEach(t,t=>w.gen(function*(){t.onError&&(yield*t.onError(n,e).pipe(w.catchAll(()=>w.void),w.ignore))}),{concurrency:1,discard:!0}),yield*w.fail(n)}))),j={npm:{type:`package-manager`,name:`npm`,lockfiles:[`package-lock.json`],detect:(e,t)=>t.fs.existsSync(E.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:{type:`package-manager`,name:`yarn`,lockfiles:[`yarn.lock`],detect:(e,t)=>t.fs.existsSync(E.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:{type:`package-manager`,name:`pnpm`,lockfiles:[`pnpm-lock.yaml`],detect:(e,t)=>t.fs.existsSync(E.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:{type:`package-manager`,name:`bun`,lockfiles:[`bun.lockb`,`bun.lock`],detect:(e,t)=>t.fs.existsSync(E.join(e,`bun.lockb`))||t.fs.existsSync(E.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 M(e,t){return t?.plugins?.find(t=>typeof t==`object`&&!!t&&`type`in t&&t.type===`package-manager`&&t.name===e)??j[e]}function N(e){let t=(e?.plugins||[]).filter(e=>typeof e==`object`&&!!e&&`type`in e&&e.type===`package-manager`),n=Object.values(j).filter(e=>!t.some(t=>t.name===e.name));return[...t,...n]}function P(e,t,n,r){return w.gen(function*(){if(t&&t!==`auto`)return t;let i=N(r),a=m(n);for(let t of i)if(yield*w.tryPromise({try:()=>Promise.resolve(t.detect(e,a)),catch:()=>!1}).pipe(w.catchAll(()=>w.succeed(!1))))return t.name;return`npm`})}const F=T.Struct({dependencies:T.optionalWith(T.Record({key:T.String,value:T.String}),{exact:!0,default:()=>({})}),devDependencies:T.optionalWith(T.Record({key:T.String,value:T.String}),{exact:!0,default:()=>({})}),peerDependencies:T.optionalWith(T.Record({key:T.String,value:T.String}),{exact:!0,default:()=>({})})});function I(e,t,n){return w.gen(function*(){let r=E.join(t,`package.json`);if(!n.fs.existsSync(r))return{missingDependencies:[],missingDevDependencies:[]};let i=yield*w.exit(n.fs.readJsonSync(r)),a=i._tag===`Success`?i.value:{},o=T.decodeUnknownEither(F)(a),s=o._tag===`Right`?o.right:{dependencies:{},devDependencies:{},peerDependencies:{}},c={...s.dependencies,...s.devDependencies,...s.peerDependencies},l=C.dedupe(e.flatMap(e=>e.dependencies||[]).filter(Boolean)),u=C.dedupe(e.flatMap(e=>e.devDependencies||[]).filter(Boolean));return{missingDependencies:l.filter(e=>!c[e]),missingDevDependencies:u.filter(e=>!c[e])}})}function L(e,t,n,r,i,a){return w.gen(function*(){if(!n.length&&!r.length)return;let o=M(t,a);if(!o)return yield*w.fail(f(`InstallError`,`Unknown package manager: ${t}`));let s=o.buildInstallCommands(n,r);yield*w.forEach(s,t=>w.gen(function*(){if(i.process.run(t.command,t.args,e).status!==0)return yield*w.fail(f(`InstallError`,`Dependency install failed: ${t.command} ${t.args.join(` `)}`))}),{concurrency:1})})}function R(e,t,n,r=[],i=[],a){return{type:`pipeline`,name:`regpick:core-add`,finish:s=>w.gen(function*(){if(`flushToDisk`in s.vfs&&(yield*w.tryPromise({try:()=>s.vfs.flushToDisk(),catch:e=>f(`VfsError`,`Failed to flush VFS: ${e instanceof Error?e.message:String(e)}`)})),r.length>0){let e=a||(yield*o(s.cwd,n));for(let t of r){e.components||={};let n=i.filter(e=>e.itemName===t.name),r=[];for(let e of n){let t=yield*w.tryPromise({try:()=>s.vfs.readFile(e.absoluteTarget,`utf-8`),catch:()=>!1}).pipe(w.catchAll(()=>w.succeed(null)));t===null?r.push({path:e.relativeTarget,content:e.originalContent}):r.push({path:e.relativeTarget,content:t.toString()})}let a=r.map(e=>({path:e.path,hash:d(e.content)}));e.components[t.name]={source:t.sourceMeta?.originalSource??`unknown`,version:`version`in t?String(t.version):void 0,installedAt:new Date().toISOString(),dependencies:t.dependencies??[],files:a.sort((e,t)=>e.path.localeCompare(t.path))}}yield*l(s.cwd,e,n).pipe(w.mapError(e=>f(`FileSystemError`,`Failed to write lockfile: ${e.message}`)))}if([...e.dependencies,...e.devDependencies].length>0){let r=yield*P(s.cwd,t.install.packageManager,n,t);yield*L(s.cwd,r,e.dependencies,e.devDependencies,n,t).pipe(w.mapError(e=>f(`InstallError`,`Failed to install dependencies: ${e.message}`)))}})}}function z(e){return e.replace(/\\/g,`/`)}var B=class{memory=new O;async readFile(e,t=`utf-8`){let n=z(e),r=this.memory.readFileSync(n);return r?t===`utf-8`?r.toString():r:t===`utf-8`?await k.readFile(e,`utf-8`):await k.readFile(e)}async writeFile(e,t){let n=z(e),r=E.dirname(n);await this.mkdir(r),this.memory.writeFileSync(n,t)}async exists(e){let t=z(e);try{return this.memory.existsSync(t)||await k.access(e),!0}catch{return!1}}async mkdir(e){let t=z(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=E.normalize(e);n.add(E.dirname(t))}try{for(let e of Array.from(n).sort())await k.mkdir(e,{recursive:!0})}catch(e){throw Error(`Failed to create physical filesystem directories during flush: ${e}`)}let r=(await w.runPromise(w.all(t.map(([e])=>w.tryPromise(async()=>{let t=E.normalize(e),n=this.memory.readFileSync(e);await k.writeFile(t,n)})),{concurrency:`unbounded`,mode:`either`}))).filter(e=>e._tag===`Left`);if(r.length>0){let e=r.map(e=>{let t=e.left;return t&&typeof t==`object`&&`message`in t?String(t.message):String(t)}).join(`
2
- `);throw Error(`flushToDisk failed with ${r.length} errors:\n${e}`)}}rollback(){this.memory.reset()}};function V(e){return e.replace(/\\/g,`/`)}function H(e,t,n){let r=`${E.resolve(e)}${E.sep}`,i=E.resolve(t);return n?w.succeed(void 0):i!==E.resolve(e)&&!i.startsWith(r)?w.fail(f(`ValidationError`,`Refusing to write outside project: ${i}`)):w.succeed(void 0)}const U=(e,t,n,r)=>w.gen(function*(){let i=t.type||e.type||`registry:file`,a=r.resolve.targets[i],o=r.registry.preferManifestTarget,s=E.basename(t.path||`${e.name}.txt`),c;if(c=o&&t.target?t.target:a?E.join(a,s):t.target?t.target:E.join(`src`,s),r.plugins&&r.plugins.length>0){for(let n of r.plugins)if(n.type===`path-resolver`){let i=n.resolve;if(typeof i==`function`){let n=i(t,e,c,r);if(n){c=n;break}}}}let l=E.resolve(n,c);return yield*H(n,l,r.install.allowOutsideProject),yield*w.succeed({absoluteTarget:l,relativeTarget:V(E.relative(n,l))})});function W(e){return{dependencies:C.dedupe(e.flatMap(e=>e.dependencies||[]).filter(Boolean)),devDependencies:C.dedupe(e.flatMap(e=>e.devDependencies||[]).filter(Boolean))}}const G=(e,t)=>w.gen(function*(){let n=new Map,r=[],i=new Set,o=(e,s)=>w.gen(function*(){if(!n.has(e.name)){if(i.has(e.name))return yield*new a({message:`Cyclic registry dependency detected: ${[...s,e.name].join(` -> `)}`});if(i.add(e.name),s.push(e.name),e.registryDependencies&&e.registryDependencies.length>0)for(let i of e.registryDependencies){if(n.has(i))continue;let e=t.find(e=>e.name===i);e?yield*o(e,s):r.push(i)}s.pop(),i.delete(e.name),n.set(e.name,e)}});for(let t of e)yield*o(t,[]);return{resolvedItems:C.fromIterable(n.values()),missingDependencies:C.dedupe(r.filter(Boolean))}}),K=(e,t,n,r=new Set)=>w.gen(function*(){let i=[],a=[];for(let o of e)for(let e of o.files){let{absoluteTarget:s,relativeTarget:c}=yield*U(o,e,t,n),l={itemName:o.name,sourceFile:e,absoluteTarget:s,relativeTarget:c};i.push(l),r.has(s)&&a.push(l)}return yield*w.succeed({selectedItems:e,plannedWrites:i,dependencyPlan:W(e),conflicts:a})});function q(e,t,n,r,i=`prompt`){let a=[];for(let o of e)if(t.has(o.absoluteTarget))if(r||i===`overwrite`)a.push(o);else if(i===`skip`)continue;else n.get(o.absoluteTarget)===`overwrite`&&a.push(o);else a.push(o);return a}function J(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 Y(e){return e?String(e).split(`,`).map(e=>e.trim()).filter(Boolean):[]}function X(e,t){let{flags:n}=t.args,r=Y(n.select);if(n.all)return w.succeed(e);if(r.length){let t=e.filter(e=>r.includes(e.name));return t.length?w.succeed(t):w.fail(f(`ValidationError`,`No items matched --select=${String(n.select)}`))}return w.succeed(null)}function Z(e){let t=e.args.positionals[0]===`add`?1:0;return{sourceValue:e.args.positionals[t],itemValue:e.args.positionals[t+1]}}function Q(){return w.gen(function*(){let t={fs:yield*i,http:yield*e,process:yield*s,prompt:yield*u},a=yield*S((yield*r).cwd).pipe(w.mapError(n));return a.configPath?{config:a.config,configPath:a.configPath}:(yield*t.prompt.error(`No regpick.json configuration found. Please run 'init' first.`),yield*w.fail(f(`ValidationError`,`No config file found`)))})}function $(){return w.gen(function*(){let t=yield*c,n={fs:yield*i,http:yield*e,process:yield*s,prompt:yield*u},{sourceValue:a}=Z(yield*r);if(a)return x(a,t);let o=Object.entries(t.registry.sources).map(([e,t])=>({label:`${e} -> ${t}`,value:e}));if(o.length>0){let e=yield*n.prompt.multiselect({message:`Pick registry alias (or cancel and provide URL/path manually)`,options:o,maxItems:1,required:!1});if(yield*n.prompt.isCancel(e))return yield*w.fail(f(`UserCancelled`,`Dependency installation cancelled by user.`));if(Array.isArray(e)&&e.length>0)return x(String(e[0]),t)}let l=yield*n.prompt.text({message:`Registry URL/path:`,placeholder:`https://example.com/registry.json`});return(yield*n.prompt.isCancel(l))?yield*w.fail(f(`UserCancelled`,`Dependency installation cancelled by user.`)):String(l)})}function ee(t,n){return w.gen(function*(){let a={fs:yield*i,http:yield*e,process:yield*s,prompt:yield*u},o=yield*r,{itemValue:c}=Z(o),{items:l}=yield*p(t,o.cwd,a,n);if(!l.length)return yield*a.prompt.warn(`No installable items in registry.`),yield*w.fail(f(`ValidationError`,`No installable items in registry.`));c&&!o.args.flags.select&&(o.args.flags.select=c);let d=yield*X(l,o),m;if(d)m=d;else{let e=yield*a.prompt.autocompleteMultiselect({message:`Select items to install`,options:l.map(e=>({value:e.name,label:`${e.name} (${e.type||`registry:file`})`,hint:e.description||`${e.files.length} file(s)`})),maxItems:10,required:!0});if(yield*a.prompt.isCancel(e))return yield*w.fail(f(`UserCancelled`,`Dependency installation cancelled by user.`));let t=new Set((Array.isArray(e)?e:[]).map(String));m=l.filter(e=>t.has(e.name))}if(!m.length)return yield*a.prompt.warn(`No items selected.`),yield*w.fail(f(`ValidationError`,`No items selected.`));let{resolvedItems:h,missingDependencies:g}=yield*G(m,l);return{selectedItems:h,missingRegistryDeps:g}})}function te(t){return w.gen(function*(){let n=yield*c,a={fs:yield*i,http:yield*e,process:yield*s,prompt:yield*u},o=yield*r,l=yield*K(t,o.cwd,n),d=new Set;yield*w.forEach(l.plannedWrites,e=>w.gen(function*(){(yield*a.fs.pathExists(e.absoluteTarget))&&d.add(e.absoluteTarget)}),{concurrency:`unbounded`});let f=yield*K(t,o.cwd,n,d),p=yield*I(t,o.cwd,a);return{selectedItems:t,plannedWrites:f.plannedWrites,existingTargets:d,missingDependencies:p.missingDependencies,missingDevDependencies:p.missingDevDependencies}})}function ne(t){return w.gen(function*(){let n=yield*c,a={fs:yield*i,http:yield*e,process:yield*s,prompt:yield*u},o=yield*r,l=!!o.args.flags.yes;if(!l){let e=yield*a.prompt.confirm({message:`Install ${t.selectedItems.length} item(s)?`,initialValue:!0});if((yield*a.prompt.isCancel(e))||!e)return yield*w.fail(f(`UserCancelled`,`Dependency installation cancelled by user.`))}let d=n.install.overwritePolicy,p=new Map;if(!l&&d===`prompt`){for(let e of t.plannedWrites)if(t.existingTargets.has(e.absoluteTarget)){let t=yield*a.prompt.select({message:`File exists: ${e.absoluteTarget}`,options:[{value:`overwrite`,label:`Overwrite this file`},{value:`skip`,label:`Skip this file`},{value:`abort`,label:`Abort installation`}]});if((yield*a.prompt.isCancel(t))||t===`abort`)return yield*w.fail(f(`UserCancelled`,`Installation aborted by user.`));p.set(e.absoluteTarget,t)}}let m=q(t.plannedWrites,t.existingTargets,p,l,d),h=!1;if(t.missingDependencies.length>0||t.missingDevDependencies.length>0)if(l)h=!0;else{let e=yield*P(o.cwd,n.install.packageManager,a),r=[];t.missingDependencies.length&&r.push(`dependencies: ${t.missingDependencies.join(`, `)}`),t.missingDevDependencies.length&&r.push(`devDependencies: ${t.missingDevDependencies.join(`, `)}`);let i=yield*a.prompt.confirm({message:`Install missing packages with ${e}? (${r.join(` | `)})`,initialValue:!0});if(yield*a.prompt.isCancel(i))return yield*w.fail(f(`UserCancelled`,`Dependency installation cancelled by user.`));h=!!i,h||(yield*a.prompt.warn(`Skipped dependency installation.`))}return{selectedItems:t.selectedItems,finalWrites:m,shouldInstallDeps:h,dependencyPlan:{dependencies:t.missingDependencies,devDependencies:t.missingDevDependencies}}})}function re(t,n,a){return w.gen(function*(){let o=yield*c,l={fs:yield*i,http:yield*e,process:yield*s,prompt:yield*u},d=yield*r,f=[];return yield*w.forEach(t,e=>w.gen(function*(){let t=n.find(t=>t.name===e.itemName);if(!t)return;let r=yield*_(e.sourceFile,t,d.cwd,l,a),i=J(r,o);f.push({itemName:e.itemName,absoluteTarget:e.absoluteTarget,relativeTarget:e.relativeTarget,sourceFile:e.sourceFile,originalContent:r,finalContent:i})}),{concurrency:`unbounded`}),f})}function ie(){return w.gen(function*(){let{config:n}=yield*Q(),a=yield*r,l=yield*b(n.plugins||[],a.cwd),d={...n,plugins:l};return yield*w.gen(function*(){let n={fs:yield*i,http:yield*e,process:yield*s,prompt:yield*u},r=yield*$();if(!r)return{kind:`noop`,message:`No source provided`};let l=(yield*c).plugins||[],d=[...l,g(),v(),h()],f=yield*ee(r,d);for(let e of f.missingRegistryDeps||[])yield*n.prompt.warn(`Registry dependency "${e}" not found in current registry.`);let p=yield*ne(yield*te(f.selectedItems)),m=yield*re(p.finalWrites,p.selectedItems,d),_=new B,b=m.map(e=>({id:e.absoluteTarget,code:e.finalContent})),x=[];for(let e of m){let t=p.selectedItems.find(t=>t.name===e.itemName);t&&!x.some(e=>e.name===t.name)&&x.push(t)}let S=l.filter(e=>e.type===`pipeline`),C=p.shouldInstallDeps?p.dependencyPlan:{dependencies:[],devDependencies:[]},T=yield*o(a.cwd,n).pipe(w.catchAll(()=>w.succeed(void 0))),E=[...S.map(e=>y(e)),R(C,yield*c,n,x,m,T)],O=yield*t,k={id:D.randomUUID(),command:`add`,status:`pending`,plannedFiles:m.map(e=>e.absoluteTarget),lockfileBackup:T};return yield*O.writeIntent(k,a.cwd),yield*A({vfs:_,cwd:a.cwd,runtime:n},E,b).pipe(w.tapError(()=>O.clearIntent(a.cwd)),w.catchAll(e=>(_.rollback(),w.gen(function*(){return yield*n.prompt.error(`[Failed] Installation aborted: ${e.message}`),yield*w.fail(e)}))),w.tap(()=>O.clearIntent(a.cwd))),{kind:`success`,plan:p}}).pipe(w.provideService(c,d))})}export{A as i,U as n,B as r,ie as runAddCommand,J as t};
@@ -1 +0,0 @@
1
- import{u as e}from"./index.mjs";import{Effect as t,Schema as n}from"effect";import r from"node:path";import i from"node:fs/promises";import{loadConfig as a}from"unconfig";const o=n.Union(n.Literal(`prompt`),n.Literal(`overwrite`),n.Literal(`skip`)),s=n.String,c=n.declare(e=>typeof e==`function`,{identifier:`Function`}),l=n.Struct({type:n.Literal(`pipeline`),name:n.String,start:n.optionalWith(c,{exact:!0}),resolveId:n.optionalWith(c,{exact:!0}),load:n.optionalWith(c,{exact:!0}),transform:n.optionalWith(c,{exact:!0}),finish:n.optionalWith(c,{exact:!0}),onError:n.optionalWith(c,{exact:!0})}).pipe(n.typeSchema),u=n.Struct({type:n.Literal(`package-manager`),name:n.String,lockfiles:n.Array(n.String),detect:c,buildInstallCommands:c}).pipe(n.typeSchema),d=n.Struct({type:n.Literal(`path-resolver`),name:n.String,resolve:c}).pipe(n.typeSchema),f=n.Union(l,u,d),p=n.Struct({resolve:n.optionalWith(n.Struct({targets:n.optionalWith(n.Record({key:n.String,value:n.String}),{exact:!0,default:()=>({})}),aliases:n.optionalWith(n.Record({key:n.String,value:n.String}),{exact:!0,default:()=>({})})}),{exact:!0,default:()=>({targets:{},aliases:{}})}),registry:n.optionalWith(n.Struct({sources:n.optionalWith(n.Record({key:n.String,value:n.String}),{exact:!0,default:()=>({})}),preferManifestTarget:n.optionalWith(n.Boolean,{exact:!0,default:()=>!0})}),{exact:!0,default:()=>({sources:{},preferManifestTarget:!0})}),install:n.optionalWith(n.Struct({packageManager:n.optionalWith(s,{exact:!0,default:()=>`auto`}),overwritePolicy:n.optionalWith(o,{exact:!0,default:()=>`prompt`}),allowOutsideProject:n.optionalWith(n.Boolean,{exact:!0,default:()=>!1})}),{exact:!0,default:()=>({packageManager:`auto`,overwritePolicy:`prompt`,allowOutsideProject:!1})}),plugins:n.optionalWith(n.Array(n.Union(f,n.String)),{exact:!0,default:()=>[]})}).pipe(n.filter(e=>{if(!e.install?.allowOutsideProject){let t=e.resolve?.targets||{};for(let e of Object.values(t))if(typeof e==`string`&&(e.startsWith(`..`)||r.isAbsolute(e)))return!1}return!0},{message:()=>`Target paths outside project are disallowed when install.allowOutsideProject is false`})),m={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:[]};function h(e,t){return e?t.registry.sources[e]?String(t.registry.sources[e]):e:null}function g(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=>g(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}"`}: ${g(r[e],t+1)}`).join(`,\n${i}`)}\n${` `.repeat(t-1)}}`}return`undefined`}function _(e,t){if(t===`json`)return JSON.stringify(e,null,2);let n=g(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`}function v(e){return t.gen(function*(){if(yield*t.tryPromise({try:()=>i.access(r.join(e,`tsconfig.json`)),catch:()=>!1}).pipe(t.map(()=>!0),t.catchAll(()=>t.succeed(!1))))return`ts`;let n=yield*t.tryPromise({try:()=>i.readFile(r.join(e,`package.json`),`utf-8`),catch:()=>!1}).pipe(t.flatMap(e=>t.try({try:()=>JSON.parse(e),catch:()=>!1})),t.map(e=>typeof e?.type==`string`?e.type:null),t.catchAll(()=>t.succeed(null)));return n===`module`?`mjs`:n===`commonjs`?`cjs`:`mjs`})}function y(n){return t.gen(function*(){let{sources:i}=yield*t.tryPromise({try:()=>a({sources:[{files:[`regpick`,`.regpickrc`,`regpickrc`],extensions:[`json`,`js`,`ts`,`mjs`,`cjs`,``]}],cwd:n}),catch:t=>e(`ConfigError`,`Failed to resolve config sources`,t)});if(i.length>0)return i[0];let o=yield*v(n);return r.join(n,`regpick.config.${o}`)})}function b(r){return t.gen(function*(){let{config:i,sources:o}=yield*t.tryPromise({try:()=>a({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:m,merge:!0,cwd:r}),catch:t=>e(`ConfigError`,`Failed to load config`,t)});return{config:yield*n.decodeUnknown(p)(i).pipe(t.mapError(t=>e(`ConfigError`,`Config validation failed: ${t.message}`,t))),configPath:o[0]||null}})}export{f as a,p as i,y as n,h as o,_ as r,b as t};
@@ -1 +0,0 @@
1
- import{a as e,d as t,f as n,i as r,o as i,s as a,u as o}from"./index.mjs";import{i as s,n as c,r as l,t as u}from"./config-DEEdBTsb.mjs";import{Effect as d,Schema as f}from"effect";import p from"node:path";function m(e,t){return e?`cancelled`:t?`overwrite`:`keep`}const h=()=>d.gen(function*(){let o={fs:yield*r,http:yield*e,process:yield*i,prompt:yield*a},s=yield*n,l=yield*c(s.cwd).pipe(d.mapError(t)),f=(yield*d.either(o.fs.stat(l)))._tag===`Right`,{config:p}=yield*u(s.cwd).pipe(d.mapError(t));return{configPath:l,exists:f,existingConfig:p}}),g=t=>d.gen(function*(){let c={fs:yield*r,http:yield*e,process:yield*i,prompt:yield*a},l=yield*n;if(t.exists){let e=yield*c.prompt.confirm({message:`${t.configPath} already exists. Overwrite?`,initialValue:!1}),n=m(yield*c.prompt.isCancel(e),e===!0);if(n===`cancelled`)return yield*d.fail(o(`UserCancelled`,`Operation cancelled.`));if(n===`keep`)return yield*c.prompt.info(`Keeping existing configuration.`),null}let u=!!l.args.flags.yes,p=u?`auto`:yield*c.prompt.select({message:`What package manager do you use?`,options:[{value:`auto`,label:`Auto (detection)`},{value:`npm`,label:`npm`},{value:`yarn`,label:`yarn`},{value:`pnpm`,label:`pnpm`}]}),h=yield*c.prompt.isCancel(p);if(!u&&h)return yield*d.fail(o(`UserCancelled`,`Operation cancelled.`));let g=u?`src/components/ui`:yield*c.prompt.text({message:`What folder do you keep your UI components in?`,placeholder:`src/components/ui`}),_=yield*c.prompt.isCancel(g);if(!u&&_)return yield*d.fail(o(`UserCancelled`,`Operation cancelled.`));let v=u?`prompt`:yield*c.prompt.select({message:`Do you want to overwrite files automatically, or do you prefer to be asked?`,options:[{value:`prompt`,label:`Ask (prompt)`},{value:`overwrite`,label:`Always overwrite (overwrite)`},{value:`skip`,label:`Skip overwriting (skip)`}]}),y=yield*c.prompt.isCancel(v);if(!u&&y)return yield*d.fail(o(`UserCancelled`,`Operation cancelled.`));let b={...t.existingConfig,install:{packageManager:String(p),overwritePolicy:String(v)},resolve:{targets:{...t.existingConfig.resolve?.targets,"registry:component":String(g||`src/components/ui`),"registry:file":String(g||`src/components/ui`),"registry:icon":`${String(g||`src/components/ui`)}/icons`}}};return{newConfig:yield*d.try({try:()=>f.decodeUnknownSync(s)(b),catch:e=>o(`ConfigError`,`Internal error while generating new config: ${e.message}`,e)}),configPath:t.configPath,isOverwrite:t.exists}}),_=()=>d.gen(function*(){let t={fs:yield*r,http:yield*e,process:yield*i,prompt:yield*a},n=yield*g(yield*h());if(!n)return{kind:`noop`,message:`Keeping existing configuration.`};let o=p.extname(n.configPath).slice(1),s=[`ts`,`mjs`,`cjs`,`js`,`json`].includes(o)?o:`json`,c=l(n.newConfig,s);return yield*d.catchAll(t.fs.writeFile(n.configPath,c,`utf8`),e=>d.gen(function*(){return yield*t.prompt.error(`Failed to write config file: ${n.configPath}`),yield*d.fail(e)})),yield*t.prompt.success(`${n.isOverwrite?`Overwrote`:`Created`} ${n.configPath}`),{kind:`success`,message:`${n.isOverwrite?`Overwrote`:`Created`} ${n.configPath}`}});export{_ as runInitCommand};
@@ -1 +0,0 @@
1
- import{a as e,d as t,f as n,i as r,n as i,o as a,s as o,u as s}from"./index.mjs";import{a as c,i as l,n as u,r as d,t as f}from"./plugins-oE708wun.mjs";import{t as p}from"./config-DEEdBTsb.mjs";import{Effect as m}from"effect";function h(e,t){return e?t[e]?String(t[e]):e:null}function g(e,t){let n=h(e,t);if(n)return{source:n,requiresPrompt:!1};let r=Object.keys(t)[0];return r?{source:h(r,t),requiresPrompt:!1}:{source:null,requiresPrompt:!0}}function _(){return m.gen(function*(){let e=yield*n,r=yield*p(e.cwd).pipe(m.mapError(t)),i=g(e.args.positionals[1],r.config.registry.sources),a=[...yield*f(r.config.plugins||[],e.cwd).pipe(m.mapError(t)),u(),d(),l()];return{source:i.source,requiresPrompt:i.requiresPrompt,plugins:a}})}function v(t){return m.gen(function*(){let n={fs:yield*r,http:yield*e,process:yield*a,prompt:yield*o};if(!t.requiresPrompt)return t.source;let i=yield*n.prompt.text({message:`Registry URL/path:`,placeholder:`https://example.com/registry.json`});return(yield*n.prompt.isCancel(i))?yield*m.fail(s(`UserCancelled`,`Operation cancelled.`)):String(i)})}function y(t,i){return m.gen(function*(){let s={fs:yield*r,http:yield*e,process:yield*a,prompt:yield*o},{items:l}=yield*c(t,(yield*n).cwd,s,i);return l})}function b(e,t){let n=e.type||`registry:file`,r=Array.isArray(e.files)?e.files.length:0,i=``;if(t&&t.components&&t.components[e.name]){let n=t.components[e.name],r=n.installedAt?new Date(n.installedAt).toLocaleString():`Unknown date`;i=` \x1b[32m[Installed: ${n.version?`v${n.version}, `:``}${r}]\x1b[0m`}return`${e.name} (${n}, files: ${r})${i}`}function x(t,n){return m.gen(function*(){let i={fs:yield*r,http:yield*e,process:yield*a,prompt:yield*o};yield*i.prompt.info(`Found ${t.length} items.`),yield*m.forEach(t,e=>i.prompt.log(`- ${b(e,n)}`),{concurrency:1})})}function S(){return m.gen(function*(){let t={fs:yield*r,http:yield*e,process:yield*a,prompt:yield*o},s=yield*_(),c=yield*v(s);if(!c)return{kind:`noop`,message:`No registry source provided.`};let l=yield*y(c,s.plugins);return l.length?(yield*x(l,yield*i((yield*n).cwd,t)),{kind:`success`,message:`Listed ${l.length} item(s).`}):(yield*t.prompt.warn(`No items found in registry.`),{kind:`noop`,message:`No items found in registry.`})})}export{S as runListCommand};
@@ -1 +0,0 @@
1
- import{a as e,f as t,i as n,o as r,s as i,u as a}from"./index.mjs";import{Effect as o}from"effect";import s from"node:path";function c(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 l(e){let t=c(e.content),n=s.relative(e.targetDir,e.path).replace(/\\/g,`/`),r=s.basename(e.path,s.extname(e.path));return{name:r,title:r,description:`Packed component`,type:`registry:component`,dependencies:t,devDependencies:[],registryDependencies:[],files:[{path:n,type:`registry:component`}],sourceMeta:{type:`directory`,originalSource:e.targetDir}}}const u=t=>o.gen(function*(){let a={fs:yield*n,http:yield*e,process:yield*r,prompt:yield*i},c=[],l=e=>o.gen(function*(){let t=yield*a.fs.readdir(e);yield*o.forEach(t,t=>o.gen(function*(){let n=s.join(e,t);(yield*a.fs.stat(n)).isDirectory()?yield*l(n):(n.endsWith(`.ts`)||n.endsWith(`.tsx`))&&c.push(n)}),{concurrency:1})});return yield*l(t),c}),d=()=>o.gen(function*(){let c={fs:yield*n,http:yield*e,process:yield*r,prompt:yield*i},l=yield*t,d=l.args.positionals[1]||`.`,f=s.resolve(l.cwd,d);return(yield*c.fs.stat(f)).isDirectory()||(yield*o.fail(a(`ValidationError`,`Target is not a directory: ${f}`))),yield*c.prompt.info(`Scanning ${f} for components...`),{targetDir:f,files:yield*u(f)}}),f=a=>o.gen(function*(){let c={fs:yield*n,http:yield*e,process:yield*r,prompt:yield*i},u=yield*t,d=yield*o.forEach(a.files,e=>o.gen(function*(){return l({path:e,content:yield*c.fs.readFile(e,`utf8`),targetDir:a.targetDir})}),{concurrency:10}),f=s.join(u.cwd,`registry.json`);return{items:Array.from(d),outPath:f,fileCount:a.files.length}});function p(){return o.gen(function*(){let t={fs:yield*n,http:yield*e,process:yield*r,prompt:yield*i},a=yield*d();if(a.files.length===0)return yield*t.prompt.warn(`No .ts or .tsx files found.`),{kind:`noop`,message:`No files found.`};let s=yield*f(a),c=JSON.stringify({name:`my-registry`,items:s.items},null,2);return yield*o.catchAll(t.fs.writeFile(s.outPath,c,`utf8`),e=>o.gen(function*(){return yield*t.prompt.error(`Failed to write registry file: ${s.outPath}`),yield*o.fail(e)})),yield*t.prompt.success(`Packed ${s.items.length} components into registry.json`),{kind:`success`,message:`Generated registry.json`}})}export{p as runPackCommand};
@@ -1 +0,0 @@
1
- import{s as e,u as t}from"./index.mjs";import{a as n}from"./config-DEEdBTsb.mjs";import{Effect as r,Either as i,Option as a,Schema as o}from"effect";import s from"node:path";import{fileURLToPath as c,pathToFileURL as l}from"node:url";function u(e){return{fs:{existsSync:e.fs.existsSync,pathExists:t=>r.runPromise(e.fs.pathExists(t)),ensureDir:t=>r.runPromise(e.fs.ensureDir(t)),remove:t=>r.runPromise(e.fs.remove(t)),writeFile:(t,n,i)=>r.runPromise(e.fs.writeFile(t,n,i)),readFile:(t,n)=>r.runPromise(e.fs.readFile(t,n)),readJsonSync:t=>r.runPromise(e.fs.readJsonSync(t)),writeJson:(t,n,i)=>r.runPromise(e.fs.writeJson(t,n,i)),stat:t=>r.runPromise(e.fs.stat(t)),readdir:t=>r.runPromise(e.fs.readdir(t))},http:{getJson:(t,n)=>n===void 0?r.runPromise(e.http.getJson(t)):r.runPromise(e.http.getJson(t,n)),getText:(t,n)=>n===void 0?r.runPromise(e.http.getText(t)):r.runPromise(e.http.getText(t,n))},prompt:{intro:t=>r.runPromise(e.prompt.intro(t)),outro:t=>r.runPromise(e.prompt.outro(t)),cancel:t=>r.runPromise(e.prompt.cancel(t)),isCancel:t=>r.runPromise(e.prompt.isCancel(t)),info:t=>r.runPromise(e.prompt.info(t)),warn:t=>r.runPromise(e.prompt.warn(t)),error:t=>r.runPromise(e.prompt.error(t)),success:t=>r.runPromise(e.prompt.success(t)),log:t=>r.runPromise(e.prompt.log(t)),text:t=>r.runPromise(e.prompt.text(t)),confirm:t=>r.runPromise(e.prompt.confirm(t)),select:t=>r.runPromise(e.prompt.select(t)),multiselect:t=>r.runPromise(e.prompt.multiselect(t)),autocompleteMultiselect:t=>r.runPromise(e.prompt.autocompleteMultiselect(t))},process:{run:e.process.run}}}function d(e){let t=e.runtime,n=u(t);return{cwd:e.cwd,runtime:n}}function f(e){return{type:`pipeline`,name:e.name,...e.start&&{start:n=>r.tryPromise({try:()=>Promise.resolve(e.start(d(n))),catch:n=>t(`PluginError`,`[${e.name}] Failed in start: ${n instanceof Error?n.message:String(n)}`)})},...e.resolveId&&{resolveId:(n,i,a)=>r.tryPromise({try:()=>Promise.resolve(e.resolveId(n,i,a?d(a):void 0)),catch:n=>t(`PluginError`,`[${e.name}] Failed in resolveId: ${n instanceof Error?n.message:String(n)}`)})},...e.load&&{load:(n,i)=>r.tryPromise({try:()=>Promise.resolve(e.load(n,i?d(i):void 0)),catch:n=>t(`PluginError`,`[${e.name}] Failed in load: ${n instanceof Error?n.message:String(n)}`)})},...e.transform&&{transform:(n,i,a)=>r.tryPromise({try:()=>Promise.resolve(e.transform(n,i,a?d(a):void 0)),catch:n=>t(`PluginError`,`[${e.name}] Failed in transform: ${n instanceof Error?n.message:String(n)}`)})},...e.finish&&{finish:n=>r.tryPromise({try:()=>Promise.resolve(e.finish(d(n))),catch:n=>t(`PluginError`,`[${e.name}] Failed in finish: ${n instanceof Error?n.message:String(n)}`)})},...e.onError&&{onError:(n,i)=>r.tryPromise({try:()=>Promise.resolve(e.onError(n,d(i))),catch:n=>t(`PluginError`,`[${e.name}] Failed in onError: ${n instanceof Error?n.message:String(n)}`)})}}}const p=o.Struct({path:o.optionalWith(o.String,{exact:!0}),target:o.optionalWith(o.String,{exact:!0}),type:o.optionalWith(o.String,{exact:!0,default:()=>`registry:file`}),content:o.optionalWith(o.String,{exact:!0}),url:o.optionalWith(o.String,{exact:!0})}),m=o.Struct({name:o.optionalWith(o.String,{exact:!0,default:()=>`unnamed-item`}),title:o.optionalWith(o.String,{exact:!0}),description:o.optionalWith(o.String,{exact:!0,default:()=>``}),type:o.optionalWith(o.String,{exact:!0,default:()=>`registry:file`}),dependencies:o.optionalWith(o.Array(o.String),{exact:!0,default:()=>[]}),devDependencies:o.optionalWith(o.Array(o.String),{exact:!0,default:()=>[]}),registryDependencies:o.optionalWith(o.Array(o.String),{exact:!0,default:()=>[]}),files:o.optionalWith(o.Array(p),{exact:!0,default:()=>[]})}),h=o.Struct({type:o.String,originalSource:o.optionalWith(o.String,{exact:!0}),pluginState:o.optionalWith(o.Record({key:o.String,value:o.Unknown}),{exact:!0})});function g(e,n){return r.gen(function*(){let i=yield*o.decodeUnknown(m)(e).pipe(r.mapError(e=>t(`ValidationError`,`Manifest validation failed: ${e.message}`))),a=i.name===`unnamed-item`&&i.title?i.title:i.name,s=i.title??a,c=i.files.map(e=>({...e,type:e.type===`registry:file`&&i.type!==`registry:file`?i.type:e.type}));return{...i,name:a,title:s,files:c,sourceMeta:n}})}const _=o.Struct({url:o.optionalWith(o.String,{exact:!0}),href:o.optionalWith(o.String,{exact:!0}),path:o.optionalWith(o.String,{exact:!0})}),v=o.Struct({items:o.Array(o.Union(o.Record({key:o.String,value:o.Unknown}),_))});function y(e){let t=o.decodeUnknownEither(v)(e);return t._tag===`Left`?[]:t.right.items.map(e=>{if(e&&typeof e==`object`&&`files`in e)return null;let t=e;return typeof t.url==`string`?t.url:typeof t.href==`string`?t.href:typeof t.path==`string`?t.path:null}).filter(e=>!!e)}const b=o.Array(o.Unknown),x=o.Struct({items:o.Array(o.Unknown)}),S=o.Struct({name:o.optionalWith(o.String,{exact:!0}),files:o.Array(o.Unknown)}),C=o.Struct({rawData:o.Unknown,sourceMeta:h});function w(e,n){return r.gen(function*(){let i=o.decodeUnknownEither(b)(e);if(i._tag===`Right`){let e=i.right.filter(e=>!!(e&&typeof e==`object`));return yield*r.all(e.map(e=>g(e,n)))}let a=o.decodeUnknownEither(x)(e);if(a._tag===`Right`){let e=a.right.items.filter(e=>e&&typeof e==`object`&&`files`in e&&Array.isArray(e.files));return yield*r.all(e.map(e=>g(e,n)))}return o.decodeUnknownEither(S)(e)._tag===`Right`?[yield*g(e,n)]:yield*r.fail(t(`RegistryError`,`Unsupported manifest structure. Allowed formats: Array of items, { items: array }, or { files: array }`))})}function T(e,n,i,a,o){return r.gen(function*(){let s=o.filter(e=>e.type===`pipeline`);for(let o of s){if(!o.resolveId||!o.load)continue;let s=yield*r.tryPromise({try:async()=>o.resolveId(e,i||n,d({cwd:n,runtime:a})),catch:n=>n&&typeof n==`object`&&`_tag`in n?n:t(`RegistryError`,`Failed to resolve ${e}: ${n instanceof Error?n.message:String(n)}`,n)});if(!s)continue;let c=yield*r.tryPromise({try:async()=>o.load(s,d({cwd:n,runtime:a})),catch:e=>e&&typeof e==`object`&&`_tag`in e?e:t(`RegistryError`,`Failed to load ${s}: ${e instanceof Error?e.message:String(e)}`,e)});if(c!=null)return{plugin:o,resolvedId:s,content:c}}return yield*r.fail(t(`RegistryError`,`No suitable plugin found to resolve: ${e}`))})}function E(e,n,a,o,s){return r.gen(function*(){let c=yield*r.either(T(e,n,a.originalSource,o,s));if(i.isLeft(c)){let n=c.left;return n._tag===`RegistryError`&&n.message.includes(`No suitable plugin`)?yield*r.fail(t(`RegistryError`,`Could not resolve reference: ${e}`)):yield*r.fail(n)}let{resolvedId:l,content:u}=c.right,d;return d=typeof u==`string`?yield*r.try({try:()=>JSON.parse(u),catch:()=>t(`RegistryError`,`Failed to parse JSON for ${l}`)}):u,d&&typeof d==`object`?yield*g(d,a).pipe(r.mapError(e=>t(`ValidationError`,`Validation failed for item: ${e.message}`,e))):null})}function D(e,t,n,i,a){return r.gen(function*(){let o=w(e,n);if(!e||typeof e!=`object`||Array.isArray(e))return yield*o;let s=y(e);if(!s.length)return yield*o;let c=yield*r.catchAll(o,()=>r.succeed([])),l=yield*r.all(s.map(e=>E(e,t,n,i,a)),{concurrency:`unbounded`}).pipe(r.map(e=>e.filter(e=>e!==null)));return[...c,...l]})}function O(e,n,a,s){return r.gen(function*(){if(!e)return yield*r.fail(t(`ValidationError`,`Registry source is required.`));let c=yield*r.either(T(e,n,void 0,a,s));if(i.isLeft(c)){let n=c.left;return n._tag===`RegistryError`&&n.message.includes(`No suitable plugin found`)?yield*r.fail(t(`RegistryError`,`No suitable plugin found for source: ${e}`)):yield*r.fail(n)}let{resolvedId:l,content:u}=c.right,d=u;typeof u==`string`&&(d=yield*r.try({try:()=>JSON.parse(u),catch:()=>t(`RegistryError`,`Failed to parse registry manifest JSON from ${e}`)}));let f=[],p=o.decodeUnknownEither(C)(d);f=p._tag===`Right`?yield*D(p.right.rawData,n,p.right.sourceMeta,a,s):yield*D(d,n,{type:`system`,originalSource:l},a,s);let m=(d&&typeof d==`object`&&`resolvedSource`in d&&typeof d.resolvedSource==`string`?d.resolvedSource:void 0)||e;return{items:f.map(e=>({...e,sourceMeta:{...e.sourceMeta,originalSource:m}})),source:m}})}function k(e,n,a,o,s){return r.gen(function*(){if(typeof e.content==`string`)return e.content;let c=e.url||e.path;if(!c)return yield*r.fail(t(`ValidationError`,`File entry in "${n.name}" is missing both content and path/url.`));let l=yield*r.either(T(c,a,n.sourceMeta.originalSource||a,o,s));if(i.isLeft(l)){let e=l.left;return e._tag===`RegistryError`&&e.message.includes(`No suitable plugin found`)?yield*r.fail(t(`RegistryError`,`No suitable plugin found to resolve file content for: ${c}`)):yield*r.fail(e)}let{content:u}=l.right;return typeof u==`string`?u:JSON.stringify(u,null,2)})}function A(e){return/^file:\/\//i.test(e)}function j(){return{type:`pipeline`,name:`directory`,async resolveId(e,t,n){if(A(e))return e;let r;if(t&&A(t)){let n=s.dirname(c(new URL(t)));r=s.resolve(n,e)}else if(t&&s.isAbsolute(t)){let n=s.dirname(t);r=s.resolve(n,e)}else if(s.isAbsolute(e))r=e;else if(n)r=s.resolve(n.cwd,e);else return null;return l(r).toString()},async load(e,t){if(!A(e)||!t?.runtime?.fs)return null;let n=c(new URL(e));try{if(!(await t.runtime.fs.stat(n)).isDirectory())return null;let r=(await t.runtime.fs.readdir(n)).filter(e=>e.endsWith(`.json`));return{items:(await Promise.all(r.map(async e=>{let r=s.join(n,e);try{let e=await t.runtime.fs.readFile(r,`utf8`),n=JSON.parse(e);return n&&typeof n==`object`&&`files`in n&&Array.isArray(n.files)?n:null}catch{return null}}))).filter(e=>e!==null),resolvedSource:e}}catch{return null}}}}function M(e){return/^file:\/\//i.test(e)}function N(){return{type:`pipeline`,name:`file`,async resolveId(e,t,n){if(M(e))return e;let r;if(t&&M(t)){let n=s.dirname(c(new URL(t)));r=s.resolve(n,e)}else if(t&&s.isAbsolute(t)){let n=s.dirname(t);r=s.resolve(n,e)}else if(s.isAbsolute(e))r=e;else if(n&&e.endsWith(`.json`))r=s.resolve(n.cwd,e);else return null;return l(r).toString()},async load(e,t){if(!M(e)||!t?.runtime?.fs)return null;let n=c(new URL(e));try{if((await t.runtime.fs.stat(n)).isDirectory())return null;let e=await t.runtime.fs.readFile(n,`utf8`);try{return JSON.parse(e)}catch{return e}}catch{return null}}}}function P(){return{type:`pipeline`,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;try{let n=await t.runtime.http.getText(e);try{return JSON.parse(n)}catch{return n}}catch(t){throw Error(`Failed to load ${e}: ${t instanceof Error?t.message:String(t)}`)}}}}function F(i,c){let l=o.decodeUnknownOption(n);return r.gen(function*(){return yield*e,(yield*r.all(i.map(e=>{if(typeof e==`string`){let n=e;return(e.startsWith(`.`)||e.startsWith(`/`))&&(n=s.resolve(c,e)),r.tryPromise({try:()=>import(n).then(e=>e.default||e.plugin||e),catch:n=>t(`PluginError`,`Failed to load plugin module: ${e} - ${n instanceof Error?n.message:String(n)}`,n)}).pipe(r.flatMap(n=>a.match(l(n),{onNone:()=>r.fail(t(`PluginError`,`Invalid plugin provided from module: ${e}`)),onSome:e=>r.succeed(e)})))}return a.match(l(e),{onNone:()=>r.fail(t(`PluginError`,`Invalid inline plugin provided`)),onSome:e=>r.succeed(e)})}),{concurrency:`unbounded`})).filter(e=>e!==null)})}export{O as a,u as c,j as i,P as n,k as o,N as r,f as s,F as t};
@@ -1 +0,0 @@
1
- import{a as e,i as t,o as n,s as r,u as i}from"./index.mjs";import{Effect as a,Layer as o}from"effect";import s from"node:fs/promises";import{spawnSync as c}from"node:child_process";import l from"node:fs";const u=()=>o.succeed(t,{existsSync:e=>l.existsSync(e),pathExists:e=>a.tryPromise({try:()=>s.access(e),catch:()=>!1}).pipe(a.map(()=>!0),a.catchAll(()=>a.succeed(!1))),remove:e=>a.tryPromise({try:()=>s.rm(e,{recursive:!0,force:!0}),catch:t=>i(`FileSystemError`,`Failed to remove ${e}`,t)}),ensureDir:e=>a.tryPromise({try:()=>s.mkdir(e,{recursive:!0}),catch:t=>i(`FileSystemError`,`Failed to ensure directory: ${e}`,t)}),writeFile:(e,t,n)=>a.tryPromise({try:()=>s.writeFile(e,t,n),catch:t=>i(`FileSystemError`,`Failed to write file: ${e}`,t)}),readFile:(e,t)=>a.tryPromise({try:()=>s.readFile(e,t),catch:t=>i(`FileSystemError`,`Failed to read file: ${e}`,t)}),readJsonSync:e=>a.try({try:()=>{let t=l.readFileSync(e,`utf8`);return JSON.parse(t)},catch:t=>i(`JsonError`,`Failed to read JSON: ${e}`,t)}),writeJson:(e,t,n)=>a.tryPromise({try:()=>{let r=JSON.stringify(t,null,n?.spaces??2);return s.writeFile(e,r,`utf8`)},catch:t=>i(`JsonError`,`Failed to write JSON: ${e}`,t)}),stat:e=>a.tryPromise({try:()=>s.stat(e),catch:t=>i(`FileSystemError`,`Failed to stat path: ${e}`,t)}),readdir:e=>a.tryPromise({try:()=>s.readdir(e),catch:t=>i(`FileSystemError`,`Failed to read directory: ${e}`,t)})}),d=t=>o.succeed(e,{getJson:(e,n=15e3)=>a.tryPromise({try:async()=>{let r=await fetch(e,{signal:t?.signal||AbortSignal.timeout(n)});if(!r.ok)throw Error(`HTTP error! status: ${r.status} when fetching JSON from: ${e}`);return await r.json()},catch:t=>i(`NetworkError`,`Failed to fetch JSON from: ${e}`,t)}),getText:(e,n=15e3)=>a.tryPromise({try:async()=>{let r=await fetch(e,{signal:t?.signal||AbortSignal.timeout(n)});if(!r.ok)throw Error(`HTTP error! status: ${r.status} when fetching text from: ${e}`);return await r.text()},catch:t=>i(`NetworkError`,`Failed to fetch text from: ${e}`,t)})}),f=()=>o.succeed(r,{intro:e=>a.promise(async()=>{let{intro:t}=await import(`@clack/prompts`);t(e)}),outro:e=>a.promise(async()=>{let{outro:t}=await import(`@clack/prompts`);t(e)}),cancel:e=>a.promise(async()=>{let{cancel:t}=await import(`@clack/prompts`);t(e)}),isCancel:e=>a.sync(()=>typeof e==`symbol`&&e.description===`clack:cancel`),info:e=>a.promise(async()=>{let{log:t}=await import(`@clack/prompts`);t.info(e)}),warn:e=>a.promise(async()=>{let{log:t}=await import(`@clack/prompts`);t.warn(e)}),error:e=>a.promise(async()=>{let{log:t}=await import(`@clack/prompts`);t.error(e)}),success:e=>a.promise(async()=>{let{log:t}=await import(`@clack/prompts`);t.success(e)}),log:e=>a.sync(()=>{console.log(e)}),text:e=>a.promise(async()=>{let{text:t}=await import(`@clack/prompts`);return t(e)}),confirm:e=>a.promise(async()=>{let{confirm:t}=await import(`@clack/prompts`);return t(e)}),select:e=>a.promise(async()=>{let{select:t}=await import(`@clack/prompts`);return t(e)}),multiselect:e=>a.promise(async()=>{let{multiselect:t}=await import(`@clack/prompts`);return t(e)}),autocompleteMultiselect:e=>a.promise(async()=>{let t=await import(`@clack/prompts`);return t.autocompleteMultiselect?t.autocompleteMultiselect(e):t.multiselect(e)})}),p=()=>o.succeed(n,{run:(e,t,n)=>({status:c(e,t,{stdio:`inherit`,cwd:n,shell:!0}).status})}),m=e=>o.mergeAll(u(),d(e),f(),p());export{m as createRuntimeLive};
@@ -1,2 +0,0 @@
1
- import{a as e,c as t,d as n,f as r,i,n as a,o,p as s,r as c,s as l,t as u,u as d}from"./index.mjs";import{a as f,i as p,n as m,o as h,r as g,s as _,t as v}from"./plugins-oE708wun.mjs";import{t as y}from"./config-DEEdBTsb.mjs";import{i as b,n as x,r as S,t as C}from"./add-B8oUsJip.mjs";import{Effect as w,Either as T}from"effect";import E from"node:path";import{styleText as D}from"node:util";import O from"node:crypto";function k(e,t,n){return{type:`pipeline`,name:`regpick:core-update`,finish:r=>w.gen(function*(){`flushToDisk`in r.vfs&&(yield*w.tryPromise({try:()=>r.vfs.flushToDisk(),catch:e=>d(`VfsError`,`Failed to flush to disk: ${e instanceof Error?e.message:String(e)}`)}));for(let n of e){let e=[];for(let t of n.files){let n=E.relative(r.cwd,t.target),i=yield*w.tryPromise({try:()=>r.vfs.readFile(t.target,`utf-8`),catch:()=>!1}).pipe(w.catchAll(()=>w.succeed(null)));i===null?e.push({path:n,content:t.remoteContent}):e.push({path:n,content:i.toString()})}t.components[n.itemName]={...t.components[n.itemName],files:e.map(e=>({path:e.path,hash:u(e.content)})).sort((e,t)=>e.path.localeCompare(t.path))}}yield*c(r.cwd,t,n).pipe(w.mapError(e=>d(`FileSystemError`,`Failed to write lockfile: ${e.message}`)))})}}function A(e){let t={};for(let n of Object.keys(e.components)){let r=e.components[n].source;r&&(t[r]||(t[r]=[]),t[r].push(n))}return t}const j=(e,t,n,r,i,a)=>w.gen(function*(){let o=[],s=[];for(let{file:e,content:r}of n){let n=C(r,a),c=yield*x(t,e,i,a);o.push({target:c.absoluteTarget,content:n}),s.push({path:c.relativeTarget,hash:u(n)})}s.sort((e,t)=>e.path.localeCompare(t.path));let c=r.files?[...r.files].sort((e,t)=>e.path.localeCompare(t.path)):[],l=c.length===0,d=!1;if(c.length!==s.length)d=!0;else for(let e=0;e<s.length;e++)if(s[e].path!==c[e].path||s[e].hash!==c[e].hash){d=!0;break}let f=l||d?`requires-diff-prompt`:`up-to-date`;return yield*w.succeed({itemName:e,status:f,newFiles:s,files:o})});function M(){return w.gen(function*(){let t={fs:yield*i,http:yield*e,process:yield*o,prompt:yield*l},s=yield*r,c=yield*y(s.cwd).pipe(w.mapError(n)),u=yield*a(s.cwd,t).pipe(w.mapError(n));return c.configPath?{config:c.config,lockfile:u}:(yield*t.prompt.error(`No regpick.json configuration found. Please run 'init' first.`),yield*w.fail(d(`ValidationError`,`No config file found`)))})}function N(t,n){return w.gen(function*(){let a=yield*s,c={fs:yield*i,http:yield*e,process:yield*o,prompt:yield*l},u=yield*r,d=A(t);return(yield*w.forEach(Object.entries(d),([e,r])=>w.gen(function*(){let i=yield*w.either(f(e,u.cwd,c,n));if(T.isLeft(i))return yield*c.prompt.warn(`Failed to load registry ${e}`),[];let o=i.right.items;return(yield*w.forEach(r,e=>w.gen(function*(){let r=o.find(t=>t.name===e);if(!r)return null;let i=yield*w.all(r.files.map(e=>h(e,r,u.cwd,c,n).pipe(w.map(t=>({file:e,content:t})),w.catchAll(()=>w.succeed(null)))),{concurrency:`unbounded`}).pipe(w.map(e=>e.filter(e=>e!==null))),s=t.components[e],l=yield*w.catchAll(j(e,r,i,s,u.cwd,a),()=>w.succeed(null));if(!l)return null;let d=l;if(d.status===`requires-diff-prompt`){let t=yield*w.forEach(d.files,e=>w.gen(function*(){let t=yield*w.catchAll(c.fs.readFile(e.target,`utf8`),()=>w.succeed(``));return{target:e.target,remoteContent:e.content,localContent:t}}),{concurrency:`unbounded`});return{itemName:e,newFiles:d.newFiles,files:t}}return null}),{concurrency:`unbounded`})).filter(e=>e!==null)}),{concurrency:1})).flat()})}function P(e,t){return w.gen(function*(){let r=yield*l,i=yield*w.tryPromise({try:()=>import(`diff`).then(({diffLines:n})=>n(e,t)),catch:n});yield*w.forEach(i,e=>w.gen(function*(){let t=e.added?`green`:e.removed?`red`:`gray`,n=e.added?`+ `:e.removed?`- `:` `,i=e.value.replace(/\n$/,``).split(`
2
- `);for(let e of i)yield*r.log(D(t,`${n}${e}`))}),{concurrency:1})})}function F(t){return w.gen(function*(){let n={fs:yield*i,http:yield*e,process:yield*o,prompt:yield*l};return{approvedUpdates:(yield*w.forEach(t,e=>w.gen(function*(){yield*n.prompt.info(`Update available for ${e.itemName}`);let t=yield*n.prompt.select({message:`What do you want to do with ${e.itemName}?`,options:[{value:`diff`,label:`Show diff`},{value:`update`,label:`Update`},{value:`skip`,label:`Skip`}]});if((yield*n.prompt.isCancel(t))||t===`skip`)return null;if(t===`diff`){yield*w.forEach(e.files,e=>w.gen(function*(){yield*n.prompt.log(D(`bold`,`\nDiff for ${e.target}:`)),yield*P(e.localContent,e.remoteContent)}),{concurrency:1});let t=yield*n.prompt.confirm({message:`Update ${e.itemName} now?`,initialValue:!0});if((yield*n.prompt.isCancel(t))||!t)return null}return e}),{concurrency:1})).filter(e=>e!==null)}})}function I(){return w.gen(function*(){let a=yield*M(),c=yield*r,u=yield*v(a.config.plugins||[],c.cwd).pipe(w.mapError(n)),d={...a.config,plugins:u},f=w.gen(function*(){let n={fs:yield*i,http:yield*e,process:yield*o,prompt:yield*l};if(Object.keys(a.lockfile.components).length===0)return yield*n.prompt.info(`No components installed. Nothing to update.`),{kind:`noop`,message:`No components to update.`};let r=(yield*s).plugins||[],u=[...r,m(),g(),p()],d=yield*N(a.lockfile,u);if(d.length===0)return{kind:`noop`,message:`All components are up to date.`};let f;f=c.args?.flags?.yes?{approvedUpdates:d}:yield*F(d);let h=f.approvedUpdates.length;if(h===0)return{kind:`noop`,message:`No updates approved.`};let v=JSON.parse(JSON.stringify(a.lockfile)),y=[];yield*w.forEach(f.approvedUpdates,e=>w.sync(()=>{e.files.forEach(e=>{y.push({id:e.target,code:e.remoteContent})}),v.components[e.itemName].installedAt=new Date().toISOString()}),{concurrency:`unbounded`});let x=r.filter(e=>e.type===`pipeline`),C=new S,T=[...x.map(e=>_(e)),k(f.approvedUpdates,v,n)],E=yield*t,D={id:O.randomUUID(),command:`update`,status:`pending`,plannedFiles:y.map(e=>e.id),lockfileBackup:a.lockfile};return yield*E.writeIntent(D,c.cwd),yield*b({vfs:C,cwd:c.cwd,runtime:n},T,y).pipe(w.tapError(()=>E.clearIntent(c.cwd)),w.catchAll(e=>(C.rollback(),w.gen(function*(){return yield*n.prompt.error(`[Failed] Update aborted: ${e.message}`),yield*w.fail(e)}))),w.tap(()=>E.clearIntent(c.cwd))),{kind:`success`,message:`Updated ${h} components.`}});return yield*w.provideService(f,s,d)})}export{I as runUpdateCommand};