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
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import inquirer from "inquirer";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import { pathExists, writeFile } from "../files.js";
|
|
4
|
+
import { run, pmx, pmxArgs, detectPackageManager } from "../exec.js";
|
|
5
|
+
import { q, c, printSuccess, printError } from "../ui.js";
|
|
6
|
+
const ALL_SHADCN_COMPONENTS = [
|
|
7
|
+
"accordion", "alert", "alert-dialog", "aspect-ratio", "avatar",
|
|
8
|
+
"badge", "breadcrumb", "button", "calendar", "card", "carousel",
|
|
9
|
+
"chart", "checkbox", "collapsible", "command", "context-menu",
|
|
10
|
+
"dialog", "drawer", "dropdown-menu", "form", "hover-card",
|
|
11
|
+
"input", "input-otp", "label", "menubar", "navigation-menu",
|
|
12
|
+
"pagination", "popover", "progress", "radio-group", "resizable",
|
|
13
|
+
"scroll-area", "select", "separator", "sheet", "sidebar",
|
|
14
|
+
"skeleton", "slider", "sonner", "switch", "table", "tabs",
|
|
15
|
+
"textarea", "toast", "toggle", "toggle-group", "tooltip",
|
|
16
|
+
];
|
|
17
|
+
export async function addComponentCommand(components) {
|
|
18
|
+
const uiPkgDir = await detectUiPackageDir();
|
|
19
|
+
if (!uiPkgDir) {
|
|
20
|
+
printError({
|
|
21
|
+
title: "UI package not found",
|
|
22
|
+
detail: "Run from the monorepo root or packages/ui directory.",
|
|
23
|
+
recovery: [
|
|
24
|
+
{ label: "From monorepo root:", cmd: "nx-shadcn add-component button" },
|
|
25
|
+
{ label: "Or from the UI package:", cmd: "cd packages/ui && nx-shadcn add-component button" },
|
|
26
|
+
],
|
|
27
|
+
});
|
|
28
|
+
process.exit(1);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
let selectedComponents = components;
|
|
32
|
+
if (selectedComponents.length === 0) {
|
|
33
|
+
const answers = await inquirer.prompt({
|
|
34
|
+
type: "checkbox",
|
|
35
|
+
name: "components",
|
|
36
|
+
message: q("Which shadcn components do you want to add?", "space to toggle · enter to confirm"),
|
|
37
|
+
choices: ALL_SHADCN_COMPONENTS,
|
|
38
|
+
validate: (v) => v.length > 0 || c.red("Select at least one component"),
|
|
39
|
+
});
|
|
40
|
+
selectedComponents = answers.components;
|
|
41
|
+
}
|
|
42
|
+
const pm = (await detectPackageManager()) ?? "npm";
|
|
43
|
+
const pkgName = path.basename(uiPkgDir);
|
|
44
|
+
console.log(`\n ${c.dim("─".repeat(36))}`);
|
|
45
|
+
console.log(` ${c.dim(`Adding to @workspace/${pkgName}: ${selectedComponents.join(", ")}`)}`);
|
|
46
|
+
console.log(` ${c.dim("─".repeat(36))}\n`);
|
|
47
|
+
try {
|
|
48
|
+
await run(pmx(pm), pmxArgs(pm, "shadcn@latest", ["add", "--yes", ...selectedComponents]), { cwd: uiPkgDir });
|
|
49
|
+
await updateBarrelExports(uiPkgDir, selectedComponents);
|
|
50
|
+
const importLine = `import { ${selectedComponents.map(toComponentName).join(", ")} } from "@workspace/${pkgName}";`;
|
|
51
|
+
printSuccess({
|
|
52
|
+
title: `${selectedComponents.length} component${selectedComponents.length > 1 ? "s" : ""} added`,
|
|
53
|
+
commands: [{ cmd: importLine, comment: "use in any app" }],
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
printError({
|
|
58
|
+
title: "Failed to add components",
|
|
59
|
+
detail: String(err).split("\n")[0],
|
|
60
|
+
recovery: selectedComponents.map((comp) => ({
|
|
61
|
+
label: "",
|
|
62
|
+
cmd: `${pmx(pm)} ${pmxArgs(pm, "shadcn@latest", ["add", comp]).join(" ")}`,
|
|
63
|
+
})),
|
|
64
|
+
});
|
|
65
|
+
process.exit(1);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
async function detectUiPackageDir() {
|
|
70
|
+
if (await pathExists(path.join(process.cwd(), "components.json"))) {
|
|
71
|
+
return process.cwd();
|
|
72
|
+
}
|
|
73
|
+
const packagesDir = path.join(process.cwd(), "packages");
|
|
74
|
+
if (await pathExists(packagesDir)) {
|
|
75
|
+
const { default: fs } = await import("fs-extra");
|
|
76
|
+
const dirs = await fs.readdir(packagesDir);
|
|
77
|
+
for (const d of dirs) {
|
|
78
|
+
const candidate = path.join(packagesDir, d);
|
|
79
|
+
if (await pathExists(path.join(candidate, "components.json"))) {
|
|
80
|
+
return candidate;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
async function updateBarrelExports(uiPkgDir, components) {
|
|
87
|
+
const indexPath = path.join(uiPkgDir, "src/index.ts");
|
|
88
|
+
const { default: fs } = await import("fs-extra");
|
|
89
|
+
let existing = "";
|
|
90
|
+
if (await pathExists(indexPath)) {
|
|
91
|
+
existing = await fs.readFile(indexPath, "utf-8");
|
|
92
|
+
}
|
|
93
|
+
const newExports = components
|
|
94
|
+
.filter((comp) => !existing.includes(`./components/ui/${comp}`))
|
|
95
|
+
.map((comp) => `export * from "./components/ui/${comp}";`)
|
|
96
|
+
.join("\n");
|
|
97
|
+
if (newExports) {
|
|
98
|
+
if (existing && !existing.endsWith("\n"))
|
|
99
|
+
existing += "\n";
|
|
100
|
+
await writeFile(indexPath, existing + newExports + "\n");
|
|
101
|
+
console.log(` ${c.dim("✓")} ${c.dim("barrel exports updated in src/index.ts")}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
function toComponentName(kebab) {
|
|
105
|
+
return kebab
|
|
106
|
+
.split("-")
|
|
107
|
+
.map((p) => p.charAt(0).toUpperCase() + p.slice(1))
|
|
108
|
+
.join("");
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=add-component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-component.js","sourceRoot":"","sources":["../../commands/add-component.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-lib.d.ts","sourceRoot":"","sources":["../../commands/add-lib.ts"],"names":[],"mappings":"AAUA,UAAU,aAAa;IACrB,IAAI,CAAC,EAAK,MAAM,CAAC;IACjB,IAAI,CAAC,EAAK,MAAM,CAAC;IACjB,GAAG,CAAC,EAAM,OAAO,CAAC;IAClB,MAAM,CAAC,EAAG,OAAO,CAAC;CACnB;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA4JzE"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import inquirer from "inquirer";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import { pathExists, writeJson, writeFile, ensureDir } from "../files.js";
|
|
4
|
+
import { loadConfig } from "../config.js";
|
|
5
|
+
import { detectPackageManager } from "../exec.js";
|
|
6
|
+
import { c, q, detected, createStepRunner, printSection, printSuccess, printError } from "../ui.js";
|
|
7
|
+
const LIB_TYPES = ["utils", "hooks", "config", "types", "api"];
|
|
8
|
+
export async function addLibCommand(options) {
|
|
9
|
+
// Verify monorepo root
|
|
10
|
+
if (!(await pathExists(path.join(process.cwd(), "package.json")))) {
|
|
11
|
+
printError({
|
|
12
|
+
title: "No package.json found",
|
|
13
|
+
detail: "Run this command from the monorepo root.",
|
|
14
|
+
recovery: [{ label: "", cmd: "cd <monorepo-root> && nx-shadcn add-lib" }],
|
|
15
|
+
});
|
|
16
|
+
process.exit(1);
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
const cfg = await loadConfig();
|
|
20
|
+
const detectedPm = await detectPackageManager();
|
|
21
|
+
const defaults = {
|
|
22
|
+
libName: options.name ?? "shared",
|
|
23
|
+
libType: (options.type ?? "utils"),
|
|
24
|
+
pm: detectedPm ?? cfg?.pkgManager ?? "pnpm",
|
|
25
|
+
};
|
|
26
|
+
const answers = options.yes
|
|
27
|
+
? defaults
|
|
28
|
+
: await inquirer.prompt([
|
|
29
|
+
{
|
|
30
|
+
type: "input",
|
|
31
|
+
name: "libName",
|
|
32
|
+
message: q("Library name", "lives at packages/<n>"),
|
|
33
|
+
default: defaults.libName,
|
|
34
|
+
validate: (v) => /^[a-z0-9-]+$/.test(v) || c.red("Only lowercase letters, numbers, and dashes"),
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
type: "list",
|
|
38
|
+
name: "libType",
|
|
39
|
+
message: q("Library type", "determines the initial file structure"),
|
|
40
|
+
choices: [
|
|
41
|
+
{ name: "utils — shared helper functions", value: "utils" },
|
|
42
|
+
{ name: "hooks — shared React hooks", value: "hooks" },
|
|
43
|
+
{ name: "config — shared config / constants", value: "config" },
|
|
44
|
+
{ name: "types — shared TypeScript types", value: "types" },
|
|
45
|
+
{ name: "api — shared API client / fetchers", value: "api" },
|
|
46
|
+
],
|
|
47
|
+
default: defaults.libType,
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
type: "list",
|
|
51
|
+
name: "pm",
|
|
52
|
+
message: q("Package manager"),
|
|
53
|
+
choices: ["pnpm", "npm", "yarn", "bun"],
|
|
54
|
+
default: detectedPm ? detected(detectedPm) : defaults.pm,
|
|
55
|
+
when: !detectedPm,
|
|
56
|
+
},
|
|
57
|
+
]);
|
|
58
|
+
const libName = (answers.libName ?? defaults.libName);
|
|
59
|
+
const libType = (answers.libType ?? defaults.libType);
|
|
60
|
+
const pm = (answers.pm ?? detectedPm ?? cfg?.pkgManager ?? "pnpm");
|
|
61
|
+
const libDir = path.join(process.cwd(), "packages", libName);
|
|
62
|
+
if (await pathExists(libDir)) {
|
|
63
|
+
printError({
|
|
64
|
+
title: `packages/${libName} already exists`,
|
|
65
|
+
recovery: [{ label: "Choose a different name:", cmd: `nx-shadcn add-lib --name ${libName}-2` }],
|
|
66
|
+
});
|
|
67
|
+
process.exit(1);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
printSection(`${options.dryRun ? "[dry run] " : ""}Creating packages/${libName}`);
|
|
71
|
+
const step = createStepRunner(3, options.dryRun);
|
|
72
|
+
await step("Scaffold package structure", async () => {
|
|
73
|
+
await ensureDir(path.join(libDir, "src"));
|
|
74
|
+
await writeJson(path.join(libDir, "package.json"), {
|
|
75
|
+
name: `@workspace/${libName}`,
|
|
76
|
+
version: "0.0.1",
|
|
77
|
+
private: true,
|
|
78
|
+
type: "module",
|
|
79
|
+
exports: {
|
|
80
|
+
".": {
|
|
81
|
+
import: "./dist/index.js",
|
|
82
|
+
types: "./dist/index.d.ts",
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
main: "./dist/index.js",
|
|
86
|
+
types: "./dist/index.d.ts",
|
|
87
|
+
scripts: {
|
|
88
|
+
build: "tsup",
|
|
89
|
+
"build:watch": "tsup --watch",
|
|
90
|
+
},
|
|
91
|
+
devDependencies: {
|
|
92
|
+
tsup: "^8.3.0",
|
|
93
|
+
typescript: "^5.6.0",
|
|
94
|
+
},
|
|
95
|
+
});
|
|
96
|
+
await writeJson(path.join(libDir, "tsconfig.json"), {
|
|
97
|
+
compilerOptions: {
|
|
98
|
+
target: "ES2022",
|
|
99
|
+
module: "ESNext",
|
|
100
|
+
moduleResolution: "bundler",
|
|
101
|
+
strict: true,
|
|
102
|
+
declaration: true,
|
|
103
|
+
declarationMap: true,
|
|
104
|
+
sourceMap: true,
|
|
105
|
+
esModuleInterop: true,
|
|
106
|
+
skipLibCheck: true,
|
|
107
|
+
outDir: "dist",
|
|
108
|
+
rootDir: "src",
|
|
109
|
+
},
|
|
110
|
+
include: ["src"],
|
|
111
|
+
exclude: ["node_modules", "dist"],
|
|
112
|
+
});
|
|
113
|
+
await writeFile(path.join(libDir, "tsup.config.ts"), `import { defineConfig } from "tsup";
|
|
114
|
+
|
|
115
|
+
export default defineConfig({
|
|
116
|
+
entry: ["src/index.ts"],
|
|
117
|
+
format: ["esm"],
|
|
118
|
+
dts: true,
|
|
119
|
+
sourcemap: true,
|
|
120
|
+
clean: true,
|
|
121
|
+
treeshake: true,
|
|
122
|
+
});
|
|
123
|
+
`);
|
|
124
|
+
// Seed index.ts based on lib type
|
|
125
|
+
await writeFile(path.join(libDir, "src/index.ts"), getIndexContent(libName, libType));
|
|
126
|
+
});
|
|
127
|
+
await step(`Add @workspace/${libName} to workspace`, async () => {
|
|
128
|
+
// For pnpm: pnpm-workspace.yaml is already written by init.
|
|
129
|
+
// For npm: the workspaces field in root package.json covers packages/*.
|
|
130
|
+
// Nothing extra to do — the new directory is picked up automatically.
|
|
131
|
+
void pm; // referenced to avoid unused-var warning
|
|
132
|
+
});
|
|
133
|
+
await step("Done", async () => { });
|
|
134
|
+
printSuccess({
|
|
135
|
+
title: `packages/${libName} created`,
|
|
136
|
+
commands: [
|
|
137
|
+
{ cmd: `import { ... } from "@workspace/${libName}";`, comment: "use in any app" },
|
|
138
|
+
{ cmd: `pnpm nx build @workspace/${libName}`, comment: "build the package" },
|
|
139
|
+
],
|
|
140
|
+
tips: [
|
|
141
|
+
{ label: "Add to an app's dependencies:", cmd: `"@workspace/${libName}": "${pm === "npm" ? "*" : "workspace:*"}"` },
|
|
142
|
+
],
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
function getIndexContent(name, type) {
|
|
146
|
+
switch (type) {
|
|
147
|
+
case "utils":
|
|
148
|
+
return `// @workspace/${name} — shared utility functions
|
|
149
|
+
|
|
150
|
+
export function noop(): void {}
|
|
151
|
+
|
|
152
|
+
export function sleep(ms: number): Promise<void> {
|
|
153
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
154
|
+
}
|
|
155
|
+
`;
|
|
156
|
+
case "hooks":
|
|
157
|
+
return `// @workspace/${name} — shared React hooks
|
|
158
|
+
// Note: add react as a peerDependency if you use hooks
|
|
159
|
+
|
|
160
|
+
export function useNoop(): void {}
|
|
161
|
+
`;
|
|
162
|
+
case "config":
|
|
163
|
+
return `// @workspace/${name} — shared configuration
|
|
164
|
+
|
|
165
|
+
export const config = {
|
|
166
|
+
env: process.env.NODE_ENV ?? "development",
|
|
167
|
+
} as const;
|
|
168
|
+
`;
|
|
169
|
+
case "types":
|
|
170
|
+
return `// @workspace/${name} — shared TypeScript types
|
|
171
|
+
|
|
172
|
+
export type ID = string;
|
|
173
|
+
|
|
174
|
+
export interface Timestamps {
|
|
175
|
+
createdAt: Date;
|
|
176
|
+
updatedAt: Date;
|
|
177
|
+
}
|
|
178
|
+
`;
|
|
179
|
+
case "api":
|
|
180
|
+
return `// @workspace/${name} — shared API client
|
|
181
|
+
|
|
182
|
+
export async function apiFetch<T>(url: string, init?: RequestInit): Promise<T> {
|
|
183
|
+
const res = await fetch(url, init);
|
|
184
|
+
if (!res.ok) throw new Error(\`HTTP \${res.status}: \${url}\`);
|
|
185
|
+
return res.json() as Promise<T>;
|
|
186
|
+
}
|
|
187
|
+
`;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=add-lib.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-lib.js","sourceRoot":"","sources":["../../commands/add-lib.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-storybook.d.ts","sourceRoot":"","sources":["../../commands/add-storybook.ts"],"names":[],"mappings":"AAMA,UAAU,mBAAmB;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsJrF"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import { pathExists, writeFile, ensureDir } from "../files.js";
|
|
3
|
+
import { loadConfig } from "../config.js";
|
|
4
|
+
import { run, pmAdd, detectPackageManager } from "../exec.js";
|
|
5
|
+
import { createStepRunner, printSection, printSuccess, printError, printWarn } from "../ui.js";
|
|
6
|
+
export async function addStorybookCommand(options) {
|
|
7
|
+
const cfg = await loadConfig();
|
|
8
|
+
const uiPkgDir = await detectUiPackageDir(cfg?.uiPackage);
|
|
9
|
+
if (!uiPkgDir) {
|
|
10
|
+
printError({
|
|
11
|
+
title: "UI package not found",
|
|
12
|
+
detail: "Run from the monorepo root.",
|
|
13
|
+
recovery: [{ label: "", cmd: "cd <monorepo-root> && nx-shadcn add-storybook" }],
|
|
14
|
+
});
|
|
15
|
+
process.exit(1);
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
// Check Storybook isn't already present
|
|
19
|
+
const storybookDir = path.join(uiPkgDir, ".storybook");
|
|
20
|
+
if (await pathExists(storybookDir)) {
|
|
21
|
+
printWarn("Storybook already configured", `Found .storybook/ in packages/${cfg?.uiPackage ?? "ui"}`);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const pm = (await detectPackageManager()) ?? cfg?.pkgManager ?? "pnpm";
|
|
25
|
+
const pkgName = cfg?.uiPackage ?? path.basename(uiPkgDir);
|
|
26
|
+
const installed = await getInstalledComponents(uiPkgDir);
|
|
27
|
+
printSection(`${options.dryRun ? "[dry run] " : ""}Adding Storybook to packages/${pkgName}`);
|
|
28
|
+
const step = createStepRunner(4, options.dryRun);
|
|
29
|
+
await step("Install Storybook deps", async () => {
|
|
30
|
+
await run(pm, [
|
|
31
|
+
pmAdd(pm), "--save-dev",
|
|
32
|
+
"@storybook/react-vite",
|
|
33
|
+
"@storybook/react",
|
|
34
|
+
"@storybook/addon-essentials",
|
|
35
|
+
"@storybook/addon-a11y",
|
|
36
|
+
"storybook",
|
|
37
|
+
], { cwd: uiPkgDir });
|
|
38
|
+
});
|
|
39
|
+
await step("Write .storybook config", async () => {
|
|
40
|
+
await ensureDir(storybookDir);
|
|
41
|
+
await writeFile(path.join(storybookDir, "main.ts"), `import type { StorybookConfig } from "@storybook/react-vite";
|
|
42
|
+
|
|
43
|
+
const config: StorybookConfig = {
|
|
44
|
+
stories: ["../src/**/*.stories.@(ts|tsx)"],
|
|
45
|
+
addons: [
|
|
46
|
+
"@storybook/addon-essentials",
|
|
47
|
+
"@storybook/addon-a11y",
|
|
48
|
+
],
|
|
49
|
+
framework: {
|
|
50
|
+
name: "@storybook/react-vite",
|
|
51
|
+
options: {},
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
export default config;
|
|
56
|
+
`);
|
|
57
|
+
await writeFile(path.join(storybookDir, "preview.ts"), `import type { Preview } from "@storybook/react";
|
|
58
|
+
import "../src/styles/globals.css";
|
|
59
|
+
|
|
60
|
+
const preview: Preview = {
|
|
61
|
+
parameters: {
|
|
62
|
+
controls: {
|
|
63
|
+
matchers: {
|
|
64
|
+
color: /(background|color)$/i,
|
|
65
|
+
date: /Date$/i,
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
export default preview;
|
|
72
|
+
`);
|
|
73
|
+
});
|
|
74
|
+
await step("Add storybook scripts to package.json", async () => {
|
|
75
|
+
const { default: fs } = await import("fs-extra");
|
|
76
|
+
const pkgJsonPath = path.join(uiPkgDir, "package.json");
|
|
77
|
+
const pkgJson = await fs.readJson(pkgJsonPath);
|
|
78
|
+
pkgJson.scripts = {
|
|
79
|
+
...pkgJson.scripts,
|
|
80
|
+
storybook: "storybook dev --port 6006",
|
|
81
|
+
"build-storybook": "storybook build",
|
|
82
|
+
};
|
|
83
|
+
await fs.writeJson(pkgJsonPath, pkgJson, { spaces: 2 });
|
|
84
|
+
});
|
|
85
|
+
await step(`Generate ${installed.length} component stories`, async () => {
|
|
86
|
+
const storiesDir = path.join(uiPkgDir, "src/stories");
|
|
87
|
+
await ensureDir(storiesDir);
|
|
88
|
+
for (const comp of installed) {
|
|
89
|
+
const compName = toComponentName(comp);
|
|
90
|
+
const storyPath = path.join(storiesDir, `${compName}.stories.tsx`);
|
|
91
|
+
// Don't overwrite existing stories
|
|
92
|
+
if (await pathExists(storyPath))
|
|
93
|
+
continue;
|
|
94
|
+
await writeFile(storyPath, buildStory(compName, comp, pkgName));
|
|
95
|
+
}
|
|
96
|
+
// Write an index story if no components installed yet
|
|
97
|
+
if (installed.length === 0) {
|
|
98
|
+
await writeFile(path.join(storiesDir, "Welcome.stories.tsx"), `import type { Meta, StoryObj } from "@storybook/react";
|
|
99
|
+
|
|
100
|
+
const Welcome = () => (
|
|
101
|
+
<div style={{ padding: "2rem", fontFamily: "sans-serif" }}>
|
|
102
|
+
<h1>Welcome to @workspace/${pkgName}</h1>
|
|
103
|
+
<p>Add components with: <code>nx-shadcn add-component button</code></p>
|
|
104
|
+
</div>
|
|
105
|
+
);
|
|
106
|
+
|
|
107
|
+
const meta: Meta<typeof Welcome> = {
|
|
108
|
+
title: "Welcome",
|
|
109
|
+
component: Welcome,
|
|
110
|
+
};
|
|
111
|
+
export default meta;
|
|
112
|
+
type Story = StoryObj<typeof Welcome>;
|
|
113
|
+
|
|
114
|
+
export const Default: Story = {};
|
|
115
|
+
`);
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
printSuccess({
|
|
119
|
+
title: `Storybook added to packages/${pkgName}`,
|
|
120
|
+
commands: [
|
|
121
|
+
{ cmd: `${pm} nx run ${pkgName}:storybook`, comment: "start Storybook on :6006" },
|
|
122
|
+
{ cmd: `${pm} nx run ${pkgName}:build-storybook`, comment: "build static output" },
|
|
123
|
+
],
|
|
124
|
+
tips: [
|
|
125
|
+
{ label: "Stories live at:", cmd: `packages/${pkgName}/src/stories/` },
|
|
126
|
+
],
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
// ─── Story template ──────────────────────────────────────────────────────────
|
|
130
|
+
function buildStory(compName, compSlug, pkgName) {
|
|
131
|
+
// Simple stories work for all components; complex ones (e.g. Dialog) would
|
|
132
|
+
// need customisation — we generate a useful default that compiles cleanly.
|
|
133
|
+
return `import type { Meta, StoryObj } from "@storybook/react";
|
|
134
|
+
import { ${compName} } from "@workspace/${pkgName}";
|
|
135
|
+
|
|
136
|
+
const meta: Meta<typeof ${compName}> = {
|
|
137
|
+
title: "ui/${compName}",
|
|
138
|
+
component: ${compName},
|
|
139
|
+
tags: ["autodocs"],
|
|
140
|
+
};
|
|
141
|
+
export default meta;
|
|
142
|
+
type Story = StoryObj<typeof ${compName}>;
|
|
143
|
+
|
|
144
|
+
export const Default: Story = {};
|
|
145
|
+
`;
|
|
146
|
+
}
|
|
147
|
+
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
148
|
+
async function getInstalledComponents(uiPkgDir) {
|
|
149
|
+
const dir = path.join(uiPkgDir, "src/components/ui");
|
|
150
|
+
if (!(await pathExists(dir)))
|
|
151
|
+
return [];
|
|
152
|
+
const { default: fs } = await import("fs-extra");
|
|
153
|
+
const files = await fs.readdir(dir);
|
|
154
|
+
return files
|
|
155
|
+
.filter((f) => f.endsWith(".tsx") || f.endsWith(".ts"))
|
|
156
|
+
.map((f) => f.replace(/\.tsx?$/, ""))
|
|
157
|
+
.sort();
|
|
158
|
+
}
|
|
159
|
+
async function detectUiPackageDir(uiPackage) {
|
|
160
|
+
const base = uiPackage ?? "ui";
|
|
161
|
+
const configured = path.join(process.cwd(), "packages", base);
|
|
162
|
+
if (await pathExists(path.join(configured, "components.json")))
|
|
163
|
+
return configured;
|
|
164
|
+
if (await pathExists(path.join(process.cwd(), "components.json")))
|
|
165
|
+
return process.cwd();
|
|
166
|
+
const packagesDir = path.join(process.cwd(), "packages");
|
|
167
|
+
if (await pathExists(packagesDir)) {
|
|
168
|
+
const { default: fs } = await import("fs-extra");
|
|
169
|
+
const dirs = await fs.readdir(packagesDir);
|
|
170
|
+
for (const d of dirs) {
|
|
171
|
+
const candidate = path.join(packagesDir, d);
|
|
172
|
+
if (await pathExists(path.join(candidate, "components.json")))
|
|
173
|
+
return candidate;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
function toComponentName(kebab) {
|
|
179
|
+
return kebab.split("-").map((p) => p.charAt(0).toUpperCase() + p.slice(1)).join("");
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=add-storybook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-storybook.js","sourceRoot":"","sources":["../../commands/add-storybook.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../commands/doctor.ts"],"names":[],"mappings":"AAWA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAgOnD"}
|