@structyl/cli 1.0.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/LICENSE +21 -0
- package/README.md +103 -0
- package/dist/index.js +304 -0
- package/dist/index.js.map +1 -0
- package/package.json +49 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 your-lib contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# @structyl/cli
|
|
2
|
+
|
|
3
|
+
> Scaffold structyl projects and copy styled components straight into your codebase.
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+

|
|
7
|
+
|
|
8
|
+
A shadcn-style command-line tool for [structyl](https://github.com/imirfanul/structyl). Instead of installing a monolithic component package, you copy the source of the components you want directly into your project, where you fully own and can customize them. The CLI handles project setup, lists what's available, and resolves the registry and npm dependencies each component needs.
|
|
9
|
+
|
|
10
|
+
## Installation
|
|
11
|
+
|
|
12
|
+
You typically run the CLI on demand with your package runner, so a global install is optional.
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
# pnpm
|
|
16
|
+
pnpm dlx @structyl/cli init
|
|
17
|
+
|
|
18
|
+
# npm
|
|
19
|
+
npx @structyl/cli init
|
|
20
|
+
|
|
21
|
+
# yarn
|
|
22
|
+
yarn dlx @structyl/cli init
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
To add it as a project dev dependency:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
# pnpm
|
|
29
|
+
pnpm add -D @structyl/cli
|
|
30
|
+
|
|
31
|
+
# npm
|
|
32
|
+
npm install -D @structyl/cli
|
|
33
|
+
|
|
34
|
+
# yarn
|
|
35
|
+
yarn add -D @structyl/cli
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Once installed, the `structyl` binary is available.
|
|
39
|
+
|
|
40
|
+
## Usage
|
|
41
|
+
|
|
42
|
+
Initialize structyl in your project. This prompts for a base theme and a components directory, then writes a `structyl.config.json`:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
npx structyl init
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
List every component available in the registry:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
npx structyl list
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Add one or more components. Dependencies are resolved automatically — for example, adding `date-picker` also pulls in `calendar` and `button`:
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
npx structyl add button
|
|
58
|
+
npx structyl add date-picker dialog toast
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Each component's styled source is written into the directory configured in `structyl.config.json`. When a component requires external npm packages (such as the DataTable's TanStack dependencies), the CLI prints the exact install command to run afterward.
|
|
62
|
+
|
|
63
|
+
### Options for `add`
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
# Run against a different working directory
|
|
67
|
+
npx structyl add button --cwd ./apps/web
|
|
68
|
+
|
|
69
|
+
# Point at a local @structyl/styled/src checkout for inlining
|
|
70
|
+
npx structyl add button --source ../structyl/packages/styled/src
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Features
|
|
74
|
+
|
|
75
|
+
- **Project initialization** — interactive `init` command that scaffolds `structyl.config.json` with your chosen theme and components directory.
|
|
76
|
+
- **Component registry** — `list` surfaces the full catalog of available structyl components.
|
|
77
|
+
- **Copy-into-project workflow** — `add` inlines styled component source into your codebase so you own and can edit it, no runtime package lock-in.
|
|
78
|
+
- **Automatic dependency resolution** — transitively resolves registry dependencies between components (e.g. `date-time-picker` → `calendar`, `button`, `time-picker`).
|
|
79
|
+
- **npm dependency hints** — reports any external packages (like `@tanstack/react-table`) a component needs, with a ready-to-run install command.
|
|
80
|
+
- **Configurable target** — `--cwd` and `--source` flags adapt the command to monorepos and local development.
|
|
81
|
+
|
|
82
|
+
## Commands
|
|
83
|
+
|
|
84
|
+
| Command | Description |
|
|
85
|
+
| --- | --- |
|
|
86
|
+
| `structyl init` | Initialize structyl in your project and write `structyl.config.json`. |
|
|
87
|
+
| `structyl list` | List all components available in the registry. |
|
|
88
|
+
| `structyl add <components...>` | Add one or more components, resolving their dependencies. |
|
|
89
|
+
|
|
90
|
+
### `add` flags
|
|
91
|
+
|
|
92
|
+
| Flag | Description | Default |
|
|
93
|
+
| --- | --- | --- |
|
|
94
|
+
| `--cwd <path>` | Working directory for the command. | `process.cwd()` |
|
|
95
|
+
| `--source <path>` | Path to `@structyl/styled/src` to inline component source from. | `node_modules/@structyl/styled/src` |
|
|
96
|
+
|
|
97
|
+
## Part of structyl
|
|
98
|
+
|
|
99
|
+
This package is part of [structyl](https://github.com/imirfanul/structyl) — see the full documentation at [structyl.dev](https://structyl.dev).
|
|
100
|
+
|
|
101
|
+
## License
|
|
102
|
+
|
|
103
|
+
MIT
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/index.ts
|
|
4
|
+
import { Command } from "commander";
|
|
5
|
+
import kleur from "kleur";
|
|
6
|
+
import prompts from "prompts";
|
|
7
|
+
import ora from "ora";
|
|
8
|
+
import * as fs from "fs/promises";
|
|
9
|
+
import * as path from "path";
|
|
10
|
+
|
|
11
|
+
// src/registry.ts
|
|
12
|
+
var PRIMITIVES = ["@structyl/primitives", "@structyl/core", "@structyl/hooks", "@structyl/utils", "@structyl/icons"];
|
|
13
|
+
var STRUCTYL_REGISTRY = {
|
|
14
|
+
dependencies: PRIMITIVES,
|
|
15
|
+
sourcePath: "structyl/index.tsx",
|
|
16
|
+
registryDependencies: ["button", "combobox"]
|
|
17
|
+
};
|
|
18
|
+
var REGISTRY = {
|
|
19
|
+
// Atoms
|
|
20
|
+
button: { name: "button", dependencies: PRIMITIVES, sourcePath: "button/index.tsx" },
|
|
21
|
+
badge: { name: "badge", dependencies: PRIMITIVES, sourcePath: "badge/index.tsx" },
|
|
22
|
+
card: { name: "card", dependencies: PRIMITIVES, sourcePath: "card/index.tsx" },
|
|
23
|
+
skeleton: { name: "skeleton", dependencies: PRIMITIVES, sourcePath: "skeleton/index.tsx" },
|
|
24
|
+
spinner: { name: "spinner", dependencies: PRIMITIVES, sourcePath: "spinner/index.tsx" },
|
|
25
|
+
alert: { name: "alert", dependencies: PRIMITIVES, sourcePath: "alert/index.tsx" },
|
|
26
|
+
"aspect-ratio": { name: "aspect-ratio", dependencies: PRIMITIVES, sourcePath: "aspect-ratio/index.tsx" },
|
|
27
|
+
avatar: { name: "avatar", dependencies: PRIMITIVES, sourcePath: "avatar/index.tsx" },
|
|
28
|
+
progress: { name: "progress", dependencies: PRIMITIVES, sourcePath: "progress/index.tsx" },
|
|
29
|
+
separator: { name: "separator", dependencies: PRIMITIVES, sourcePath: "separator/index.tsx" },
|
|
30
|
+
label: { name: "label", dependencies: PRIMITIVES, sourcePath: "label/index.tsx" },
|
|
31
|
+
switch: { name: "switch", dependencies: PRIMITIVES, sourcePath: "switch/index.tsx" },
|
|
32
|
+
toggle: { name: "toggle", dependencies: PRIMITIVES, sourcePath: "toggle/index.tsx" },
|
|
33
|
+
checkbox: { name: "checkbox", dependencies: PRIMITIVES, sourcePath: "checkbox/index.tsx" },
|
|
34
|
+
dialog: { name: "dialog", dependencies: PRIMITIVES, sourcePath: "dialog/index.tsx" },
|
|
35
|
+
// Form basics
|
|
36
|
+
input: { name: "input", dependencies: PRIMITIVES, sourcePath: "input/index.tsx" },
|
|
37
|
+
textarea: { name: "textarea", dependencies: PRIMITIVES, sourcePath: "textarea/index.tsx" },
|
|
38
|
+
"radio-group": { name: "radio-group", dependencies: PRIMITIVES, sourcePath: "radio-group/index.tsx" },
|
|
39
|
+
"toggle-group": {
|
|
40
|
+
name: "toggle-group",
|
|
41
|
+
dependencies: PRIMITIVES,
|
|
42
|
+
sourcePath: "toggle-group/index.tsx",
|
|
43
|
+
registryDependencies: ["toggle"]
|
|
44
|
+
},
|
|
45
|
+
slider: { name: "slider", dependencies: PRIMITIVES, sourcePath: "slider/index.tsx" },
|
|
46
|
+
form: { name: "form", dependencies: PRIMITIVES, sourcePath: "form/index.tsx" },
|
|
47
|
+
// Disclosure & nav
|
|
48
|
+
collapsible: { name: "collapsible", dependencies: PRIMITIVES, sourcePath: "collapsible/index.tsx" },
|
|
49
|
+
accordion: { name: "accordion", dependencies: PRIMITIVES, sourcePath: "accordion/index.tsx" },
|
|
50
|
+
tabs: { name: "tabs", dependencies: PRIMITIVES, sourcePath: "tabs/index.tsx" },
|
|
51
|
+
breadcrumb: { name: "breadcrumb", dependencies: PRIMITIVES, sourcePath: "breadcrumb/index.tsx" },
|
|
52
|
+
pagination: {
|
|
53
|
+
name: "pagination",
|
|
54
|
+
dependencies: PRIMITIVES,
|
|
55
|
+
sourcePath: "pagination/index.tsx",
|
|
56
|
+
registryDependencies: ["button"]
|
|
57
|
+
},
|
|
58
|
+
stepper: { name: "stepper", dependencies: PRIMITIVES, sourcePath: "stepper/index.tsx" },
|
|
59
|
+
// Overlays
|
|
60
|
+
"alert-dialog": {
|
|
61
|
+
name: "alert-dialog",
|
|
62
|
+
dependencies: PRIMITIVES,
|
|
63
|
+
sourcePath: "alert-dialog/index.tsx",
|
|
64
|
+
registryDependencies: ["button"]
|
|
65
|
+
},
|
|
66
|
+
sheet: { name: "sheet", dependencies: PRIMITIVES, sourcePath: "sheet/index.tsx" },
|
|
67
|
+
drawer: { name: "drawer", dependencies: PRIMITIVES, sourcePath: "drawer/index.tsx" },
|
|
68
|
+
popover: { name: "popover", dependencies: PRIMITIVES, sourcePath: "popover/index.tsx" },
|
|
69
|
+
tooltip: { name: "tooltip", dependencies: PRIMITIVES, sourcePath: "tooltip/index.tsx" },
|
|
70
|
+
"hover-card": { name: "hover-card", dependencies: PRIMITIVES, sourcePath: "hover-card/index.tsx" },
|
|
71
|
+
toast: { name: "toast", dependencies: PRIMITIVES, sourcePath: "toast/index.tsx" },
|
|
72
|
+
// Complex compound
|
|
73
|
+
"dropdown-menu": { name: "dropdown-menu", dependencies: PRIMITIVES, sourcePath: "dropdown-menu/index.tsx" },
|
|
74
|
+
"context-menu": { name: "context-menu", dependencies: PRIMITIVES, sourcePath: "context-menu/index.tsx" },
|
|
75
|
+
menubar: { name: "menubar", dependencies: PRIMITIVES, sourcePath: "menubar/index.tsx" },
|
|
76
|
+
"navigation-menu": { name: "navigation-menu", dependencies: PRIMITIVES, sourcePath: "navigation-menu/index.tsx" },
|
|
77
|
+
select: { name: "select", dependencies: PRIMITIVES, sourcePath: "select/index.tsx" },
|
|
78
|
+
"multi-select": { name: "multi-select", dependencies: PRIMITIVES, sourcePath: "multi-select/index.tsx" },
|
|
79
|
+
combobox: { name: "combobox", dependencies: PRIMITIVES, sourcePath: "combobox/index.tsx" },
|
|
80
|
+
command: { name: "command", dependencies: PRIMITIVES, sourcePath: "command/index.tsx" },
|
|
81
|
+
autocomplete: { name: "autocomplete", ...STRUCTYL_REGISTRY },
|
|
82
|
+
// Specialty form
|
|
83
|
+
"one-time-password-field": {
|
|
84
|
+
name: "one-time-password-field",
|
|
85
|
+
dependencies: PRIMITIVES,
|
|
86
|
+
sourcePath: "one-time-password-field/index.tsx"
|
|
87
|
+
},
|
|
88
|
+
"password-toggle-field": {
|
|
89
|
+
name: "password-toggle-field",
|
|
90
|
+
dependencies: PRIMITIVES,
|
|
91
|
+
sourcePath: "password-toggle-field/index.tsx"
|
|
92
|
+
},
|
|
93
|
+
"number-field": { name: "number-field", dependencies: PRIMITIVES, sourcePath: "number-field/index.tsx" },
|
|
94
|
+
calendar: { name: "calendar", dependencies: PRIMITIVES, sourcePath: "calendar/index.tsx" },
|
|
95
|
+
"date-picker": {
|
|
96
|
+
name: "date-picker",
|
|
97
|
+
dependencies: PRIMITIVES,
|
|
98
|
+
sourcePath: "date-picker/index.tsx",
|
|
99
|
+
registryDependencies: ["calendar", "button"]
|
|
100
|
+
},
|
|
101
|
+
"time-picker": { name: "time-picker", dependencies: PRIMITIVES, sourcePath: "time-picker/index.tsx" },
|
|
102
|
+
"date-time-picker": {
|
|
103
|
+
name: "date-time-picker",
|
|
104
|
+
dependencies: PRIMITIVES,
|
|
105
|
+
sourcePath: "date-time-picker/index.tsx",
|
|
106
|
+
registryDependencies: ["calendar", "button", "time-picker"]
|
|
107
|
+
},
|
|
108
|
+
"date-range-picker": {
|
|
109
|
+
name: "date-range-picker",
|
|
110
|
+
dependencies: PRIMITIVES,
|
|
111
|
+
sourcePath: "date-range-picker/index.tsx",
|
|
112
|
+
registryDependencies: ["calendar", "button"]
|
|
113
|
+
},
|
|
114
|
+
"color-picker": { name: "color-picker", dependencies: PRIMITIVES, sourcePath: "color-picker/index.tsx" },
|
|
115
|
+
"file-upload": { name: "file-upload", dependencies: PRIMITIVES, sourcePath: "file-upload/index.tsx" },
|
|
116
|
+
// Feedback & misc
|
|
117
|
+
"circular-progress": {
|
|
118
|
+
name: "circular-progress",
|
|
119
|
+
dependencies: ["@structyl/utils"],
|
|
120
|
+
sourcePath: "circular-progress/index.tsx"
|
|
121
|
+
},
|
|
122
|
+
meter: { name: "meter", dependencies: ["@structyl/utils"], sourcePath: "meter/index.tsx" },
|
|
123
|
+
"scroll-area": { name: "scroll-area", dependencies: PRIMITIVES, sourcePath: "scroll-area/index.tsx" },
|
|
124
|
+
toolbar: { name: "toolbar", dependencies: PRIMITIVES, sourcePath: "toolbar/index.tsx" },
|
|
125
|
+
resizable: { name: "resizable", dependencies: PRIMITIVES, sourcePath: "resizable/index.tsx" },
|
|
126
|
+
carousel: { name: "carousel", dependencies: PRIMITIVES, sourcePath: "carousel/index.tsx" },
|
|
127
|
+
tree: { name: "tree", dependencies: PRIMITIVES, sourcePath: "tree/index.tsx" },
|
|
128
|
+
editable: { name: "editable", dependencies: PRIMITIVES, sourcePath: "editable/index.tsx" },
|
|
129
|
+
"tags-input": { name: "tags-input", dependencies: PRIMITIVES, sourcePath: "tags-input/index.tsx" },
|
|
130
|
+
mentions: { name: "mentions", dependencies: PRIMITIVES, sourcePath: "mentions/index.tsx" },
|
|
131
|
+
"copy-button": {
|
|
132
|
+
name: "copy-button",
|
|
133
|
+
dependencies: ["@structyl/utils", "@structyl/icons"],
|
|
134
|
+
sourcePath: "copy-button/index.tsx",
|
|
135
|
+
registryDependencies: ["button"]
|
|
136
|
+
},
|
|
137
|
+
box: { name: "box", ...STRUCTYL_REGISTRY },
|
|
138
|
+
container: { name: "container", ...STRUCTYL_REGISTRY },
|
|
139
|
+
stack: { name: "stack", ...STRUCTYL_REGISTRY },
|
|
140
|
+
grid: { name: "grid", ...STRUCTYL_REGISTRY },
|
|
141
|
+
paper: { name: "paper", ...STRUCTYL_REGISTRY },
|
|
142
|
+
typography: { name: "typography", ...STRUCTYL_REGISTRY },
|
|
143
|
+
link: { name: "link", ...STRUCTYL_REGISTRY },
|
|
144
|
+
"svg-icon": { name: "svg-icon", ...STRUCTYL_REGISTRY },
|
|
145
|
+
chart: { name: "chart", ...STRUCTYL_REGISTRY },
|
|
146
|
+
chip: { name: "chip", ...STRUCTYL_REGISTRY },
|
|
147
|
+
"button-group": { name: "button-group", ...STRUCTYL_REGISTRY },
|
|
148
|
+
"floating-action-button": { name: "floating-action-button", ...STRUCTYL_REGISTRY },
|
|
149
|
+
rating: { name: "rating", ...STRUCTYL_REGISTRY },
|
|
150
|
+
"transfer-list": { name: "transfer-list", ...STRUCTYL_REGISTRY },
|
|
151
|
+
list: { name: "list", ...STRUCTYL_REGISTRY },
|
|
152
|
+
"image-list": { name: "image-list", ...STRUCTYL_REGISTRY },
|
|
153
|
+
table: { name: "table", ...STRUCTYL_REGISTRY },
|
|
154
|
+
backdrop: { name: "backdrop", ...STRUCTYL_REGISTRY },
|
|
155
|
+
snackbar: { name: "snackbar", ...STRUCTYL_REGISTRY },
|
|
156
|
+
modal: { name: "modal", ...STRUCTYL_REGISTRY },
|
|
157
|
+
"app-bar": { name: "app-bar", ...STRUCTYL_REGISTRY },
|
|
158
|
+
"bottom-navigation": { name: "bottom-navigation", ...STRUCTYL_REGISTRY },
|
|
159
|
+
"speed-dial": { name: "speed-dial", ...STRUCTYL_REGISTRY },
|
|
160
|
+
masonry: { name: "masonry", ...STRUCTYL_REGISTRY },
|
|
161
|
+
timeline: { name: "timeline", ...STRUCTYL_REGISTRY },
|
|
162
|
+
"click-away-listener": { name: "click-away-listener", ...STRUCTYL_REGISTRY },
|
|
163
|
+
"no-ssr": { name: "no-ssr", ...STRUCTYL_REGISTRY },
|
|
164
|
+
portal: { name: "portal", ...STRUCTYL_REGISTRY },
|
|
165
|
+
popper: { name: "popper", ...STRUCTYL_REGISTRY },
|
|
166
|
+
"textarea-autosize": { name: "textarea-autosize", ...STRUCTYL_REGISTRY },
|
|
167
|
+
transition: { name: "transition", ...STRUCTYL_REGISTRY },
|
|
168
|
+
"css-baseline": { name: "css-baseline", ...STRUCTYL_REGISTRY },
|
|
169
|
+
"init-color-scheme-script": { name: "init-color-scheme-script", ...STRUCTYL_REGISTRY },
|
|
170
|
+
// Data
|
|
171
|
+
"data-table": {
|
|
172
|
+
name: "data-table",
|
|
173
|
+
dependencies: ["@structyl/utils", "@structyl/icons", "@tanstack/react-table", "@tanstack/react-virtual"],
|
|
174
|
+
npmDependencies: ["@tanstack/react-table", "@tanstack/react-virtual"],
|
|
175
|
+
sourcePath: ""
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
function resolveDependencies(name, visited = /* @__PURE__ */ new Set()) {
|
|
179
|
+
if (visited.has(name)) return [];
|
|
180
|
+
visited.add(name);
|
|
181
|
+
const entry = REGISTRY[name];
|
|
182
|
+
if (!entry) return [];
|
|
183
|
+
const deps = [name];
|
|
184
|
+
for (const dep of entry.registryDependencies ?? []) {
|
|
185
|
+
deps.push(...resolveDependencies(dep, visited));
|
|
186
|
+
}
|
|
187
|
+
return deps;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// src/index.ts
|
|
191
|
+
var program = new Command();
|
|
192
|
+
program.name("structyl").description("CLI for adding @structyl components to your project").version("0.0.1");
|
|
193
|
+
program.command("init").description("Initialize structyl in your project").action(async () => {
|
|
194
|
+
console.log(kleur.bold().cyan("\n structyl \xB7 init\n"));
|
|
195
|
+
const answers = await prompts([
|
|
196
|
+
{
|
|
197
|
+
type: "select",
|
|
198
|
+
name: "theme",
|
|
199
|
+
message: "Pick a base theme",
|
|
200
|
+
choices: [
|
|
201
|
+
{ title: "slate", value: "slate" },
|
|
202
|
+
{ title: "zinc", value: "zinc" },
|
|
203
|
+
{ title: "rose", value: "rose" }
|
|
204
|
+
],
|
|
205
|
+
initial: 0
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
type: "text",
|
|
209
|
+
name: "dir",
|
|
210
|
+
message: "Components directory",
|
|
211
|
+
initial: "src/components/ui"
|
|
212
|
+
}
|
|
213
|
+
]);
|
|
214
|
+
const spinner = ora("Setting up structyl").start();
|
|
215
|
+
try {
|
|
216
|
+
await fs.mkdir(answers.dir, { recursive: true });
|
|
217
|
+
await fs.writeFile(
|
|
218
|
+
"structyl.config.json",
|
|
219
|
+
JSON.stringify(
|
|
220
|
+
{ theme: answers.theme, componentsDir: answers.dir, version: "0.0.1" },
|
|
221
|
+
null,
|
|
222
|
+
2
|
|
223
|
+
)
|
|
224
|
+
);
|
|
225
|
+
spinner.succeed("Done!");
|
|
226
|
+
console.log(kleur.dim(`
|
|
227
|
+
Config written to ${kleur.cyan("structyl.config.json")}`));
|
|
228
|
+
console.log(kleur.dim(` Add components with ${kleur.cyan("npx structyl add <name>")}`));
|
|
229
|
+
console.log(kleur.dim(` List components with ${kleur.cyan("npx structyl list")}
|
|
230
|
+
`));
|
|
231
|
+
} catch (err) {
|
|
232
|
+
spinner.fail("Failed");
|
|
233
|
+
console.error(err);
|
|
234
|
+
process.exit(1);
|
|
235
|
+
}
|
|
236
|
+
});
|
|
237
|
+
program.command("list").description("List components available in the registry").action(() => {
|
|
238
|
+
console.log(kleur.bold().cyan("\n Available components:\n"));
|
|
239
|
+
Object.keys(REGISTRY).sort().forEach((name) => console.log(` \u2022 ${kleur.cyan(name)}`));
|
|
240
|
+
console.log("");
|
|
241
|
+
});
|
|
242
|
+
program.command("add <components...>").description("Add one or more components to your project (resolves dependencies)").option("--cwd <path>", "Working directory", process.cwd()).option("--source <path>", "Path to @structyl/styled/src for inlining").action(async (components, opts) => {
|
|
243
|
+
const configPath = path.join(opts.cwd, "structyl.config.json");
|
|
244
|
+
const configRaw = await fs.readFile(configPath, "utf8").catch(() => null);
|
|
245
|
+
if (!configRaw) {
|
|
246
|
+
console.error(kleur.red("No structyl.config.json found. Run `npx structyl init` first."));
|
|
247
|
+
process.exit(1);
|
|
248
|
+
}
|
|
249
|
+
const config = JSON.parse(configRaw);
|
|
250
|
+
const outDir = path.resolve(opts.cwd, config.componentsDir);
|
|
251
|
+
await fs.mkdir(outDir, { recursive: true });
|
|
252
|
+
const visited = /* @__PURE__ */ new Set();
|
|
253
|
+
const toCopy = [];
|
|
254
|
+
for (const name of components) {
|
|
255
|
+
if (!REGISTRY[name]) {
|
|
256
|
+
console.error(kleur.red(`Unknown component: ${name}`));
|
|
257
|
+
process.exit(1);
|
|
258
|
+
}
|
|
259
|
+
for (const dep of resolveDependencies(name, visited)) {
|
|
260
|
+
if (!toCopy.includes(dep)) toCopy.push(dep);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
const sourceRoot = opts.source ?? path.resolve(opts.cwd, "node_modules/@structyl/styled/src");
|
|
264
|
+
const spinner = ora(`Adding ${toCopy.join(", ")}`).start();
|
|
265
|
+
const installed = [];
|
|
266
|
+
const npmDeps = /* @__PURE__ */ new Set();
|
|
267
|
+
try {
|
|
268
|
+
for (const name of toCopy) {
|
|
269
|
+
const entry = REGISTRY[name];
|
|
270
|
+
if (!entry || !entry.sourcePath) continue;
|
|
271
|
+
const src = path.join(sourceRoot, entry.sourcePath);
|
|
272
|
+
const dest = path.join(outDir, `${entry.name}.tsx`);
|
|
273
|
+
try {
|
|
274
|
+
const content = await fs.readFile(src, "utf8");
|
|
275
|
+
await fs.writeFile(dest, content);
|
|
276
|
+
installed.push(`${kleur.cyan(name)} \u2192 ${kleur.dim(path.relative(opts.cwd, dest))}`);
|
|
277
|
+
} catch {
|
|
278
|
+
await fs.writeFile(
|
|
279
|
+
dest,
|
|
280
|
+
`// ${name} component scaffold (source not found at ${src})
|
|
281
|
+
// Run with --source to point at @structyl/styled/src.
|
|
282
|
+
`
|
|
283
|
+
);
|
|
284
|
+
installed.push(`${kleur.yellow(name)} (stub, source not found)`);
|
|
285
|
+
}
|
|
286
|
+
entry.npmDependencies?.forEach((d) => npmDeps.add(d));
|
|
287
|
+
}
|
|
288
|
+
spinner.succeed("Done");
|
|
289
|
+
installed.forEach((line) => console.log(` ${line}`));
|
|
290
|
+
if (npmDeps.size > 0) {
|
|
291
|
+
console.log(
|
|
292
|
+
`
|
|
293
|
+
${kleur.bold("Install required npm packages:")}
|
|
294
|
+
${kleur.cyan(`pnpm add ${[...npmDeps].join(" ")}`)}`
|
|
295
|
+
);
|
|
296
|
+
}
|
|
297
|
+
} catch (err) {
|
|
298
|
+
spinner.fail("Failed");
|
|
299
|
+
console.error(err);
|
|
300
|
+
process.exit(1);
|
|
301
|
+
}
|
|
302
|
+
});
|
|
303
|
+
program.parse();
|
|
304
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/registry.ts"],"sourcesContent":["import { Command } from 'commander';\nimport kleur from 'kleur';\nimport prompts from 'prompts';\nimport ora from 'ora';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { REGISTRY, resolveDependencies } from './registry';\n\nconst program = new Command();\n\nprogram\n .name('structyl')\n .description('CLI for adding @structyl components to your project')\n .version('0.0.1');\n\nprogram\n .command('init')\n .description('Initialize structyl in your project')\n .action(async () => {\n console.log(kleur.bold().cyan('\\n structyl · init\\n'));\n\n const answers = await prompts([\n {\n type: 'select',\n name: 'theme',\n message: 'Pick a base theme',\n choices: [\n { title: 'slate', value: 'slate' },\n { title: 'zinc', value: 'zinc' },\n { title: 'rose', value: 'rose' },\n ],\n initial: 0,\n },\n {\n type: 'text',\n name: 'dir',\n message: 'Components directory',\n initial: 'src/components/ui',\n },\n ]);\n\n const spinner = ora('Setting up structyl').start();\n try {\n await fs.mkdir(answers.dir, { recursive: true });\n await fs.writeFile(\n 'structyl.config.json',\n JSON.stringify(\n { theme: answers.theme, componentsDir: answers.dir, version: '0.0.1' },\n null,\n 2,\n ),\n );\n spinner.succeed('Done!');\n console.log(kleur.dim(`\\n Config written to ${kleur.cyan('structyl.config.json')}`));\n console.log(kleur.dim(` Add components with ${kleur.cyan('npx structyl add <name>')}`));\n console.log(kleur.dim(` List components with ${kleur.cyan('npx structyl list')}\\n`));\n } catch (err) {\n spinner.fail('Failed');\n console.error(err);\n process.exit(1);\n }\n });\n\nprogram\n .command('list')\n .description('List components available in the registry')\n .action(() => {\n console.log(kleur.bold().cyan('\\n Available components:\\n'));\n Object.keys(REGISTRY)\n .sort()\n .forEach((name) => console.log(` • ${kleur.cyan(name)}`));\n console.log('');\n });\n\nprogram\n .command('add <components...>')\n .description('Add one or more components to your project (resolves dependencies)')\n .option('--cwd <path>', 'Working directory', process.cwd())\n .option('--source <path>', 'Path to @structyl/styled/src for inlining')\n .action(async (components: string[], opts: { cwd: string; source?: string }) => {\n const configPath = path.join(opts.cwd, 'structyl.config.json');\n const configRaw = await fs.readFile(configPath, 'utf8').catch(() => null);\n if (!configRaw) {\n console.error(kleur.red('No structyl.config.json found. Run `npx structyl init` first.'));\n process.exit(1);\n }\n const config = JSON.parse(configRaw) as { componentsDir: string };\n const outDir = path.resolve(opts.cwd, config.componentsDir);\n await fs.mkdir(outDir, { recursive: true });\n\n const visited = new Set<string>();\n const toCopy: string[] = [];\n for (const name of components) {\n if (!REGISTRY[name]) {\n console.error(kleur.red(`Unknown component: ${name}`));\n process.exit(1);\n }\n for (const dep of resolveDependencies(name, visited)) {\n if (!toCopy.includes(dep)) toCopy.push(dep);\n }\n }\n\n const sourceRoot =\n opts.source ?? path.resolve(opts.cwd, 'node_modules/@structyl/styled/src');\n const spinner = ora(`Adding ${toCopy.join(', ')}`).start();\n const installed: string[] = [];\n const npmDeps = new Set<string>();\n try {\n for (const name of toCopy) {\n const entry = REGISTRY[name];\n if (!entry || !entry.sourcePath) continue;\n const src = path.join(sourceRoot, entry.sourcePath);\n const dest = path.join(outDir, `${entry.name}.tsx`);\n try {\n const content = await fs.readFile(src, 'utf8');\n await fs.writeFile(dest, content);\n installed.push(`${kleur.cyan(name)} → ${kleur.dim(path.relative(opts.cwd, dest))}`);\n } catch {\n await fs.writeFile(\n dest,\n `// ${name} component scaffold (source not found at ${src})\\n// Run with --source to point at @structyl/styled/src.\\n`,\n );\n installed.push(`${kleur.yellow(name)} (stub, source not found)`);\n }\n entry.npmDependencies?.forEach((d) => npmDeps.add(d));\n }\n spinner.succeed('Done');\n installed.forEach((line) => console.log(` ${line}`));\n if (npmDeps.size > 0) {\n console.log(\n `\\n${kleur.bold('Install required npm packages:')}\\n ${kleur.cyan(`pnpm add ${[...npmDeps].join(' ')}`)}`,\n );\n }\n } catch (err) {\n spinner.fail('Failed');\n console.error(err);\n process.exit(1);\n }\n });\n\nprogram.parse();\n","/**\n * Component registry. Each entry describes the styled-package source for a\n * component along with which primitives it transitively depends on. The CLI\n * `add` command inlines the styled source into the user's project and lists\n * the workspace packages they need to install.\n */\n\nexport interface RegistryEntry {\n name: string;\n /** Workspace packages required for this component to function */\n dependencies: string[];\n /** External npm packages required */\n npmDependencies?: string[];\n /** Path under `packages/styled/src/` to copy. */\n sourcePath: string;\n /** Other registry entries this component depends on. */\n registryDependencies?: string[];\n}\n\nconst PRIMITIVES = ['@structyl/primitives', '@structyl/core', '@structyl/hooks', '@structyl/utils', '@structyl/icons'];\nconst STRUCTYL_REGISTRY = {\n dependencies: PRIMITIVES,\n sourcePath: 'structyl/index.tsx',\n registryDependencies: ['button', 'combobox'],\n} satisfies Omit<RegistryEntry, 'name'>;\n\nexport const REGISTRY: Record<string, RegistryEntry> = {\n // Atoms\n button: { name: 'button', dependencies: PRIMITIVES, sourcePath: 'button/index.tsx' },\n badge: { name: 'badge', dependencies: PRIMITIVES, sourcePath: 'badge/index.tsx' },\n card: { name: 'card', dependencies: PRIMITIVES, sourcePath: 'card/index.tsx' },\n skeleton: { name: 'skeleton', dependencies: PRIMITIVES, sourcePath: 'skeleton/index.tsx' },\n spinner: { name: 'spinner', dependencies: PRIMITIVES, sourcePath: 'spinner/index.tsx' },\n alert: { name: 'alert', dependencies: PRIMITIVES, sourcePath: 'alert/index.tsx' },\n 'aspect-ratio': { name: 'aspect-ratio', dependencies: PRIMITIVES, sourcePath: 'aspect-ratio/index.tsx' },\n avatar: { name: 'avatar', dependencies: PRIMITIVES, sourcePath: 'avatar/index.tsx' },\n progress: { name: 'progress', dependencies: PRIMITIVES, sourcePath: 'progress/index.tsx' },\n separator: { name: 'separator', dependencies: PRIMITIVES, sourcePath: 'separator/index.tsx' },\n label: { name: 'label', dependencies: PRIMITIVES, sourcePath: 'label/index.tsx' },\n switch: { name: 'switch', dependencies: PRIMITIVES, sourcePath: 'switch/index.tsx' },\n toggle: { name: 'toggle', dependencies: PRIMITIVES, sourcePath: 'toggle/index.tsx' },\n checkbox: { name: 'checkbox', dependencies: PRIMITIVES, sourcePath: 'checkbox/index.tsx' },\n dialog: { name: 'dialog', dependencies: PRIMITIVES, sourcePath: 'dialog/index.tsx' },\n\n // Form basics\n input: { name: 'input', dependencies: PRIMITIVES, sourcePath: 'input/index.tsx' },\n textarea: { name: 'textarea', dependencies: PRIMITIVES, sourcePath: 'textarea/index.tsx' },\n 'radio-group': { name: 'radio-group', dependencies: PRIMITIVES, sourcePath: 'radio-group/index.tsx' },\n 'toggle-group': {\n name: 'toggle-group',\n dependencies: PRIMITIVES,\n sourcePath: 'toggle-group/index.tsx',\n registryDependencies: ['toggle'],\n },\n slider: { name: 'slider', dependencies: PRIMITIVES, sourcePath: 'slider/index.tsx' },\n form: { name: 'form', dependencies: PRIMITIVES, sourcePath: 'form/index.tsx' },\n\n // Disclosure & nav\n collapsible: { name: 'collapsible', dependencies: PRIMITIVES, sourcePath: 'collapsible/index.tsx' },\n accordion: { name: 'accordion', dependencies: PRIMITIVES, sourcePath: 'accordion/index.tsx' },\n tabs: { name: 'tabs', dependencies: PRIMITIVES, sourcePath: 'tabs/index.tsx' },\n breadcrumb: { name: 'breadcrumb', dependencies: PRIMITIVES, sourcePath: 'breadcrumb/index.tsx' },\n pagination: {\n name: 'pagination',\n dependencies: PRIMITIVES,\n sourcePath: 'pagination/index.tsx',\n registryDependencies: ['button'],\n },\n stepper: { name: 'stepper', dependencies: PRIMITIVES, sourcePath: 'stepper/index.tsx' },\n\n // Overlays\n 'alert-dialog': {\n name: 'alert-dialog',\n dependencies: PRIMITIVES,\n sourcePath: 'alert-dialog/index.tsx',\n registryDependencies: ['button'],\n },\n sheet: { name: 'sheet', dependencies: PRIMITIVES, sourcePath: 'sheet/index.tsx' },\n drawer: { name: 'drawer', dependencies: PRIMITIVES, sourcePath: 'drawer/index.tsx' },\n popover: { name: 'popover', dependencies: PRIMITIVES, sourcePath: 'popover/index.tsx' },\n tooltip: { name: 'tooltip', dependencies: PRIMITIVES, sourcePath: 'tooltip/index.tsx' },\n 'hover-card': { name: 'hover-card', dependencies: PRIMITIVES, sourcePath: 'hover-card/index.tsx' },\n toast: { name: 'toast', dependencies: PRIMITIVES, sourcePath: 'toast/index.tsx' },\n\n // Complex compound\n 'dropdown-menu': { name: 'dropdown-menu', dependencies: PRIMITIVES, sourcePath: 'dropdown-menu/index.tsx' },\n 'context-menu': { name: 'context-menu', dependencies: PRIMITIVES, sourcePath: 'context-menu/index.tsx' },\n menubar: { name: 'menubar', dependencies: PRIMITIVES, sourcePath: 'menubar/index.tsx' },\n 'navigation-menu': { name: 'navigation-menu', dependencies: PRIMITIVES, sourcePath: 'navigation-menu/index.tsx' },\n select: { name: 'select', dependencies: PRIMITIVES, sourcePath: 'select/index.tsx' },\n 'multi-select': { name: 'multi-select', dependencies: PRIMITIVES, sourcePath: 'multi-select/index.tsx' },\n combobox: { name: 'combobox', dependencies: PRIMITIVES, sourcePath: 'combobox/index.tsx' },\n command: { name: 'command', dependencies: PRIMITIVES, sourcePath: 'command/index.tsx' },\n autocomplete: { name: 'autocomplete', ...STRUCTYL_REGISTRY },\n\n // Specialty form\n 'one-time-password-field': {\n name: 'one-time-password-field',\n dependencies: PRIMITIVES,\n sourcePath: 'one-time-password-field/index.tsx',\n },\n 'password-toggle-field': {\n name: 'password-toggle-field',\n dependencies: PRIMITIVES,\n sourcePath: 'password-toggle-field/index.tsx',\n },\n 'number-field': { name: 'number-field', dependencies: PRIMITIVES, sourcePath: 'number-field/index.tsx' },\n calendar: { name: 'calendar', dependencies: PRIMITIVES, sourcePath: 'calendar/index.tsx' },\n 'date-picker': {\n name: 'date-picker',\n dependencies: PRIMITIVES,\n sourcePath: 'date-picker/index.tsx',\n registryDependencies: ['calendar', 'button'],\n },\n 'time-picker': { name: 'time-picker', dependencies: PRIMITIVES, sourcePath: 'time-picker/index.tsx' },\n 'date-time-picker': {\n name: 'date-time-picker',\n dependencies: PRIMITIVES,\n sourcePath: 'date-time-picker/index.tsx',\n registryDependencies: ['calendar', 'button', 'time-picker'],\n },\n 'date-range-picker': {\n name: 'date-range-picker',\n dependencies: PRIMITIVES,\n sourcePath: 'date-range-picker/index.tsx',\n registryDependencies: ['calendar', 'button'],\n },\n 'color-picker': { name: 'color-picker', dependencies: PRIMITIVES, sourcePath: 'color-picker/index.tsx' },\n 'file-upload': { name: 'file-upload', dependencies: PRIMITIVES, sourcePath: 'file-upload/index.tsx' },\n\n // Feedback & misc\n 'circular-progress': {\n name: 'circular-progress',\n dependencies: ['@structyl/utils'],\n sourcePath: 'circular-progress/index.tsx',\n },\n meter: { name: 'meter', dependencies: ['@structyl/utils'], sourcePath: 'meter/index.tsx' },\n 'scroll-area': { name: 'scroll-area', dependencies: PRIMITIVES, sourcePath: 'scroll-area/index.tsx' },\n toolbar: { name: 'toolbar', dependencies: PRIMITIVES, sourcePath: 'toolbar/index.tsx' },\n resizable: { name: 'resizable', dependencies: PRIMITIVES, sourcePath: 'resizable/index.tsx' },\n carousel: { name: 'carousel', dependencies: PRIMITIVES, sourcePath: 'carousel/index.tsx' },\n tree: { name: 'tree', dependencies: PRIMITIVES, sourcePath: 'tree/index.tsx' },\n editable: { name: 'editable', dependencies: PRIMITIVES, sourcePath: 'editable/index.tsx' },\n 'tags-input': { name: 'tags-input', dependencies: PRIMITIVES, sourcePath: 'tags-input/index.tsx' },\n mentions: { name: 'mentions', dependencies: PRIMITIVES, sourcePath: 'mentions/index.tsx' },\n 'copy-button': {\n name: 'copy-button',\n dependencies: ['@structyl/utils', '@structyl/icons'],\n sourcePath: 'copy-button/index.tsx',\n registryDependencies: ['button'],\n },\n box: { name: 'box', ...STRUCTYL_REGISTRY },\n container: { name: 'container', ...STRUCTYL_REGISTRY },\n stack: { name: 'stack', ...STRUCTYL_REGISTRY },\n grid: { name: 'grid', ...STRUCTYL_REGISTRY },\n paper: { name: 'paper', ...STRUCTYL_REGISTRY },\n typography: { name: 'typography', ...STRUCTYL_REGISTRY },\n link: { name: 'link', ...STRUCTYL_REGISTRY },\n 'svg-icon': { name: 'svg-icon', ...STRUCTYL_REGISTRY },\n chart: { name: 'chart', ...STRUCTYL_REGISTRY },\n chip: { name: 'chip', ...STRUCTYL_REGISTRY },\n 'button-group': { name: 'button-group', ...STRUCTYL_REGISTRY },\n 'floating-action-button': { name: 'floating-action-button', ...STRUCTYL_REGISTRY },\n rating: { name: 'rating', ...STRUCTYL_REGISTRY },\n 'transfer-list': { name: 'transfer-list', ...STRUCTYL_REGISTRY },\n list: { name: 'list', ...STRUCTYL_REGISTRY },\n 'image-list': { name: 'image-list', ...STRUCTYL_REGISTRY },\n table: { name: 'table', ...STRUCTYL_REGISTRY },\n backdrop: { name: 'backdrop', ...STRUCTYL_REGISTRY },\n snackbar: { name: 'snackbar', ...STRUCTYL_REGISTRY },\n modal: { name: 'modal', ...STRUCTYL_REGISTRY },\n 'app-bar': { name: 'app-bar', ...STRUCTYL_REGISTRY },\n 'bottom-navigation': { name: 'bottom-navigation', ...STRUCTYL_REGISTRY },\n 'speed-dial': { name: 'speed-dial', ...STRUCTYL_REGISTRY },\n masonry: { name: 'masonry', ...STRUCTYL_REGISTRY },\n timeline: { name: 'timeline', ...STRUCTYL_REGISTRY },\n 'click-away-listener': { name: 'click-away-listener', ...STRUCTYL_REGISTRY },\n 'no-ssr': { name: 'no-ssr', ...STRUCTYL_REGISTRY },\n portal: { name: 'portal', ...STRUCTYL_REGISTRY },\n popper: { name: 'popper', ...STRUCTYL_REGISTRY },\n 'textarea-autosize': { name: 'textarea-autosize', ...STRUCTYL_REGISTRY },\n transition: { name: 'transition', ...STRUCTYL_REGISTRY },\n 'css-baseline': { name: 'css-baseline', ...STRUCTYL_REGISTRY },\n 'init-color-scheme-script': { name: 'init-color-scheme-script', ...STRUCTYL_REGISTRY },\n\n // Data\n 'data-table': {\n name: 'data-table',\n dependencies: ['@structyl/utils', '@structyl/icons', '@tanstack/react-table', '@tanstack/react-virtual'],\n npmDependencies: ['@tanstack/react-table', '@tanstack/react-virtual'],\n sourcePath: '',\n },\n};\n\nexport function resolveDependencies(name: string, visited = new Set<string>()): string[] {\n if (visited.has(name)) return [];\n visited.add(name);\n const entry = REGISTRY[name];\n if (!entry) return [];\n const deps = [name];\n for (const dep of entry.registryDependencies ?? []) {\n deps.push(...resolveDependencies(dep, visited));\n }\n return deps;\n}\n"],"mappings":"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","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@structyl/cli",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"publishConfig": {
|
|
5
|
+
"access": "public"
|
|
6
|
+
},
|
|
7
|
+
"description": "Command-line tool for scaffolding structyl projects and copying styled components into your codebase with automatic dependency resolution.",
|
|
8
|
+
"keywords": [
|
|
9
|
+
"react",
|
|
10
|
+
"typescript",
|
|
11
|
+
"structyl",
|
|
12
|
+
"cli",
|
|
13
|
+
"shadcn",
|
|
14
|
+
"scaffold",
|
|
15
|
+
"components",
|
|
16
|
+
"registry",
|
|
17
|
+
"tailwind",
|
|
18
|
+
"commander",
|
|
19
|
+
"code-generation"
|
|
20
|
+
],
|
|
21
|
+
"license": "MIT",
|
|
22
|
+
"type": "module",
|
|
23
|
+
"bin": {
|
|
24
|
+
"structyl": "./dist/index.js"
|
|
25
|
+
},
|
|
26
|
+
"files": [
|
|
27
|
+
"dist"
|
|
28
|
+
],
|
|
29
|
+
"dependencies": {
|
|
30
|
+
"commander": "^12.1.0",
|
|
31
|
+
"prompts": "^2.4.2",
|
|
32
|
+
"kleur": "^4.1.5",
|
|
33
|
+
"ora": "^8.1.0",
|
|
34
|
+
"execa": "^9.4.0"
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"@types/node": "^22.7.5",
|
|
38
|
+
"@types/prompts": "^2.4.9",
|
|
39
|
+
"tsup": "^8.3.0",
|
|
40
|
+
"typescript": "^5.6.3"
|
|
41
|
+
},
|
|
42
|
+
"scripts": {
|
|
43
|
+
"build": "tsup",
|
|
44
|
+
"dev": "tsup --watch",
|
|
45
|
+
"lint": "eslint src",
|
|
46
|
+
"typecheck": "tsc --noEmit",
|
|
47
|
+
"clean": "rm -rf dist .turbo"
|
|
48
|
+
}
|
|
49
|
+
}
|