nx-factory-cli 2.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/README.md +244 -0
- package/dist/commands/add-app.d.ts +15 -0
- package/dist/commands/add-app.d.ts.map +1 -0
- package/dist/commands/add-app.js +365 -0
- package/dist/commands/add-app.js.map +1 -0
- package/dist/commands/add-component.d.ts +2 -0
- package/dist/commands/add-component.d.ts.map +1 -0
- package/dist/commands/add-component.js +110 -0
- package/dist/commands/add-component.js.map +1 -0
- package/dist/commands/add-lib.d.ts +9 -0
- package/dist/commands/add-lib.d.ts.map +1 -0
- package/dist/commands/add-lib.js +190 -0
- package/dist/commands/add-lib.js.map +1 -0
- package/dist/commands/add-storybook.d.ts +6 -0
- package/dist/commands/add-storybook.d.ts.map +1 -0
- package/dist/commands/add-storybook.js +181 -0
- package/dist/commands/add-storybook.js.map +1 -0
- package/dist/commands/doctor.d.ts +2 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +230 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/init.d.ts +9 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +505 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.d.ts +2 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +130 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/publish.d.ts +8 -0
- package/dist/commands/publish.d.ts.map +1 -0
- package/dist/commands/publish.js +179 -0
- package/dist/commands/publish.js.map +1 -0
- package/dist/commands/remove-component.d.ts +5 -0
- package/dist/commands/remove-component.d.ts.map +1 -0
- package/dist/commands/remove-component.js +172 -0
- package/dist/commands/remove-component.js.map +1 -0
- package/dist/commands/update.d.ts +5 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +126 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/config.d.ts +14 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +35 -0
- package/dist/config.js.map +1 -0
- package/dist/exec.d.ts +25 -0
- package/dist/exec.d.ts.map +1 -0
- package/dist/exec.js +80 -0
- package/dist/exec.js.map +1 -0
- package/dist/files.d.ts +7 -0
- package/dist/files.d.ts.map +1 -0
- package/dist/files.js +23 -0
- package/dist/files.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +85 -0
- package/dist/index.js.map +1 -0
- package/dist/ui.d.ts +44 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +149 -0
- package/dist/ui.js.map +1 -0
- package/package.json +39 -0
package/README.md
ADDED
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
# nx-factory-cli
|
|
2
|
+
|
|
3
|
+
A TypeScript CLI that spins up a production-ready **Nx monorepo** with a shared UI package powered by **shadcn/ui** and **Tailwind v4** — ready for any number of apps to consume.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Features
|
|
8
|
+
|
|
9
|
+
| Feature | Details |
|
|
10
|
+
|---|---|
|
|
11
|
+
| 🏗️ Nx workspace | `ts` preset, apps/ + packages/ layout |
|
|
12
|
+
| 🎨 Shared UI package | `packages/ui` — built with tsup, exported as ESM |
|
|
13
|
+
| 💅 Tailwind v4 | CSS-first config, `@import "tailwindcss"`, full dark mode tokens |
|
|
14
|
+
| 🧩 shadcn/ui | `new-york` style, CSS variables, any component on demand |
|
|
15
|
+
| 📦 Multi-app | Add Next.js or Vite/React apps that all import the same components |
|
|
16
|
+
| 🔄 Extendable | Add components any time with `add-component` |
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Install
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
# From npm (after publishing)
|
|
24
|
+
npm install -g nx-factory-cli
|
|
25
|
+
|
|
26
|
+
# Or run directly
|
|
27
|
+
npx nx-factory init
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Local development
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
git clone <this-repo>
|
|
34
|
+
cd nx-factory-cli
|
|
35
|
+
pnpm install
|
|
36
|
+
pnpm dev init # runs the CLI in dev mode
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Commands
|
|
42
|
+
|
|
43
|
+
### `nx-factory init`
|
|
44
|
+
|
|
45
|
+
Interactively initializes a new Nx monorepo.
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
nx-factory init
|
|
49
|
+
# or with flags:
|
|
50
|
+
nx-factory init --name my-design-system --pkg-manager pnpm
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
**Prompts you for:**
|
|
54
|
+
- Workspace name
|
|
55
|
+
- Package manager (pnpm / npm / yarn / bun)
|
|
56
|
+
- Shared UI package name (default: `ui`)
|
|
57
|
+
- Which shadcn components to pre-install
|
|
58
|
+
- Whether to scaffold an example Next.js app
|
|
59
|
+
|
|
60
|
+
**What it creates:**
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
my-monorepo/
|
|
64
|
+
├── nx.json
|
|
65
|
+
├── package.json
|
|
66
|
+
├── pnpm-workspace.yaml
|
|
67
|
+
├── tsconfig.base.json
|
|
68
|
+
├── apps/
|
|
69
|
+
│ └── example-app/ # (optional Next.js starter)
|
|
70
|
+
│ ├── src/app/
|
|
71
|
+
│ ├── next.config.ts
|
|
72
|
+
│ └── package.json
|
|
73
|
+
└── packages/
|
|
74
|
+
└── ui/
|
|
75
|
+
├── components.json # shadcn config
|
|
76
|
+
├── tsup.config.ts # builds to dist/
|
|
77
|
+
├── package.json # @workspace/ui
|
|
78
|
+
└── src/
|
|
79
|
+
├── index.ts # barrel exports
|
|
80
|
+
├── lib/utils.ts # cn() helper
|
|
81
|
+
├── styles/globals.css # Tailwind v4 CSS
|
|
82
|
+
└── components/ui/ # shadcn components live here
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
### `nx-factory add-app`
|
|
88
|
+
|
|
89
|
+
Scaffolds a new app inside `apps/` that's pre-wired to import from your shared UI package.
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
nx-factory add-app
|
|
93
|
+
# or with flags:
|
|
94
|
+
nx-factory add-app --name dashboard --framework nextjs
|
|
95
|
+
nx-factory add-app --name marketing --framework vite
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
**Supported frameworks:**
|
|
99
|
+
- `nextjs` — Next.js 15 (App Router)
|
|
100
|
+
- `vite` — Vite 6 + React 19
|
|
101
|
+
|
|
102
|
+
The new app will automatically have:
|
|
103
|
+
- `@workspace/ui` in its `dependencies`
|
|
104
|
+
- CSS imported from `@workspace/ui/styles`
|
|
105
|
+
- `transpilePackages` (Next.js) or `@tailwindcss/vite` (Vite) configured
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
### `nx-factory add-component`
|
|
110
|
+
|
|
111
|
+
Adds one or more shadcn components to the shared UI package and **automatically updates the barrel export** in `src/index.ts`.
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
# Interactive picker
|
|
115
|
+
nx-factory add-component
|
|
116
|
+
|
|
117
|
+
# Or pass component names directly
|
|
118
|
+
nx-factory add-component button card dialog
|
|
119
|
+
nx-factory add-component data-table
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
After running, import in any app:
|
|
123
|
+
|
|
124
|
+
```tsx
|
|
125
|
+
import { Button, Card, Dialog } from "@workspace/ui";
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## Monorepo structure & import flow
|
|
131
|
+
|
|
132
|
+
```
|
|
133
|
+
apps/my-app
|
|
134
|
+
↓ imports
|
|
135
|
+
@workspace/ui (packages/ui)
|
|
136
|
+
↓ built by tsup
|
|
137
|
+
↓ exports components via dist/index.js
|
|
138
|
+
↓ exports CSS via src/styles/globals.css
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### Consuming the UI package
|
|
142
|
+
|
|
143
|
+
**In a Next.js app:**
|
|
144
|
+
|
|
145
|
+
```tsx
|
|
146
|
+
// src/app/layout.tsx
|
|
147
|
+
import "@workspace/ui/styles"; // Tailwind + shadcn tokens
|
|
148
|
+
import { Button } from "@workspace/ui";
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
**In a Vite app:**
|
|
152
|
+
|
|
153
|
+
```tsx
|
|
154
|
+
// src/main.tsx
|
|
155
|
+
import "@workspace/ui/styles";
|
|
156
|
+
import { Button } from "@workspace/ui";
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
## Building
|
|
162
|
+
|
|
163
|
+
Build the UI package before apps can import from it:
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
# From monorepo root
|
|
167
|
+
pnpm nx build @workspace/ui
|
|
168
|
+
|
|
169
|
+
# Or inside packages/ui
|
|
170
|
+
pnpm build
|
|
171
|
+
|
|
172
|
+
# Watch mode during development
|
|
173
|
+
pnpm build:watch
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
Nx caches builds, so if nothing changed, it won't rebuild.
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## Adding a new component manually
|
|
181
|
+
|
|
182
|
+
1. Create `packages/ui/src/components/ui/my-component.tsx`
|
|
183
|
+
2. Export it from `packages/ui/src/index.ts`:
|
|
184
|
+
|
|
185
|
+
```ts
|
|
186
|
+
export { MyComponent, type MyComponentProps } from "./components/ui/my-component";
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
3. Rebuild: `pnpm nx build @workspace/ui`
|
|
190
|
+
4. Use it: `import { MyComponent } from "@workspace/ui"`
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
## Tailwind v4 in apps
|
|
195
|
+
|
|
196
|
+
Tailwind v4 uses a CSS-first config. The shared CSS file exports design tokens via CSS variables. Apps don't need a `tailwind.config.js` — just import the CSS:
|
|
197
|
+
|
|
198
|
+
```css
|
|
199
|
+
/* Your app's globals.css */
|
|
200
|
+
@import "@workspace/ui/styles"; /* gets all tokens */
|
|
201
|
+
/* Add app-specific overrides below */
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
To add app-specific colors or extend the theme, use `@theme` in your app's CSS:
|
|
205
|
+
|
|
206
|
+
```css
|
|
207
|
+
@theme {
|
|
208
|
+
--color-brand: oklch(0.6 0.2 250);
|
|
209
|
+
}
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
## Tech stack
|
|
215
|
+
|
|
216
|
+
- **Nx** — monorepo tooling, task orchestration, caching
|
|
217
|
+
- **tsup** — fast ESM bundler for the UI package
|
|
218
|
+
- **shadcn/ui** — copy-and-own component primitives (Radix UI based)
|
|
219
|
+
- **Tailwind v4** — CSS-first, no config file needed
|
|
220
|
+
- **TypeScript** — strict mode throughout
|
|
221
|
+
- **inquirer** — interactive prompts
|
|
222
|
+
- **commander** — CLI argument parsing
|
|
223
|
+
- **execa** — subprocess management
|
|
224
|
+
- **ora** — spinners
|
|
225
|
+
- **chalk** — terminal colors
|
|
226
|
+
|
|
227
|
+
---
|
|
228
|
+
|
|
229
|
+
## Extending the CLI
|
|
230
|
+
|
|
231
|
+
The CLI is designed to be extended. Add new commands in `src/commands/` and register them in `src/index.ts`:
|
|
232
|
+
|
|
233
|
+
```ts
|
|
234
|
+
program
|
|
235
|
+
.command("my-command")
|
|
236
|
+
.description("Does something useful")
|
|
237
|
+
.action(myCommand);
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
---
|
|
241
|
+
|
|
242
|
+
## License
|
|
243
|
+
|
|
244
|
+
MIT
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
interface AddAppOptions {
|
|
2
|
+
name?: string;
|
|
3
|
+
framework?: string;
|
|
4
|
+
yes?: boolean;
|
|
5
|
+
dryRun?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function addAppCommand(options: AddAppOptions): Promise<void>;
|
|
8
|
+
/**
|
|
9
|
+
* Called by init.ts to scaffold the optional example Next.js app.
|
|
10
|
+
* Runs create-next-app@latest inside <workspaceRoot>/apps/, then
|
|
11
|
+
* wires the shared UI package in exactly the same way add-app does.
|
|
12
|
+
*/
|
|
13
|
+
export declare function scaffoldExampleApp(workspaceRoot: string, appName: string, uiPkgName: string, pm: string): Promise<void>;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=add-app.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-app.d.ts","sourceRoot":"","sources":["../../commands/add-app.ts"],"names":[],"mappings":"AAOA,UAAU,aAAa;IACrB,IAAI,CAAC,EAAO,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAQ,OAAO,CAAC;IACpB,MAAM,CAAC,EAAK,OAAO,CAAC;CACrB;AAOD,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAkIzE;AA8SD;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,aAAa,EAAE,MAAM,EACrB,OAAO,EAAQ,MAAM,EACrB,SAAS,EAAM,MAAM,EACrB,EAAE,EAAa,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CAOf"}
|
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
import inquirer from "inquirer";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import { pathExists, writeFile, readJson } from "../files.js";
|
|
4
|
+
import { pmWorkspaceProtocol, detectPackageManager, pmx, pmxArgs, runInteractive } from "../exec.js";
|
|
5
|
+
import { loadConfig } from "../config.js";
|
|
6
|
+
import { q, detected, createStepRunner, printSection, printSuccess, printError, c } from "../ui.js";
|
|
7
|
+
export async function addAppCommand(options) {
|
|
8
|
+
const pkgJsonPath = path.join(process.cwd(), "package.json");
|
|
9
|
+
if (!(await pathExists(pkgJsonPath))) {
|
|
10
|
+
printError({
|
|
11
|
+
title: "No package.json found",
|
|
12
|
+
detail: "Run this command from the monorepo root.",
|
|
13
|
+
recovery: [{ label: "", cmd: "cd my-monorepo && nx-shadcn add-app" }],
|
|
14
|
+
});
|
|
15
|
+
process.exit(1);
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
await readJson(pkgJsonPath);
|
|
19
|
+
const cfg = await loadConfig();
|
|
20
|
+
const packagesDir = path.join(process.cwd(), "packages");
|
|
21
|
+
let detectedUiPkg = cfg?.uiPackage ?? "ui";
|
|
22
|
+
if (!cfg && await pathExists(packagesDir)) {
|
|
23
|
+
const { default: fs } = await import("fs-extra");
|
|
24
|
+
const pkgs = await fs.readdir(packagesDir);
|
|
25
|
+
if (pkgs.length > 0)
|
|
26
|
+
detectedUiPkg = pkgs[0];
|
|
27
|
+
}
|
|
28
|
+
const detectedPm = await detectPackageManager();
|
|
29
|
+
const defaults = {
|
|
30
|
+
appName: options.name ?? "my-app",
|
|
31
|
+
framework: options.framework ?? "nextjs",
|
|
32
|
+
uiPkgName: detectedUiPkg,
|
|
33
|
+
pkgManager: detectedPm ?? cfg?.pkgManager ?? "pnpm",
|
|
34
|
+
};
|
|
35
|
+
const answers = options.yes
|
|
36
|
+
? defaults
|
|
37
|
+
: await inquirer.prompt([
|
|
38
|
+
{
|
|
39
|
+
type: "input",
|
|
40
|
+
name: "appName",
|
|
41
|
+
message: q("App name", "lowercase letters, numbers, dashes only"),
|
|
42
|
+
default: defaults.appName,
|
|
43
|
+
validate: (v) => /^[a-z0-9-]+$/.test(v) || c.red("Only lowercase letters, numbers, and dashes"),
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
type: "list",
|
|
47
|
+
name: "framework",
|
|
48
|
+
message: q("Framework"),
|
|
49
|
+
choices: [
|
|
50
|
+
{ name: "Next.js — create-next-app@latest", value: "nextjs" },
|
|
51
|
+
{ name: "Vite — create-vite@latest", value: "vite" },
|
|
52
|
+
{ name: "Remix — create-remix@latest", value: "remix" },
|
|
53
|
+
{ name: "Expo — create-expo-app@latest", value: "expo" },
|
|
54
|
+
],
|
|
55
|
+
default: defaults.framework,
|
|
56
|
+
when: !options.framework,
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
type: "input",
|
|
60
|
+
name: "uiPkgName",
|
|
61
|
+
message: q("Shared UI package name"),
|
|
62
|
+
default: defaults.uiPkgName,
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
type: "list",
|
|
66
|
+
name: "pkgManager",
|
|
67
|
+
message: q("Package manager"),
|
|
68
|
+
choices: ["pnpm", "npm", "yarn", "bun"],
|
|
69
|
+
default: detectedPm ? detected(detectedPm) : defaults.pkgManager,
|
|
70
|
+
when: !detectedPm,
|
|
71
|
+
},
|
|
72
|
+
]);
|
|
73
|
+
const appName = (answers.appName ?? defaults.appName);
|
|
74
|
+
const framework = (answers.framework ?? defaults.framework);
|
|
75
|
+
const uiPkgName = (answers.uiPkgName ?? defaults.uiPkgName);
|
|
76
|
+
const pm = (answers.pkgManager ?? detectedPm ?? defaults.pkgManager);
|
|
77
|
+
const appsDir = path.join(process.cwd(), "apps");
|
|
78
|
+
const appDir = path.join(appsDir, appName);
|
|
79
|
+
if (await pathExists(appDir)) {
|
|
80
|
+
printError({
|
|
81
|
+
title: `apps/${appName} already exists`,
|
|
82
|
+
recovery: [{ label: "Choose a different name or delete the existing directory:", cmd: `rm -rf apps/${appName}` }],
|
|
83
|
+
});
|
|
84
|
+
process.exit(1);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
// ─── Dry run ────────────────────────────────────────────────────────────────
|
|
88
|
+
if (options.dryRun) {
|
|
89
|
+
printSection(`[dry run] Scaffolding ${framework} app → apps/${appName}`);
|
|
90
|
+
const step = createStepRunner(3, true);
|
|
91
|
+
await step(`Run ${frameworkCliName(framework)}`, async () => { });
|
|
92
|
+
await step(`Add @workspace/${uiPkgName} dependency`, async () => { });
|
|
93
|
+
await step("Patch framework config for shared UI styles", async () => { });
|
|
94
|
+
printSuccess({
|
|
95
|
+
title: `apps/${appName} ready (dry run — nothing written)`,
|
|
96
|
+
commands: [
|
|
97
|
+
{ cmd: `${pm} install` },
|
|
98
|
+
{ cmd: devCmd(framework, pm, appName), comment: "start the app" },
|
|
99
|
+
],
|
|
100
|
+
});
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
// ─── Real scaffold ──────────────────────────────────────────────────────────
|
|
104
|
+
printSection(`Scaffolding ${framework} app → apps/${appName}`);
|
|
105
|
+
const step = createStepRunner(3);
|
|
106
|
+
await step(`Run ${frameworkCliName(framework)}`, async () => {
|
|
107
|
+
await scaffoldViaCli(framework, appName, appsDir, pm);
|
|
108
|
+
});
|
|
109
|
+
await step(`Add @workspace/${uiPkgName} dependency`, async () => {
|
|
110
|
+
await addUiDependency(appDir, uiPkgName, pm);
|
|
111
|
+
});
|
|
112
|
+
await step("Patch config for shared UI styles", async () => {
|
|
113
|
+
await patchConfig(framework, appDir, uiPkgName, appName);
|
|
114
|
+
});
|
|
115
|
+
printSuccess({
|
|
116
|
+
title: `apps/${appName} created`,
|
|
117
|
+
commands: [
|
|
118
|
+
{ cmd: `${pm} install`, comment: "install workspace deps" },
|
|
119
|
+
{ cmd: devCmd(framework, pm, appName), comment: framework === "expo" ? "start Expo dev server" : "start the app" },
|
|
120
|
+
],
|
|
121
|
+
...(framework === "expo" ? {
|
|
122
|
+
tips: [{ label: "Note:", cmd: "Expo uses NativeWind — shadcn components are web-only" }],
|
|
123
|
+
} : {}),
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
// ─── CLI runner ───────────────────────────────────────────────────────────────
|
|
127
|
+
async function scaffoldViaCli(framework, appName, appsDir, pm) {
|
|
128
|
+
const { default: fs } = await import("fs-extra");
|
|
129
|
+
await fs.ensureDir(appsDir);
|
|
130
|
+
switch (framework) {
|
|
131
|
+
case "nextjs":
|
|
132
|
+
await runInteractive(pmx(pm), pmxArgs(pm, "create-next-app@latest", [
|
|
133
|
+
appName,
|
|
134
|
+
"--ts",
|
|
135
|
+
"--tailwind",
|
|
136
|
+
"--eslint",
|
|
137
|
+
"--app",
|
|
138
|
+
"--src-dir",
|
|
139
|
+
"--no-import-alias",
|
|
140
|
+
`--use-${pm === "bun" ? "bun" : pm === "yarn" ? "yarn" : pm === "npm" ? "npm" : "pnpm"}`,
|
|
141
|
+
]), { cwd: appsDir });
|
|
142
|
+
break;
|
|
143
|
+
case "vite":
|
|
144
|
+
await runInteractive(pmx(pm), pmxArgs(pm, "create-vite@latest", [
|
|
145
|
+
appName,
|
|
146
|
+
"--template", "react-ts",
|
|
147
|
+
]), { cwd: appsDir });
|
|
148
|
+
break;
|
|
149
|
+
case "remix":
|
|
150
|
+
await runInteractive(pmx(pm), pmxArgs(pm, "create-remix@latest", [
|
|
151
|
+
appName,
|
|
152
|
+
"--yes",
|
|
153
|
+
]), { cwd: appsDir });
|
|
154
|
+
break;
|
|
155
|
+
case "expo":
|
|
156
|
+
await runInteractive(pmx(pm), pmxArgs(pm, "create-expo-app@latest", [
|
|
157
|
+
appName,
|
|
158
|
+
"--template", "blank-typescript",
|
|
159
|
+
"--no-install",
|
|
160
|
+
]), { cwd: appsDir });
|
|
161
|
+
break;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
// ─── Add UI package dep ───────────────────────────────────────────────────────
|
|
165
|
+
async function addUiDependency(appDir, uiPkgName, pm) {
|
|
166
|
+
const pkgJsonPath = path.join(appDir, "package.json");
|
|
167
|
+
const { default: fs } = await import("fs-extra");
|
|
168
|
+
if (!(await pathExists(pkgJsonPath))) {
|
|
169
|
+
throw new Error(`package.json not found in ${appDir} — did the CLI scaffold succeed?`);
|
|
170
|
+
}
|
|
171
|
+
const pkgJson = await fs.readJson(pkgJsonPath);
|
|
172
|
+
pkgJson.dependencies = {
|
|
173
|
+
...pkgJson.dependencies,
|
|
174
|
+
[`@workspace/${uiPkgName}`]: pmWorkspaceProtocol(pm),
|
|
175
|
+
};
|
|
176
|
+
await fs.writeJson(pkgJsonPath, pkgJson, { spaces: 2 });
|
|
177
|
+
}
|
|
178
|
+
// ─── Config patching ──────────────────────────────────────────────────────────
|
|
179
|
+
async function patchConfig(framework, appDir, uiPkgName, appName) {
|
|
180
|
+
switch (framework) {
|
|
181
|
+
case "nextjs":
|
|
182
|
+
await patchNextConfig(appDir, uiPkgName);
|
|
183
|
+
break;
|
|
184
|
+
case "vite":
|
|
185
|
+
await patchViteConfig(appDir, uiPkgName);
|
|
186
|
+
break;
|
|
187
|
+
case "remix":
|
|
188
|
+
await patchRemixConfig(appDir, uiPkgName);
|
|
189
|
+
break;
|
|
190
|
+
case "expo":
|
|
191
|
+
await patchExpoConfig(appDir, uiPkgName);
|
|
192
|
+
break;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
// ── Next.js ───────────────────────────────────────────────────────────────────
|
|
196
|
+
async function patchNextConfig(appDir, uiPkgName) {
|
|
197
|
+
const { default: fs } = await import("fs-extra");
|
|
198
|
+
for (const cfgFile of ["next.config.ts", "next.config.js", "next.config.mjs"]) {
|
|
199
|
+
const cfgPath = path.join(appDir, cfgFile);
|
|
200
|
+
if (!(await pathExists(cfgPath)))
|
|
201
|
+
continue;
|
|
202
|
+
let src = await fs.readFile(cfgPath, "utf-8");
|
|
203
|
+
if (src.includes("transpilePackages")) {
|
|
204
|
+
if (!src.includes(`@workspace/${uiPkgName}`)) {
|
|
205
|
+
src = src.replace(/transpilePackages:\s*\[/, `transpilePackages: ["@workspace/${uiPkgName}", `);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
// create-next-app writes: const nextConfig: NextConfig = {};
|
|
210
|
+
src = src.replace(/(const nextConfig[^=]*=\s*\{)/, `$1\n transpilePackages: ["@workspace/${uiPkgName}"],`);
|
|
211
|
+
}
|
|
212
|
+
await fs.writeFile(cfgPath, src, "utf-8");
|
|
213
|
+
break;
|
|
214
|
+
}
|
|
215
|
+
// Inject shared styles import into layout.tsx
|
|
216
|
+
for (const layoutRel of ["src/app/layout.tsx", "app/layout.tsx", "src/app/layout.jsx"]) {
|
|
217
|
+
const layoutPath = path.join(appDir, layoutRel);
|
|
218
|
+
if (!(await pathExists(layoutPath)))
|
|
219
|
+
continue;
|
|
220
|
+
let src = await fs.readFile(layoutPath, "utf-8");
|
|
221
|
+
if (!src.includes(`@workspace/${uiPkgName}`)) {
|
|
222
|
+
// Insert after the last consecutive import line
|
|
223
|
+
src = src.replace(/((?:^import[^\n]+\n)+)/m, `$1import "@workspace/${uiPkgName}/styles";\n`);
|
|
224
|
+
await fs.writeFile(layoutPath, src, "utf-8");
|
|
225
|
+
}
|
|
226
|
+
break;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
// ── Vite ──────────────────────────────────────────────────────────────────────
|
|
230
|
+
async function patchViteConfig(appDir, uiPkgName) {
|
|
231
|
+
const { default: fs } = await import("fs-extra");
|
|
232
|
+
for (const cfgFile of ["vite.config.ts", "vite.config.js"]) {
|
|
233
|
+
const cfgPath = path.join(appDir, cfgFile);
|
|
234
|
+
if (!(await pathExists(cfgPath)))
|
|
235
|
+
continue;
|
|
236
|
+
let src = await fs.readFile(cfgPath, "utf-8");
|
|
237
|
+
if (!src.includes("@tailwindcss/vite") && !src.includes("tailwindcss")) {
|
|
238
|
+
src = `import tailwindcss from "@tailwindcss/vite";\n${src}`;
|
|
239
|
+
src = src.replace(/plugins:\s*\[/, `plugins: [tailwindcss(), `);
|
|
240
|
+
await fs.writeFile(cfgPath, src, "utf-8");
|
|
241
|
+
}
|
|
242
|
+
break;
|
|
243
|
+
}
|
|
244
|
+
// Add @tailwindcss/vite devDependency
|
|
245
|
+
const pkgPath = path.join(appDir, "package.json");
|
|
246
|
+
if (await pathExists(pkgPath)) {
|
|
247
|
+
const pkg = await fs.readJson(pkgPath);
|
|
248
|
+
pkg.devDependencies = { ...pkg.devDependencies, "@tailwindcss/vite": "^4.0.0" };
|
|
249
|
+
await fs.writeJson(pkgPath, pkg, { spaces: 2 });
|
|
250
|
+
}
|
|
251
|
+
// Inject shared styles import into main entry
|
|
252
|
+
for (const mainRel of ["src/main.tsx", "src/main.jsx", "src/main.ts"]) {
|
|
253
|
+
const mainPath = path.join(appDir, mainRel);
|
|
254
|
+
if (!(await pathExists(mainPath)))
|
|
255
|
+
continue;
|
|
256
|
+
let src = await fs.readFile(mainPath, "utf-8");
|
|
257
|
+
if (!src.includes(`@workspace/${uiPkgName}`)) {
|
|
258
|
+
src = `import "@workspace/${uiPkgName}/styles";\n${src}`;
|
|
259
|
+
await fs.writeFile(mainPath, src, "utf-8");
|
|
260
|
+
}
|
|
261
|
+
break;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
// ── Remix ─────────────────────────────────────────────────────────────────────
|
|
265
|
+
async function patchRemixConfig(appDir, uiPkgName) {
|
|
266
|
+
const { default: fs } = await import("fs-extra");
|
|
267
|
+
for (const cfgFile of ["vite.config.ts", "vite.config.js"]) {
|
|
268
|
+
const cfgPath = path.join(appDir, cfgFile);
|
|
269
|
+
if (!(await pathExists(cfgPath)))
|
|
270
|
+
continue;
|
|
271
|
+
let src = await fs.readFile(cfgPath, "utf-8");
|
|
272
|
+
if (!src.includes("@tailwindcss/vite") && !src.includes("tailwindcss")) {
|
|
273
|
+
src = `import tailwindcss from "@tailwindcss/vite";\n${src}`;
|
|
274
|
+
src = src.replace(/plugins:\s*\[/, `plugins: [tailwindcss(), `);
|
|
275
|
+
await fs.writeFile(cfgPath, src, "utf-8");
|
|
276
|
+
}
|
|
277
|
+
break;
|
|
278
|
+
}
|
|
279
|
+
const pkgPath = path.join(appDir, "package.json");
|
|
280
|
+
if (await pathExists(pkgPath)) {
|
|
281
|
+
const pkg = await fs.readJson(pkgPath);
|
|
282
|
+
pkg.devDependencies = { ...pkg.devDependencies, "@tailwindcss/vite": "^4.0.0" };
|
|
283
|
+
await fs.writeJson(pkgPath, pkg, { spaces: 2 });
|
|
284
|
+
}
|
|
285
|
+
for (const rootRel of ["app/root.tsx", "app/root.jsx"]) {
|
|
286
|
+
const rootPath = path.join(appDir, rootRel);
|
|
287
|
+
if (!(await pathExists(rootPath)))
|
|
288
|
+
continue;
|
|
289
|
+
let src = await fs.readFile(rootPath, "utf-8");
|
|
290
|
+
if (!src.includes(`@workspace/${uiPkgName}`)) {
|
|
291
|
+
src = src.replace(/((?:^import[^\n]+\n)+)/m, `$1import "@workspace/${uiPkgName}/styles";\n`);
|
|
292
|
+
await fs.writeFile(rootPath, src, "utf-8");
|
|
293
|
+
}
|
|
294
|
+
break;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
// ── Expo ──────────────────────────────────────────────────────────────────────
|
|
298
|
+
async function patchExpoConfig(appDir, uiPkgName) {
|
|
299
|
+
const { default: fs } = await import("fs-extra");
|
|
300
|
+
const pkgPath = path.join(appDir, "package.json");
|
|
301
|
+
if (await pathExists(pkgPath)) {
|
|
302
|
+
const pkg = await fs.readJson(pkgPath);
|
|
303
|
+
pkg.dependencies = { ...pkg.dependencies, nativewind: "^4.0.1", tailwindcss: "^3.4.0" };
|
|
304
|
+
pkg.devDependencies = { ...pkg.devDependencies, "babel-preset-expo": "~12.0.0" };
|
|
305
|
+
await fs.writeJson(pkgPath, pkg, { spaces: 2 });
|
|
306
|
+
}
|
|
307
|
+
await writeFile(path.join(appDir, "tailwind.config.js"), `/** @type {import('tailwindcss').Config} */
|
|
308
|
+
module.exports = {
|
|
309
|
+
content: ["./app/**/*.{js,jsx,ts,tsx}", "./components/**/*.{js,jsx,ts,tsx}"],
|
|
310
|
+
presets: [require("nativewind/preset")],
|
|
311
|
+
theme: { extend: {} },
|
|
312
|
+
plugins: [],
|
|
313
|
+
};
|
|
314
|
+
`);
|
|
315
|
+
await writeFile(path.join(appDir, "global.css"), `@tailwind base;\n@tailwind components;\n@tailwind utilities;\n`);
|
|
316
|
+
await writeFile(path.join(appDir, "babel.config.js"), `module.exports = function (api) {
|
|
317
|
+
api.cache(true);
|
|
318
|
+
return {
|
|
319
|
+
presets: [
|
|
320
|
+
["babel-preset-expo", { jsxImportSource: "nativewind" }],
|
|
321
|
+
"nativewind/babel",
|
|
322
|
+
],
|
|
323
|
+
};
|
|
324
|
+
};
|
|
325
|
+
`);
|
|
326
|
+
for (const layoutRel of ["app/_layout.tsx", "app/_layout.jsx"]) {
|
|
327
|
+
const layoutPath = path.join(appDir, layoutRel);
|
|
328
|
+
if (!(await pathExists(layoutPath)))
|
|
329
|
+
continue;
|
|
330
|
+
let src = await fs.readFile(layoutPath, "utf-8");
|
|
331
|
+
if (!src.includes("global.css")) {
|
|
332
|
+
src = `import "../global.css";\n${src}`;
|
|
333
|
+
await fs.writeFile(layoutPath, src, "utf-8");
|
|
334
|
+
}
|
|
335
|
+
break;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
339
|
+
function frameworkCliName(framework) {
|
|
340
|
+
switch (framework) {
|
|
341
|
+
case "nextjs": return "create-next-app@latest";
|
|
342
|
+
case "vite": return "create-vite@latest";
|
|
343
|
+
case "remix": return "create-remix@latest";
|
|
344
|
+
case "expo": return "create-expo-app@latest";
|
|
345
|
+
default: return `create-${framework}@latest`;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
function devCmd(framework, pm, appName) {
|
|
349
|
+
if (framework === "expo")
|
|
350
|
+
return `cd apps/${appName} && ${pm} start`;
|
|
351
|
+
return `${pm} dev --filter=${appName}`;
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* Called by init.ts to scaffold the optional example Next.js app.
|
|
355
|
+
* Runs create-next-app@latest inside <workspaceRoot>/apps/, then
|
|
356
|
+
* wires the shared UI package in exactly the same way add-app does.
|
|
357
|
+
*/
|
|
358
|
+
export async function scaffoldExampleApp(workspaceRoot, appName, uiPkgName, pm) {
|
|
359
|
+
const appsDir = path.join(workspaceRoot, "apps");
|
|
360
|
+
const appDir = path.join(appsDir, appName);
|
|
361
|
+
await scaffoldViaCli("nextjs", appName, appsDir, pm);
|
|
362
|
+
await addUiDependency(appDir, uiPkgName, pm);
|
|
363
|
+
await patchNextConfig(appDir, uiPkgName);
|
|
364
|
+
}
|
|
365
|
+
//# sourceMappingURL=add-app.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-app.js","sourceRoot":"","sources":["../../commands/add-app.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-component.d.ts","sourceRoot":"","sources":["../../commands/add-component.ts"],"names":[],"mappings":"AAkBA,wBAAsB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA4D7E"}
|