@idem.agency/idem-ui 0.1.0 → 0.3.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/README.md +86 -0
- package/dist/bin.js +29 -7
- package/dist/webapp/assets/{index-BFl0P_vr.js → index-BmiGpjAz.js} +15 -15
- package/dist/webapp/index.html +1 -1
- package/package.json +5 -2
package/README.md
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# @idem.agency/idem-ui
|
|
2
|
+
|
|
3
|
+
Раздатчик готовых фронтенд-решений: CLI копирует исходники компонента из общего хранилища прямо в твой проект. Это не дизайн-система и не библиотека-зависимость — скопированный код становится твоим.
|
|
4
|
+
|
|
5
|
+
## Быстрый старт
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npx -y @idem.agency/idem-ui web # визуальная витрина в браузере
|
|
9
|
+
npx -y @idem.agency/idem-ui get checkbox # забрать компонент по имени
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
Нужны Node 22.16+ и доступ к `gitlab.idem.agency` (подними VPN — без него любая команда упадёт на «не удалось подключиться к хранилищу»).
|
|
13
|
+
|
|
14
|
+
Пользуешься часто — поставь глобально, дальше без `npx`:
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
npm i -g @idem.agency/idem-ui
|
|
18
|
+
idem-ui web
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Что важно понимать
|
|
22
|
+
|
|
23
|
+
- **Компонент** — папка, решающая одну повторяющуюся задачу. Зовётся **слагом** — именем своей папки: `checkbox`, `burger`, `form`.
|
|
24
|
+
- **Вариант** — конкретная реализация внутри компонента (`next`). Вариант один — берётся молча, несколько — CLI спросит какой.
|
|
25
|
+
- **Copy-and-own.** После копирования файлы принадлежат проекту: правь как хочешь, связи с хранилищем не остаётся.
|
|
26
|
+
- **Зависимости ставишь сам.** CLI кладёт файлы и не трогает твой `package.json`. Что нужно доустановить — смотри в коде компонента и в его P.S.
|
|
27
|
+
- **Обновления нет.** «Обновить» = скопировать заново поверх с `--force`, потеряв свои правки в этой папке.
|
|
28
|
+
|
|
29
|
+
## Команды
|
|
30
|
+
|
|
31
|
+
### get — забрать компонент по имени
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
idem-ui get <slug> [--variant <label>] [--path <dir>] [--force]
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
| Флаг | Что делает |
|
|
38
|
+
| --- | --- |
|
|
39
|
+
| `--variant <label>` | взять конкретный вариант |
|
|
40
|
+
| `--path <dir>` | куда класть (по умолчанию — текущая папка) |
|
|
41
|
+
| `--force` | перезаписать существующую папку |
|
|
42
|
+
|
|
43
|
+
`--path` задаёт **родителя**: имя компонента дописывается всегда.
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
idem-ui get checkbox --path src/shared/ui # → src/shared/ui/checkbox
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Папка уже занята — CLI спросит, перезаписывать ли (по умолчанию «нет»). Согласие или `--force` заменяет папку **целиком**: она сносится и пишется заново, твоих правок в ней не останется.
|
|
50
|
+
|
|
51
|
+
Из пайпа или CI спрашивать некого — там сразу передавай `--variant` (если вариантов несколько) и `--force` (если папка может быть занята), иначе команда упадёт.
|
|
52
|
+
|
|
53
|
+
После копирования CLI печатает описание компонента и, если автор его оставил, постскриптум под заголовком «P.S.» — читай, там бывает важное.
|
|
54
|
+
|
|
55
|
+
### list — витрина в терминале
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
idem-ui list
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Аргументов нет. В терминале с человеком — интерактивный список: набираешь часть слага или названия, список сужается; выбрал компонент — дальше тот же путь, что у `get` (спросит вариант, спросит папку, скопирует).
|
|
62
|
+
|
|
63
|
+
В пайпе или CI (`idem-ui list | grep form`) просто печатает перечень компонентов и выходит.
|
|
64
|
+
|
|
65
|
+
### web — витрина в браузере
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
idem-ui web
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Аргументов нет. Поднимает локальный сервер на `http://127.0.0.1:4321` (или ближайшем свободном порту) и сам открывает браузер. Там компоненты видны карточками с обложками, папку назначения выбираешь деревом своего проекта, копирование — кнопкой. `Ctrl+C` останавливает сервер.
|
|
72
|
+
|
|
73
|
+
Самый удобный вход, когда не знаешь, что вообще лежит в хранилище.
|
|
74
|
+
|
|
75
|
+
### help — справка
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
idem-ui # список команд
|
|
79
|
+
idem-ui help
|
|
80
|
+
idem-ui get --help # по конкретной команде
|
|
81
|
+
idem-ui help get
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
Актуальный список команд и флагов всегда отдаёт сам CLI: `idem-ui help`.
|
package/dist/bin.js
CHANGED
|
@@ -1,18 +1,40 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{access as
|
|
2
|
+
import{access as $e,mkdir as W,readdir as Oe,rm as Ae,writeFile as xe}from"fs/promises";import{dirname as Ne,join as Me}from"path";var s={UnknownCommand:"ERR_UNKNOWN_COMMAND",SlugRequired:"ERR_SLUG_REQUIRED",TooManySlugs:"ERR_TOO_MANY_SLUGS",UnknownOption:"ERR_UNKNOWN_OPTION",VariantNotFound:"ERR_VARIANT_NOT_FOUND",VariantRequired:"ERR_VARIANT_REQUIRED",StorageUnreachable:"ERR_STORAGE_UNREACHABLE",StorageTimeout:"ERR_STORAGE_TIMEOUT",StorageHttp:"ERR_STORAGE_HTTP",StorageEmptyArchive:"ERR_STORAGE_EMPTY_ARCHIVE",StorageNotFound:"ERR_STORAGE_NOT_FOUND",StorageQueryRejected:"ERR_STORAGE_QUERY_REJECTED",ComponentNotFound:"ERR_COMPONENT_NOT_FOUND",MetaInvalid:"ERR_META_INVALID",ComponentHasNoVariants:"ERR_COMPONENT_HAS_NO_VARIANTS",TargetExists:"ERR_TARGET_EXISTS",WriteFailed:"ERR_WRITE_FAILED",NoFreePort:"ERR_NO_FREE_PORT",Cancelled:"ERR_CANCELLED"},E=class extends Error{constructor(t){super(t.code);this.details=t;this.name=new.target.name,this.code=t.code}code},f=class extends E{exitCode=2},u=class extends E{exitCode=1},j=class extends E{exitCode=1},O=class extends E{exitCode=1},A=class extends E{exitCode=1},y=class extends E{exitCode=130;constructor(){super({code:s.Cancelled})}};function J(){return{exists:async e=>{try{return await $e(e),!0}catch{return!1}},writeFiles:async(e,r)=>{try{await Ae(e,{recursive:!0,force:!0}),await W(e,{recursive:!0});for(let t of r){let o=Me(e,t.path);await W(Ne(o),{recursive:!0}),await xe(o,t.data)}}catch(t){throw new O({code:s.WriteFailed,target:e,reason:t instanceof Error?t.message:String(t)})}},readSubdirs:async(e,r)=>(await Oe(e,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name).filter(o=>!r(o)).toSorted()}}function F(e){return`components/${e}`}function N(e){return`${F(e)}/meta.json`}function Ie(e,r){return`${F(e)}/${r}`}function Z(e,r,t){if(t.thumbnail!==void 0)return e.fileUrl(`${F(r)}/${t.thumbnail}`)}function z(e){return{async loadComponent(r){let t=await Ue(e,r),o=await De(e,r);if(o.length===0)throw new j({code:s.ComponentHasNoVariants,slug:r,name:t.name});let n=o.toSorted().map(c=>({label:c}));return{slug:r,meta:t,variants:n,thumbnailUrl:Z(e,r,t)}},async loadVariantFiles(r,t){return e.fetchArchive(Ie(r,t))},async listComponents(){let r=await Y(e),t=await K(e,r),o=r.map(i=>ee(i,t.get(N(i)))),n=[],c=[];for(let i of o)i.kind==="component"?n.push({slug:i.slug,meta:i.meta}):c.push(i.skipped);return{components:n.toSorted(x),skipped:c.toSorted(x)}},async listAll(){let r=await Y(e),[t,o]=await Promise.all([K(e,r),e.fetchFoldersBatch(r.map(a=>F(a)))]),n=r.map(a=>Le(e,a,t.get(N(a)),o.get(F(a))??[])),c=[],i=[];for(let a of n)a.kind==="component"?c.push(a.component):i.push(a.skipped);return{components:c.toSorted(x),skipped:i.toSorted(x)}}}}async function Ue(e,r){let t=await Ve(e,r);return X(t,r)}function X(e,r){let t;try{t=JSON.parse(e)}catch{throw new j({code:s.MetaInvalid,slug:r})}if(typeof t!="object"||t===null||Array.isArray(t))throw new j({code:s.MetaInvalid,slug:r});return t}async function Y(e){try{return await e.fetchFolders("components")}catch(r){if(r instanceof u&&r.code===s.StorageNotFound)return[];throw r}}async function K(e,r){return e.fetchFilesBatch(r.map(t=>N(t)))}function ee(e,r){if(r===void 0)return{kind:"skipped",skipped:{slug:e,reason:"missing"}};try{let t=X(r,e);return{kind:"component",slug:e,meta:t}}catch(t){if(t instanceof j&&t.code===s.MetaInvalid)return{kind:"skipped",skipped:{slug:e,reason:"invalid"}};throw t}}function Le(e,r,t,o){let n=ee(r,t);if(n.kind==="skipped")return n;if(o.length===0)return{kind:"skipped",skipped:{slug:r,reason:"no-variants"}};let c=o.toSorted().map(i=>({label:i}));return{kind:"component",component:{slug:r,meta:n.meta,variants:c,thumbnailUrl:Z(e,r,n.meta)}}}function x(e,r){return e.slug.localeCompare(r.slug)}async function Ve(e,r){try{return await e.fetchFile(N(r))}catch(t){throw t instanceof u&&t.code===s.StorageNotFound?new j({code:s.ComponentNotFound,slug:r}):t}}async function De(e,r){try{return await e.fetchFolders(F(r))}catch(t){if(t instanceof u&&t.code===s.StorageNotFound)return[];throw t}}var V={host:"gitlab.idem.agency",projectPath:"barabel/component-storage",ref:"main"};function re(e=process.env){return{host:e.IDEM_STORAGE_HOST||V.host,projectPath:e.IDEM_STORAGE_PROJECT_PATH||V.projectPath,ref:e.IDEM_STORAGE_REF||V.ref}}import{gunzipSync as Ke}from"zlib";var He={offset:0,length:100},Be={offset:124,length:12},Ge={offset:156,length:1},qe={offset:345,length:155},Qe=["0","\0"];function te(e){let r=[],t=0;for(;t+512<=e.length;){let o=e.subarray(t,t+512);if(Ye(o))break;let n=Je(o),c=M(o,Ge),i=t+512;Qe.includes(c)&&r.push({name:We(o),data:e.slice(i,i+n)}),t=i+Math.ceil(n/512)*512}return r}function We(e){let r=M(e,He),t=M(e,qe);return t===""?r:`${t}/${r}`}function Je(e){return parseInt(M(e,Be),8)||0}function M(e,r){let t=e.subarray(r.offset,r.offset+r.length),o=t.indexOf(0);return new TextDecoder().decode(o===-1?t:t.subarray(0,o)).trim()}function Ye(e){return e.every(r=>r===0)}var oe=1e4,Ze=70,ze=25,Xe=`
|
|
3
|
+
query($project: ID!, $ref: String!, $paths: [String!]!) {
|
|
4
|
+
project(fullPath: $project) {
|
|
5
|
+
repository {
|
|
6
|
+
blobs(paths: $paths, ref: $ref) {
|
|
7
|
+
nodes {
|
|
8
|
+
path
|
|
9
|
+
rawTextBlob
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
`;function er(e){let r=Array.from({length:e},(n,c)=>c),t=r.map(n=>`$p${n}: String!`),o=r.map(n=>`t${n}: paginatedTree(path: $p${n}, ref: $ref) { nodes { trees { nodes { name } } } }`);return`
|
|
16
|
+
query($project: ID!, $ref: String!, ${t.join(", ")}) {
|
|
17
|
+
project(fullPath: $project) {
|
|
18
|
+
repository {
|
|
19
|
+
${o.join(`
|
|
20
|
+
`)}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
`}function ie(e,r=globalThis.fetch){let t=encodeURIComponent(e.projectPath),o=`https://${e.host}/api/v4/projects/${t}/repository`;function n(a){return`${o}/files/${encodeURIComponent(a)}/raw?ref=${e.ref}`}return{fileUrl:n,async fetchFile(a){let m=n(a),p=await i(m);if(!p.ok)throw D(p.status,a);return p.text()},async fetchArchive(a){let m=`${o}/archive.tar.gz?sha=${e.ref}&path=${a}`,p=await i(m,{mode:"same-origin"});if(!p.ok)throw D(p.status,a);let g=new Uint8Array(await p.arrayBuffer());if(g.length===0)throw se(a);let d=[];for(let b of te(Ke(g))){let w=rr(a,b.name);w!==void 0&&d.push({path:w,data:b.data})}if(d.length===0)throw se(a);return d},async fetchFolders(a){let m=`${o}/tree?path=${encodeURIComponent(a)}&ref=${e.ref}&per_page=100`,p=[],g="";do{let d=await i(g===""?m:`${m}&page=${encodeURIComponent(g)}`);if(!d.ok)throw D(d.status,a);g=d.headers.get("x-next-page")??"";let b=await d.json();p.push(...b.filter(w=>w.type==="tree").map(w=>w.name))}while(g!=="");return p},async fetchFilesBatch(a){let m=await Promise.all(ne(a,Ze).map(g=>c(Xe,{paths:g}))),p=new Map;for(let g of m)for(let d of g.project.repository.blobs.nodes)p.set(d.path,d.rawTextBlob);return p},async fetchFoldersBatch(a){let m=await Promise.all(ne(a,ze).map(async g=>{let d=await c(er(g.length),tr(g));return{batch:g,data:d}})),p=new Map;for(let{batch:g,data:d}of m)g.forEach((b,w)=>{let $=d.project.repository[`t${w}`];p.set(b,($?.nodes??[]).flatMap(_=>_.trees.nodes.map(k=>k.name)))});return p}};async function c(a,m){let p=await i(`https://${e.host}/api/graphql`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({query:a,variables:{...m,project:e.projectPath,ref:e.ref}})});if(!p.ok)throw new u({code:s.StorageHttp,status:p.status});let g=await p.json(),[d]=g.errors??[];if(d!==void 0)throw new u({code:s.StorageQueryRejected,reason:d.message});return g.data}async function i(a,m={}){try{return await r(a,{...m,signal:AbortSignal.timeout(oe)})}catch(p){throw p instanceof Error&&p.name==="TimeoutError"?new u({code:s.StorageTimeout,host:e.host,ms:oe}):new u({code:s.StorageUnreachable,host:e.host})}}}function rr(e,r){let t=`${e}/`,o=r.lastIndexOf(t);if(o!==-1)return r.slice(o+t.length)}function tr(e){return Object.fromEntries(e.map((r,t)=>[`p${t}`,r]))}function ne(e,r){let t=[];for(let o=0;o<e.length;o+=r)t.push(e.slice(o,o+r));return t}function D(e,r){return e===404?new u({code:s.StorageNotFound,path:r}):new u({code:s.StorageHttp,status:e})}function se(e){return new u({code:s.StorageEmptyArchive,path:e})}function ae(e){return{command:e[0],rest:e.slice(1)}}function v(e){return e.includes("--help")||e.includes("-h")}async function I(e,r,t){if(r!==void 0){let o=e.variants.find(n=>n.label===r);if(!o)throw new f({code:s.VariantNotFound,slug:e.slug,name:e.meta.name,requested:r,available:e.variants.map(n=>n.label)});return o}return e.variants.length===1?e.variants[0]:t.pick(e.slug,e.meta.name,e.variants)}import ce from"path";function H(e,r,t){let o=ce.resolve(e,r??".");return ce.join(o,t)}async function U(e,r,t,o,n,c){let i=H(o,r,e);return await n.exists(i)&&!t&&await c.confirm(i),i}import{parseArgs as or}from"util";function pe(e){let r,t;try{({values:r,positionals:t}=or({args:e,allowPositionals:!0,options:{variant:{type:"string"},path:{type:"string"},force:{type:"boolean",default:!1}}}))}catch(o){let n=o instanceof Error?o.message:String(o);throw new f({code:s.UnknownOption,detail:n,command:"get"})}if(t.length===0)throw new f({code:s.SlugRequired,command:"get"});if(t.length>1)throw new f({code:s.TooManySlugs,got:t,command:"get"});return{slug:t[0],variant:r.variant,path:r.path,force:r.force}}var B={get:{summary:"\u0441\u043A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442",usage:"idem-ui get <name> [--variant <label>] [--path <dir>] [--force]",flags:[{flag:"--variant <label>",describes:"\u0432\u044B\u0431\u0440\u0430\u0442\u044C \u0432\u0430\u0440\u0438\u0430\u043D\u0442 \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u0430"},{flag:"--path <dir>",describes:"\u043A\u0443\u0434\u0430 \u0441\u043A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C (\u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E \u2014 \u043F\u043E \u0438\u043C\u0435\u043D\u0438)"},{flag:"--force",describes:"\u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0438\u0441\u0430\u0442\u044C \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044E\u0449\u0443\u044E \u043F\u0430\u043F\u043A\u0443"}]},list:{summary:"\u043F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u043F\u0435\u0440\u0435\u0447\u0435\u043D\u044C \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u043E\u0432",usage:"idem-ui list",flags:[]},web:{summary:"\u043F\u043E\u0434\u043D\u044F\u0442\u044C \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u0443\u044E \u0432\u0435\u0431-\u0432\u0438\u0442\u0440\u0438\u043D\u0443",usage:"idem-ui web",flags:[]},help:{summary:"\u043F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0441\u043F\u0440\u0430\u0432\u043A\u0443",usage:"idem-ui help [command]",flags:[]}},R={general:()=>`idem-ui \u2014 \u043A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u043B\u044C\u0449\u0438\u043A \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u043E\u0432.
|
|
3
25
|
|
|
4
26
|
\u041A\u043E\u043C\u0430\u043D\u0434\u044B:
|
|
5
|
-
${Object.entries(
|
|
6
|
-
`)}`,forCommand:e=>{let{summary:r,usage:t,flags:o}=
|
|
27
|
+
${Object.entries(B).map(([r,{summary:t}])=>` ${r.padEnd(6)} ${t}`).join(`
|
|
28
|
+
`)}`,forCommand:e=>{let{summary:r,usage:t,flags:o}=B[e];if(o.length===0)return`\u0414\u043B\u044F \u0447\u0435\u0433\u043E: ${r}
|
|
7
29
|
|
|
8
|
-
\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435: ${t}`;let
|
|
30
|
+
\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435: ${t}`;let n=o.map(({flag:c,describes:i})=>` ${c.padEnd(20)} ${i}`);return`\u0414\u043B\u044F \u0447\u0435\u0433\u043E: ${r}
|
|
9
31
|
|
|
10
32
|
\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435: ${t}
|
|
11
33
|
|
|
12
34
|
\u0424\u043B\u0430\u0433\u0438:
|
|
13
|
-
${
|
|
14
|
-
`)}`},isCommand:e=>e in
|
|
35
|
+
${n.join(`
|
|
36
|
+
`)}`},isCommand:e=>e in B};var L=(e,r)=>`${r} (${e})`,l={error:e=>{switch(e.code){case s.UnknownCommand:return`\u041D\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043D\u0430\u044F \u043A\u043E\u043C\u0430\u043D\u0434\u0430 ${e.got}. \u0421\u043F\u0438\u0441\u043E\u043A \u043A\u043E\u043C\u0430\u043D\u0434 \u2014 idem-ui help.`;case s.SlugRequired:return"\u041D\u0435 \u0443\u043A\u0430\u0437\u0430\u043D\u043E \u0438\u043C\u044F \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u0430.";case s.TooManySlugs:return`\u041E\u0436\u0438\u0434\u0430\u043B\u043E\u0441\u044C \u043E\u0434\u043D\u043E \u0438\u043C\u044F \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u0430, \u043F\u043E\u043B\u0443\u0447\u0435\u043D\u043E: ${e.got.join(", ")}`;case s.UnknownOption:return`\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0435 \u0430\u0440\u0433\u0443\u043C\u0435\u043D\u0442\u044B: ${e.detail}`;case s.VariantNotFound:return`\u0423 \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u0430 ${L(e.slug,e.name)} \u043D\u0435\u0442 \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u0430 ${e.requested}. \u0414\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0435: ${e.available.join(", ")}`;case s.VariantRequired:return`\u0423 \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u0430 ${L(e.slug,e.name)} \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u043E\u0432: ${e.available.join(", ")}. \u0423\u043A\u0430\u0436\u0438 --variant <label>.`;case s.StorageUnreachable:return`\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0438\u0442\u044C\u0441\u044F \u043A \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0443 ${e.host}. \u041F\u0440\u043E\u0432\u0435\u0440\u044C, \u043F\u043E\u0434\u043D\u044F\u0442 \u043B\u0438 VPN.`;case s.StorageTimeout:return`\u0425\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435 ${e.host} \u043D\u0435 \u043E\u0442\u0432\u0435\u0442\u0438\u043B\u043E \u0437\u0430 ${e.ms/1e3} \u0441. \u041F\u0440\u043E\u0432\u0435\u0440\u044C VPN; \u0435\u0441\u043B\u0438 \u043E\u043D \u043F\u043E\u0434\u043D\u044F\u0442 \u2014 \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E, GitLab \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D.`;case s.StorageHttp:return`\u0425\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435 \u043E\u0442\u0432\u0435\u0442\u0438\u043B\u043E \u043E\u0448\u0438\u0431\u043A\u043E\u0439 ${e.status}. \u041F\u043E\u0434\u043E\u0436\u0434\u0438 \u0438 \u043F\u043E\u043F\u0440\u043E\u0431\u0443\u0439 \u0441\u043D\u043E\u0432\u0430; \u0435\u0441\u043B\u0438 \u043F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u0441\u044F \u2014 \u0441\u043E\u043E\u0431\u0449\u0438 \u043C\u0435\u0439\u043D\u0442\u0435\u0439\u043D\u0435\u0440\u0443.`;case s.StorageEmptyArchive:return`\u0425\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435 \u043E\u0442\u0434\u0430\u043B\u043E \u043F\u0443\u0441\u0442\u043E\u0439 \u0430\u0440\u0445\u0438\u0432 \u0434\u043B\u044F ${e.path}. \u041F\u043E\u0434\u043E\u0436\u0434\u0438 \u0438 \u043F\u043E\u043F\u0440\u043E\u0431\u0443\u0439 \u0441\u043D\u043E\u0432\u0430; \u0435\u0441\u043B\u0438 \u043F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u0441\u044F \u2014 \u0441\u043E\u043E\u0431\u0449\u0438 \u043C\u0435\u0439\u043D\u0442\u0435\u0439\u043D\u0435\u0440\u0443.`;case s.StorageNotFound:return`\u0412 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435 \u043D\u0435\u0442 \u043F\u0443\u0442\u0438 ${e.path}. \u041F\u0440\u043E\u0432\u0435\u0440\u044C \u0438\u043C\u044F.`;case s.StorageQueryRejected:return`\u0425\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435 \u043E\u0442\u0432\u0435\u0440\u0433\u043B\u043E \u0437\u0430\u043F\u0440\u043E\u0441, \u0441\u0435\u0442\u044C \u043F\u0440\u0438 \u044D\u0442\u043E\u043C \u0446\u0435\u043B\u0430 \u2014 \u0441\u043E\u043E\u0431\u0449\u0438 \u043C\u0435\u0439\u043D\u0442\u0435\u0439\u043D\u0435\u0440\u0443. \u041E\u0442\u0432\u0435\u0442 GitLab: ${e.reason}`;case s.ComponentNotFound:return`\u0412 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435 \u043D\u0435\u0442 \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u0430 ${e.slug}. \u041F\u0440\u043E\u0432\u0435\u0440\u044C \u0438\u043C\u044F.`;case s.MetaInvalid:return`\u041C\u0435\u0442\u0430 \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u0430 ${e.slug} \u043D\u0435 \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043A\u043E\u0440\u0440\u0435\u043A\u0442\u043D\u044B\u043C JSON-\u043E\u0431\u044A\u0435\u043A\u0442\u043E\u043C. \u0421\u043E\u043E\u0431\u0449\u0438 \u043C\u0435\u0439\u043D\u0442\u0435\u0439\u043D\u0435\u0440\u0443.`;case s.ComponentHasNoVariants:return`\u0423 \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u0430 ${L(e.slug,e.name)} \u043D\u0435\u0442 \u043D\u0438 \u043E\u0434\u043D\u043E\u0439 \u043F\u0430\u043F\u043A\u0438-\u0432\u0430\u0440\u0438\u0430\u043D\u0442\u0430. \u0421\u043E\u043E\u0431\u0449\u0438 \u043C\u0435\u0439\u043D\u0442\u0435\u0439\u043D\u0435\u0440\u0443 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0430.`;case s.TargetExists:return`\u041F\u0430\u043F\u043A\u0430 ${e.target} \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442. \u041F\u0435\u0440\u0435\u0437\u0430\u043F\u0438\u0441\u044C \u0442\u0440\u0435\u0431\u0443\u0435\u0442 --force.`;case s.WriteFailed:return`\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u0437\u0430\u043F\u0438\u0441\u0430\u0442\u044C \u0432 ${e.target}: ${e.reason}`;case s.NoFreePort:return`\u041D\u0435 \u043D\u0430\u0448\u043B\u043E\u0441\u044C \u0441\u0432\u043E\u0431\u043E\u0434\u043D\u043E\u0433\u043E \u043F\u043E\u0440\u0442\u0430: ${e.tried} \u043F\u043E\u0434\u0440\u044F\u0434 \u0437\u0430\u043D\u044F\u0442\u044B, \u043D\u0430\u0447\u0438\u043D\u0430\u044F \u0441 ${e.start}. \u041E\u0441\u0432\u043E\u0431\u043E\u0434\u0438 \u043F\u043E\u0440\u0442 \u0438\u043B\u0438 \u0437\u0430\u043A\u0440\u043E\u0439 \u043B\u0438\u0448\u043D\u0438\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u044B.`;case s.Cancelled:return"\u041E\u0442\u043C\u0435\u043D\u0435\u043D\u043E"}},tryHelp:e=>`\u041F\u043E\u0434\u0440\u043E\u0431\u043D\u0435\u0435: idem-ui ${e} --help`,variantQuestion:(e,r)=>`\u0412\u044B\u0431\u0435\u0440\u0438 \u0432\u0430\u0440\u0438\u0430\u043D\u0442 \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u0430 ${L(e,r)}`,componentDescription:e=>{let r=[`\u041A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442: ${e.name}`];return e.description&&r.push(`\u041E\u043F\u0438\u0441\u0430\u043D\u0438\u0435: ${e.description}`),e.tags&&r.push(`\u0422\u0435\u0433\u0438: ${e.tags.join(", ")}`),r.join(`
|
|
15
37
|
`)},overwriteQuestion:e=>`\u041F\u0430\u043F\u043A\u0430 ${e} \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442. \u041F\u0435\u0440\u0435\u0437\u0430\u043F\u0438\u0441\u0430\u0442\u044C?`,pathQuestion:()=>"\u0412 \u043A\u0430\u043A\u0443\u044E \u043F\u0430\u043F\u043A\u0443 \u043F\u043E\u043B\u043E\u0436\u0438\u0442\u044C? (Enter \u2014 \u0442\u0435\u043A\u0443\u0449\u0430\u044F)",chosenVariant:e=>`\u0412\u0430\u0440\u0438\u0430\u043D\u0442: ${e}`,downloading:(e,r)=>`\u0421\u043A\u0430\u0447\u0438\u0432\u0430\u044E ${e}/${r}\u2026`,copied:e=>`\u0421\u043A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u043D\u043E \u0432 ${e}`,note:e=>`
|
|
16
38
|
P.S.
|
|
17
39
|
${e}`,catalogHeader:()=>"\u041A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u044B:",catalogLine:(e,r)=>{let t=`- (${e}) ${r.name}`;return r.description&&(t+=` \u2014 ${r.description}`),r.tags?.length&&(t+=` [${r.tags.join(", ")}]`),t},componentQuestion:()=>"\u0412\u044B\u0431\u0435\u0440\u0438 \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442",catalogChoiceLabel:(e,r)=>`(${e}) ${r.name}`,catalogChoiceHint:e=>{let r=[];return e.description&&r.push(e.description),e.tags?.length&&r.push(`\u0422\u0435\u0433\u0438: ${e.tags.join(", ")}`),r.length>0?r.join(`
|
|
18
|
-
`):void 0},emptyCatalog:()=>"\u0412 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435 \u043D\u0435\u0442 \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u043E\u0432",skippedHeader:()=>"\u041F\u0440\u043E\u043F\u0443\u0449\u0435\u043D\u044B \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u044B:",skippedComponent:(e,r)=>{switch(r){case"missing":return`- ${e}: \u043D\u0435\u0442 meta.json.`;case"invalid":return`- ${e}: \u0431\u0438\u0442\u044B\u0439 meta.json.`;case"no-variants":return`- ${e}: \u043D\u0435\u0442 \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u043E\u0432.`}},cliError:(e,r)=>`error [${e}]: ${r}`,internalError:()=>"\u0412\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u044F\u044F \u043E\u0448\u0438\u0431\u043A\u0430:"};function ce(e){let{catalog:r,picker:t,projectFiles:o,confirmer:i}=e;return async n=>{if(v(n)){console.log(w.forCommand("get"));return}let a=ae(n),c=await r.loadComponent(a.slug);console.log(p.componentDescription(c.meta));let m=await A(c,a.variant,t);console.log(p.chosenVariant(m.label));let l=await O(a.slug,a.path,a.force,process.cwd(),o,i);console.log(p.downloading(a.slug,m.label));let R=await r.loadVariantFiles(a.slug,m.label);await o.writeFiles(l,R),console.log(p.copied(l));let b=c.meta.note?.trim();b&&console.log(p.note(b))}}import{parseArgs as Ze}from"util";function pe(e){try{Ze({args:e,options:{},allowPositionals:!1})}catch(r){let t=r instanceof Error?r.message:String(r);throw new d({code:s.UnknownOption,detail:t,command:"list"})}}import ze from"@inquirer/search";var F=e=>e instanceof Error&&e.name==="ExitPromptError";function Xe(e,r){let t=(r??"").trim().toLowerCase();return e.filter(({slug:o,meta:i})=>`${o} ${i.name}`.toLowerCase().includes(t))}async function me(e){try{return await ze({message:p.componentQuestion(),pageSize:10,source:r=>Xe(e,r).map(({slug:t,meta:o})=>({name:p.catalogChoiceLabel(t,o),value:t,description:p.catalogChoiceHint(o)}))})}catch(r){throw F(r)?new h:r}}import er from"@inquirer/input";async function le(e){try{return await er({message:p.pathQuestion(),default:e})}catch(r){throw F(r)?new h:r}}function de(e){let{catalog:r,picker:t,projectFiles:o,confirmer:i}=e;return async n=>{if(v(n)){console.log(w.forCommand("list"));return}pe(n);let{components:a,skipped:c}=await r.listComponents();if(c.length>0&&(console.error(p.skippedHeader()),c.forEach(({slug:N,reason:$})=>{console.error(p.skippedComponent(N,$))}),console.error("")),!process.stdout.isTTY){a.length>0&&(console.log(p.catalogHeader()),a.forEach(({slug:N,meta:$})=>{console.log(p.catalogLine(N,$))}));return}if(a.length===0){console.log(p.emptyCatalog());return}let m=await me(a),l=await r.loadComponent(m),R=await A(l,void 0,t);console.log(p.chosenVariant(R.label));let b=await le(process.cwd()),G=await O(m,b,!1,process.cwd(),o,i);console.log(p.downloading(m,R.label));let ke=await r.loadVariantFiles(m,R.label);await o.writeFiles(G,ke),console.log(p.copied(G));let q=l.meta.note?.trim();q&&console.log(p.note(q))}}function ge(){return e=>{let r=e[0];if(r!==void 0&&w.isCommand(r)){console.log(w.forCommand(r));return}console.log(w.general())}}import{createServer as sr}from"http";import{fileURLToPath as ar}from"url";import cr from"open";import{createServer as rr}from"net";var tr=e=>new Promise((r,t)=>{let o=rr();o.once("error",i=>{if(i.code==="EADDRINUSE"){r(!1);return}t(i)}),o.listen(e,"127.0.0.1",()=>{o.close(()=>r(!0))})});async function fe(e,r){for(let t=0;t<r;t++){let o=e+t;if(await tr(o))return o}throw new j({code:s.NoFreePort,start:e,tried:r})}var E={BadRequest:"ERR_BAD_REQUEST",NotFound:"ERR_NOT_FOUND",MethodNotAllowed:"ERR_METHOD_NOT_ALLOWED",Internal:"ERR_INTERNAL"},y=class extends Error{constructor(t,o){super(o);this.code=t;this.name="WebRequestError"}};function V(e){switch(e){case"ERR_STORAGE_UNREACHABLE":case"ERR_STORAGE_TIMEOUT":case"ERR_STORAGE_HTTP":case"ERR_STORAGE_EMPTY_ARCHIVE":return 502;case"ERR_COMPONENT_NOT_FOUND":return 404;case"ERR_BAD_REQUEST":return 400;case"ERR_WRITE_FAILED":return 500;default:return 500}}var f={listeningOn:e=>`\u0421\u0435\u0440\u0432\u0435\u0440 \u043D\u0430 ${e}`,error:e=>{switch(e.code){case"ERR_STORAGE_UNREACHABLE":return"\u0425\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u043E. \u041F\u0440\u043E\u0432\u0435\u0440\u044C\u0442\u0435 VPN.";case"ERR_STORAGE_TIMEOUT":return"\u0425\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435 \u043D\u0435 \u043E\u0442\u0432\u0435\u0442\u0438\u043B\u043E \u0432\u043E\u0432\u0440\u0435\u043C\u044F.";case"ERR_STORAGE_HTTP":return"\u0425\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435 \u043E\u0442\u0432\u0435\u0442\u0438\u043B\u043E \u043E\u0448\u0438\u0431\u043A\u043E\u0439.";case"ERR_STORAGE_EMPTY_ARCHIVE":return"\u0425\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435 \u043E\u0442\u0434\u0430\u043B\u043E \u043F\u0443\u0441\u0442\u043E\u0439 \u0430\u0440\u0445\u0438\u0432.";case"ERR_COMPONENT_NOT_FOUND":return"\u041D\u0435\u0442 \u0442\u0430\u043A\u043E\u0433\u043E \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u0430.";case"ERR_WRITE_FAILED":return"\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u0437\u0430\u043F\u0438\u0441\u0430\u0442\u044C \u0444\u0430\u0439\u043B\u044B \u043D\u0430 \u0434\u0438\u0441\u043A.";default:return"\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u0432\u044B\u043F\u043E\u043B\u043D\u0438\u0442\u044C \u0437\u0430\u043F\u0440\u043E\u0441."}},internalError:()=>"\u0412\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u044F\u044F \u043E\u0448\u0438\u0431\u043A\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.",badRequest:()=>"\u041D\u0435\u043A\u043E\u0440\u0440\u0435\u043A\u0442\u043D\u044B\u0439 \u0437\u0430\u043F\u0440\u043E\u0441.",notFound:()=>"\u041D\u0435\u0442 \u0442\u0430\u043A\u043E\u0433\u043E \u0440\u043E\u0443\u0442\u0430.",methodNotAllowed:()=>"\u041C\u0435\u0442\u043E\u0434 \u043D\u0435 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u044D\u0442\u0438\u043C \u0440\u043E\u0443\u0442\u043E\u043C."};async function ue(e){let r=[];for await(let o of e)r.push(o);let t=Buffer.concat(r).toString("utf8");try{return JSON.parse(t)}catch{throw new y(E.BadRequest,f.badRequest())}}function u(e,r,t){e.writeHead(r,{"Content-Type":"application/json; charset=utf-8"}),e.end(JSON.stringify(t))}function D(e){return typeof e=="string"&&e.length>0}function Ce(e){return async(r,t)=>{let o=await ue(r);if(o===null||typeof o!="object")throw new y(E.BadRequest,f.badRequest());let{slug:i,label:n,path:a}=o;if(!D(i)||!D(n)||!D(a))throw new y(E.BadRequest,f.badRequest());let c=L(process.cwd(),a,i),m=await e.catalog.loadVariantFiles(i,n);await e.projectFiles.writeFiles(c,m),u(t,200,{ok:!0,target:c})}}import H from"path";function he(e){return e==="node_modules"||e.startsWith(".")}function we(e){return async(r,t)=>{let o=process.cwd(),i=new URL(r.url??"/","http://localhost").searchParams.get("path")??"",n=H.resolve(o,i),c=(await e.projectFiles.readSubdirs(n,he)).map(m=>({name:m,path:H.relative(o,H.join(n,m))}));u(t,200,{dirs:c})}}var or=6e4;function Ee(e){let r;return async(t,o)=>{(r===void 0||Date.now()-r.at>=or||nr(t))&&(r={at:Date.now(),listing:e.catalog.listAll()});let i;try{i=await r.listing}catch(n){throw r=void 0,n}u(o,200,i)}}function nr(e){let r=e.headers["cache-control"];return typeof r=="string"&&r.includes("no-cache")}function ye(e,r){if(r instanceof C){u(e,V(r.code),{code:r.code,message:f.error(r.details)});return}if(r instanceof y){u(e,V(r.code),{code:r.code,message:r.message});return}console.error(r),u(e,500,{code:E.Internal,message:f.internalError()})}function Re(e){let r=Ee({catalog:e.catalog}),t=Ce({catalog:e.catalog,projectFiles:e.projectFiles}),o=we({projectFiles:e.projectFiles}),i={"/api/components":{GET:r},"/api/copy":{POST:t},"/api/dirs":{GET:o}};return async(n,a)=>{let c=new URL(n.url??"/","http://localhost").pathname;if(!c.startsWith("/api"))return!1;try{let m=i[c];if(m===void 0)return u(a,404,{code:E.NotFound,message:f.notFound()}),!0;let l=m[n.method??""];if(l===void 0)return u(a,405,{code:E.MethodNotAllowed,message:f.methodNotAllowed()}),!0;await l(n,a)}catch(m){ye(a,m)}return!0}}import ir from"sirv";var Se=e=>ir(e,{single:!0});var pr=4321,mr=3,Fe="127.0.0.1",lr=ar(new URL("./webapp",import.meta.url)),dr=e=>{cr(e).catch(()=>{})};async function be(e){let r=await fe(pr,mr),t=Re(e),o=Se(lr),i=sr((a,c)=>{(async()=>await t(a,c)||o(a,c))()});await new Promise(a=>{i.listen(r,Fe,()=>a())});let n=`http://${Fe}:${r}`;return console.log(f.listeningOn(n)),dr(n),{port:r}}import{parseArgs as gr}from"util";function ve(e){try{gr({args:e,options:{},allowPositionals:!1})}catch(r){let t=r instanceof Error?r.message:String(r);throw new d({code:s.UnknownOption,detail:t,command:"web"})}}function Pe(e){return async r=>{if(v(r)){console.log(w.forCommand("web"));return}ve(r),await be(e)}}import fr from"@inquirer/confirm";function je(e=process.stdin.isTTY===!0){return{confirm:async r=>{if(!e)throw new d({code:s.TargetExists,target:r});let t;try{t=await fr({message:p.overwriteQuestion(r),default:!1})}catch(o){throw F(o)?new h:o}if(!t)throw new h}}}import ur from"@inquirer/select";function Te(e=process.stdin.isTTY===!0){return{pick:async(r,t,o)=>{if(!e)throw new d({code:s.VariantRequired,slug:r,name:t,available:o.map(i=>i.label)});try{return await ur({message:p.variantQuestion(r,t),choices:o.map(i=>{let{label:n}=i;return{name:n,value:i}})})}catch(i){throw F(i)?new h:i}}}}try{let e=Y(ne(ee())),r=Te(),t=W(),o=je(),i=ce({catalog:e,picker:r,projectFiles:t,confirmer:o}),n=de({catalog:e,picker:r,projectFiles:t,confirmer:o}),a=ge(),c=Pe({catalog:e,projectFiles:t}),{command:m,rest:l}=ie(process.argv.slice(2));switch(m){case void 0:case"help":case"--help":case"-h":a(l);break;case"get":await i(l);break;case"list":await n(l);break;case"web":await c(l);break;default:throw new d({code:s.UnknownCommand,got:m})}}catch(e){e instanceof C&&(console.error(p.cliError(e.code,p.error(e.details))),"command"in e.details&&console.error(p.tryHelp(e.details.command)),process.exit(e.exitCode)),console.error(p.internalError()),console.error(e),process.exit(1)}
|
|
40
|
+
`):void 0},emptyCatalog:()=>"\u0412 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435 \u043D\u0435\u0442 \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u043E\u0432",skippedHeader:()=>"\u041F\u0440\u043E\u043F\u0443\u0449\u0435\u043D\u044B \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u044B:",skippedComponent:(e,r)=>{switch(r){case"missing":return`- ${e}: \u043D\u0435\u0442 meta.json.`;case"invalid":return`- ${e}: \u0431\u0438\u0442\u044B\u0439 meta.json.`;case"no-variants":return`- ${e}: \u043D\u0435\u0442 \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u043E\u0432.`}},cliError:(e,r)=>`error [${e}]: ${r}`,internalError:()=>"\u0412\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u044F\u044F \u043E\u0448\u0438\u0431\u043A\u0430:"};function me(e){let{catalog:r,picker:t,projectFiles:o,confirmer:n}=e;return async c=>{if(v(c)){console.log(R.forCommand("get"));return}let i=pe(c),a=await r.loadComponent(i.slug);console.log(l.componentDescription(a.meta));let m=await I(a,i.variant,t);console.log(l.chosenVariant(m.label));let p=await U(i.slug,i.path,i.force,process.cwd(),o,n);console.log(l.downloading(i.slug,m.label));let g=await r.loadVariantFiles(i.slug,m.label);await o.writeFiles(p,g),console.log(l.copied(p));let d=a.meta.note?.trim();d&&console.log(l.note(d))}}import{parseArgs as nr}from"util";function le(e){try{nr({args:e,options:{},allowPositionals:!1})}catch(r){let t=r instanceof Error?r.message:String(r);throw new f({code:s.UnknownOption,detail:t,command:"list"})}}import sr from"@inquirer/search";var T=e=>e instanceof Error&&e.name==="ExitPromptError";function ir(e,r){let t=(r??"").trim().toLowerCase();return e.filter(({slug:o,meta:n})=>`${o} ${n.name}`.toLowerCase().includes(t))}async function ge(e){try{return await sr({message:l.componentQuestion(),pageSize:10,source:r=>ir(e,r).map(({slug:t,meta:o})=>({name:l.catalogChoiceLabel(t,o),value:t,description:l.catalogChoiceHint(o)}))})}catch(r){throw T(r)?new y:r}}import ar from"@inquirer/input";async function de(e){try{return await ar({message:l.pathQuestion(),default:e})}catch(r){throw T(r)?new y:r}}function fe(e){let{catalog:r,picker:t,projectFiles:o,confirmer:n}=e;return async c=>{if(v(c)){console.log(R.forCommand("list"));return}le(c);let{components:i,skipped:a}=await r.listComponents();if(a.length>0&&(console.error(l.skippedHeader()),a.forEach(({slug:_,reason:k})=>{console.error(l.skippedComponent(_,k))}),console.error("")),!process.stdout.isTTY){i.length>0&&(console.log(l.catalogHeader()),i.forEach(({slug:_,meta:k})=>{console.log(l.catalogLine(_,k))}));return}if(i.length===0){console.log(l.emptyCatalog());return}let m=await ge(i),p=await r.loadComponent(m),g=await I(p,void 0,t);console.log(l.chosenVariant(g.label));let d=await de(process.cwd()),b=await U(m,d,!1,process.cwd(),o,n);console.log(l.downloading(m,g.label));let w=await r.loadVariantFiles(m,g.label);await o.writeFiles(b,w),console.log(l.copied(b));let $=p.meta.note?.trim();$&&console.log(l.note($))}}function ue(){return e=>{let r=e[0];if(r!==void 0&&R.isCommand(r)){console.log(R.forCommand(r));return}console.log(R.general())}}import{createServer as dr}from"http";import{fileURLToPath as fr}from"url";import ur from"open";import{createServer as cr}from"net";var pr=e=>new Promise((r,t)=>{let o=cr();o.once("error",n=>{if(n.code==="EADDRINUSE"){r(!1);return}t(n)}),o.listen(e,"127.0.0.1",()=>{o.close(()=>r(!0))})});async function he(e,r){for(let t=0;t<r;t++){let o=e+t;if(await pr(o))return o}throw new A({code:s.NoFreePort,start:e,tried:r})}var S={BadRequest:"ERR_BAD_REQUEST",NotFound:"ERR_NOT_FOUND",MethodNotAllowed:"ERR_METHOD_NOT_ALLOWED",Internal:"ERR_INTERNAL"},P=class extends Error{constructor(t,o){super(o);this.code=t;this.name="WebRequestError"}};function G(e){switch(e){case"ERR_STORAGE_UNREACHABLE":case"ERR_STORAGE_TIMEOUT":case"ERR_STORAGE_HTTP":case"ERR_STORAGE_EMPTY_ARCHIVE":return 502;case"ERR_COMPONENT_NOT_FOUND":return 404;case"ERR_BAD_REQUEST":return 400;case"ERR_WRITE_FAILED":return 500;default:return 500}}var h={listeningOn:e=>`\u0421\u0435\u0440\u0432\u0435\u0440 \u043D\u0430 ${e}`,error:e=>{switch(e.code){case"ERR_STORAGE_UNREACHABLE":return"\u0425\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u043E. \u041F\u0440\u043E\u0432\u0435\u0440\u044C\u0442\u0435 VPN.";case"ERR_STORAGE_TIMEOUT":return"\u0425\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435 \u043D\u0435 \u043E\u0442\u0432\u0435\u0442\u0438\u043B\u043E \u0432\u043E\u0432\u0440\u0435\u043C\u044F.";case"ERR_STORAGE_HTTP":return"\u0425\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435 \u043E\u0442\u0432\u0435\u0442\u0438\u043B\u043E \u043E\u0448\u0438\u0431\u043A\u043E\u0439.";case"ERR_STORAGE_EMPTY_ARCHIVE":return"\u0425\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435 \u043E\u0442\u0434\u0430\u043B\u043E \u043F\u0443\u0441\u0442\u043E\u0439 \u0430\u0440\u0445\u0438\u0432.";case"ERR_COMPONENT_NOT_FOUND":return"\u041D\u0435\u0442 \u0442\u0430\u043A\u043E\u0433\u043E \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u0430.";case"ERR_WRITE_FAILED":return"\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u0437\u0430\u043F\u0438\u0441\u0430\u0442\u044C \u0444\u0430\u0439\u043B\u044B \u043D\u0430 \u0434\u0438\u0441\u043A.";default:return"\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u0432\u044B\u043F\u043E\u043B\u043D\u0438\u0442\u044C \u0437\u0430\u043F\u0440\u043E\u0441."}},internalError:()=>"\u0412\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u044F\u044F \u043E\u0448\u0438\u0431\u043A\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.",badRequest:()=>"\u041D\u0435\u043A\u043E\u0440\u0440\u0435\u043A\u0442\u043D\u044B\u0439 \u0437\u0430\u043F\u0440\u043E\u0441.",notFound:()=>"\u041D\u0435\u0442 \u0442\u0430\u043A\u043E\u0433\u043E \u0440\u043E\u0443\u0442\u0430.",methodNotAllowed:()=>"\u041C\u0435\u0442\u043E\u0434 \u043D\u0435 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u044D\u0442\u0438\u043C \u0440\u043E\u0443\u0442\u043E\u043C."};async function Ce(e){let r=[];for await(let o of e)r.push(o);let t=Buffer.concat(r).toString("utf8");try{return JSON.parse(t)}catch{throw new P(S.BadRequest,h.badRequest())}}function C(e,r,t){e.writeHead(r,{"Content-Type":"application/json; charset=utf-8"}),e.end(JSON.stringify(t))}function q(e){return typeof e=="string"&&e.length>0}function Ee(e){return async(r,t)=>{let o=await Ce(r);if(o===null||typeof o!="object")throw new P(S.BadRequest,h.badRequest());let{slug:n,label:c,path:i}=o;if(!q(n)||!q(c)||!q(i))throw new P(S.BadRequest,h.badRequest());let a=H(process.cwd(),i,n),m=await e.catalog.loadVariantFiles(n,c);await e.projectFiles.writeFiles(a,m),C(t,200,{ok:!0,target:a})}}import Q from"path";function ye(e){return e==="node_modules"||e.startsWith(".")}function we(e){return async(r,t)=>{let o=process.cwd(),n=new URL(r.url??"/","http://localhost").searchParams.get("path")??"",c=Q.resolve(o,n),a=(await e.projectFiles.readSubdirs(c,ye)).map(m=>({name:m,path:Q.relative(o,Q.join(c,m))}));C(t,200,{dirs:a})}}var mr=6e4;function Re(e){let r;return async(t,o)=>{(r===void 0||Date.now()-r.at>=mr||lr(t))&&(r={at:Date.now(),listing:e.catalog.listAll()});let n;try{n=await r.listing}catch(c){throw r=void 0,c}C(o,200,n)}}function lr(e){let r=e.headers["cache-control"];return typeof r=="string"&&r.includes("no-cache")}function Se(e,r){if(r instanceof E){C(e,G(r.code),{code:r.code,message:h.error(r.details)});return}if(r instanceof P){C(e,G(r.code),{code:r.code,message:r.message});return}console.error(r),C(e,500,{code:S.Internal,message:h.internalError()})}function be(e){let r=Re({catalog:e.catalog}),t=Ee({catalog:e.catalog,projectFiles:e.projectFiles}),o=we({projectFiles:e.projectFiles}),n={"/api/components":{GET:r},"/api/copy":{POST:t},"/api/dirs":{GET:o}};return async(c,i)=>{let a=new URL(c.url??"/","http://localhost").pathname;if(!a.startsWith("/api"))return!1;try{let m=n[a];if(m===void 0)return C(i,404,{code:S.NotFound,message:h.notFound()}),!0;let p=m[c.method??""];if(p===void 0)return C(i,405,{code:S.MethodNotAllowed,message:h.methodNotAllowed()}),!0;await p(c,i)}catch(m){Se(i,m)}return!0}}import gr from"sirv";var Pe=e=>gr(e,{single:!0});var hr=4321,Cr=3,je="127.0.0.1",Er=fr(new URL("./webapp",import.meta.url)),yr=e=>{ur(e).catch(()=>{})};async function Te(e){let r=await he(hr,Cr),t=be(e),o=Pe(Er),n=dr((i,a)=>{(async()=>await t(i,a)||o(i,a))()});await new Promise(i=>{n.listen(r,je,()=>i())});let c=`http://${je}:${r}`;return console.log(h.listeningOn(c)),yr(c),{port:r}}import{parseArgs as wr}from"util";function Fe(e){try{wr({args:e,options:{},allowPositionals:!1})}catch(r){let t=r instanceof Error?r.message:String(r);throw new f({code:s.UnknownOption,detail:t,command:"web"})}}function ve(e){return async r=>{if(v(r)){console.log(R.forCommand("web"));return}Fe(r),await Te(e)}}import Rr from"@inquirer/confirm";function _e(e=process.stdin.isTTY===!0){return{confirm:async r=>{if(!e)throw new f({code:s.TargetExists,target:r});let t;try{t=await Rr({message:l.overwriteQuestion(r),default:!1})}catch(o){throw T(o)?new y:o}if(!t)throw new y}}}import Sr from"@inquirer/select";function ke(e=process.stdin.isTTY===!0){return{pick:async(r,t,o)=>{if(!e)throw new f({code:s.VariantRequired,slug:r,name:t,available:o.map(n=>n.label)});try{return await Sr({message:l.variantQuestion(r,t),choices:o.map(n=>{let{label:c}=n;return{name:c,value:n}})})}catch(n){throw T(n)?new y:n}}}}try{let e=z(ie(re())),r=ke(),t=J(),o=_e(),n=me({catalog:e,picker:r,projectFiles:t,confirmer:o}),c=fe({catalog:e,picker:r,projectFiles:t,confirmer:o}),i=ue(),a=ve({catalog:e,projectFiles:t}),{command:m,rest:p}=ae(process.argv.slice(2));switch(m){case void 0:case"help":case"--help":case"-h":i(p);break;case"get":await n(p);break;case"list":await c(p);break;case"web":await a(p);break;default:throw new f({code:s.UnknownCommand,got:m})}}catch(e){e instanceof E&&(console.error(l.cliError(e.code,l.error(e.details))),"command"in e.details&&console.error(l.tryHelp(e.details.command)),process.exit(e.exitCode)),console.error(l.internalError()),console.error(e),process.exit(1)}
|