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.
Files changed (62) hide show
  1. package/README.md +244 -0
  2. package/dist/commands/add-app.d.ts +15 -0
  3. package/dist/commands/add-app.d.ts.map +1 -0
  4. package/dist/commands/add-app.js +365 -0
  5. package/dist/commands/add-app.js.map +1 -0
  6. package/dist/commands/add-component.d.ts +2 -0
  7. package/dist/commands/add-component.d.ts.map +1 -0
  8. package/dist/commands/add-component.js +110 -0
  9. package/dist/commands/add-component.js.map +1 -0
  10. package/dist/commands/add-lib.d.ts +9 -0
  11. package/dist/commands/add-lib.d.ts.map +1 -0
  12. package/dist/commands/add-lib.js +190 -0
  13. package/dist/commands/add-lib.js.map +1 -0
  14. package/dist/commands/add-storybook.d.ts +6 -0
  15. package/dist/commands/add-storybook.d.ts.map +1 -0
  16. package/dist/commands/add-storybook.js +181 -0
  17. package/dist/commands/add-storybook.js.map +1 -0
  18. package/dist/commands/doctor.d.ts +2 -0
  19. package/dist/commands/doctor.d.ts.map +1 -0
  20. package/dist/commands/doctor.js +230 -0
  21. package/dist/commands/doctor.js.map +1 -0
  22. package/dist/commands/init.d.ts +9 -0
  23. package/dist/commands/init.d.ts.map +1 -0
  24. package/dist/commands/init.js +505 -0
  25. package/dist/commands/init.js.map +1 -0
  26. package/dist/commands/list.d.ts +2 -0
  27. package/dist/commands/list.d.ts.map +1 -0
  28. package/dist/commands/list.js +130 -0
  29. package/dist/commands/list.js.map +1 -0
  30. package/dist/commands/publish.d.ts +8 -0
  31. package/dist/commands/publish.d.ts.map +1 -0
  32. package/dist/commands/publish.js +179 -0
  33. package/dist/commands/publish.js.map +1 -0
  34. package/dist/commands/remove-component.d.ts +5 -0
  35. package/dist/commands/remove-component.d.ts.map +1 -0
  36. package/dist/commands/remove-component.js +172 -0
  37. package/dist/commands/remove-component.js.map +1 -0
  38. package/dist/commands/update.d.ts +5 -0
  39. package/dist/commands/update.d.ts.map +1 -0
  40. package/dist/commands/update.js +126 -0
  41. package/dist/commands/update.js.map +1 -0
  42. package/dist/config.d.ts +14 -0
  43. package/dist/config.d.ts.map +1 -0
  44. package/dist/config.js +35 -0
  45. package/dist/config.js.map +1 -0
  46. package/dist/exec.d.ts +25 -0
  47. package/dist/exec.d.ts.map +1 -0
  48. package/dist/exec.js +80 -0
  49. package/dist/exec.js.map +1 -0
  50. package/dist/files.d.ts +7 -0
  51. package/dist/files.d.ts.map +1 -0
  52. package/dist/files.js +23 -0
  53. package/dist/files.js.map +1 -0
  54. package/dist/index.d.ts +3 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +85 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/ui.d.ts +44 -0
  59. package/dist/ui.d.ts.map +1 -0
  60. package/dist/ui.js +149 -0
  61. package/dist/ui.js.map +1 -0
  62. 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,2 @@
1
+ export declare function addComponentCommand(components: string[]): Promise<void>;
2
+ //# sourceMappingURL=add-component.d.ts.map
@@ -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"}