@microbuild/cli 0.1.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 (38) hide show
  1. package/README.md +555 -0
  2. package/dist/chunk-6YA3DSAE.js +362 -0
  3. package/dist/chunk-6YA3DSAE.js.map +1 -0
  4. package/dist/index.d.ts +1 -0
  5. package/dist/index.js +2279 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/outdated-TV5ERBNC.js +110 -0
  8. package/dist/outdated-TV5ERBNC.js.map +1 -0
  9. package/dist/templates/api/auth-callback-route.ts +36 -0
  10. package/dist/templates/api/auth-headers.ts +72 -0
  11. package/dist/templates/api/auth-login-route.ts +63 -0
  12. package/dist/templates/api/auth-logout-route.ts +41 -0
  13. package/dist/templates/api/auth-user-route.ts +71 -0
  14. package/dist/templates/api/fields-route.ts +44 -0
  15. package/dist/templates/api/files-id-route.ts +116 -0
  16. package/dist/templates/api/files-route.ts +83 -0
  17. package/dist/templates/api/items-id-route.ts +120 -0
  18. package/dist/templates/api/items-route.ts +88 -0
  19. package/dist/templates/api/login-page.tsx +142 -0
  20. package/dist/templates/api/relations-route.ts +46 -0
  21. package/dist/templates/app/design-tokens.css +183 -0
  22. package/dist/templates/app/globals.css +58 -0
  23. package/dist/templates/app/layout.tsx +49 -0
  24. package/dist/templates/app/page.tsx +23 -0
  25. package/dist/templates/components/ColorSchemeToggle.tsx +35 -0
  26. package/dist/templates/lib/common-utils.ts +156 -0
  27. package/dist/templates/lib/hooks/index.ts +98 -0
  28. package/dist/templates/lib/services/index.ts +26 -0
  29. package/dist/templates/lib/theme.ts +241 -0
  30. package/dist/templates/lib/types/index.ts +10 -0
  31. package/dist/templates/lib/utils-index.ts +32 -0
  32. package/dist/templates/lib/utils.ts +14 -0
  33. package/dist/templates/lib/vform/index.ts +24 -0
  34. package/dist/templates/middleware/middleware.ts +29 -0
  35. package/dist/templates/supabase/client.ts +25 -0
  36. package/dist/templates/supabase/middleware.ts +66 -0
  37. package/dist/templates/supabase/server.ts +45 -0
  38. package/package.json +61 -0
@@ -0,0 +1,362 @@
1
+ // src/resolver.ts
2
+ import fs from "fs-extra";
3
+ import path from "path";
4
+ import { fileURLToPath } from "url";
5
+ var __filename = fileURLToPath(import.meta.url);
6
+ var __dirname = path.dirname(__filename);
7
+ var DEFAULT_REGISTRY_URL = "https://raw.githubusercontent.com/microbuild-ui/ui/main/packages";
8
+ var REGISTRY_BASE_URL = process.env.MICROBUILD_REGISTRY_URL ?? DEFAULT_REGISTRY_URL;
9
+ var LOCAL_PACKAGES_ROOT = path.resolve(__dirname, "../..");
10
+ function isLocalMode() {
11
+ return fs.existsSync(path.join(LOCAL_PACKAGES_ROOT, "registry.json"));
12
+ }
13
+ var _registryCache = null;
14
+ async function getRegistry() {
15
+ if (_registryCache) return _registryCache;
16
+ if (isLocalMode()) {
17
+ const registryPath = path.join(LOCAL_PACKAGES_ROOT, "registry.json");
18
+ _registryCache = await fs.readJSON(registryPath);
19
+ } else {
20
+ const url = `${REGISTRY_BASE_URL}/registry.json`;
21
+ _registryCache = await fetchJSON(url);
22
+ }
23
+ return _registryCache;
24
+ }
25
+ async function resolveSourceFile(source) {
26
+ if (isLocalMode()) {
27
+ const fullPath = path.join(LOCAL_PACKAGES_ROOT, source);
28
+ if (!fs.existsSync(fullPath)) {
29
+ throw new Error(`Source file not found on disk: ${fullPath}`);
30
+ }
31
+ return fs.readFile(fullPath, "utf-8");
32
+ }
33
+ const url = `${REGISTRY_BASE_URL}/${source}`;
34
+ return fetchText(url);
35
+ }
36
+ async function sourceFileExists(source) {
37
+ if (isLocalMode()) {
38
+ return fs.existsSync(path.join(LOCAL_PACKAGES_ROOT, source));
39
+ }
40
+ return true;
41
+ }
42
+ function getTemplatesRoot() {
43
+ const builtTemplates = path.resolve(__dirname, "templates");
44
+ if (fs.existsSync(builtTemplates)) return builtTemplates;
45
+ const localTemplates = path.resolve(__dirname, "../templates");
46
+ if (fs.existsSync(localTemplates)) return localTemplates;
47
+ throw new Error(
48
+ "Templates directory not found. Ensure the CLI is built correctly."
49
+ );
50
+ }
51
+ async function fetchText(url) {
52
+ const res = await fetch(url);
53
+ if (!res.ok) {
54
+ throw new Error(
55
+ `Failed to fetch ${url}: ${res.status} ${res.statusText}`
56
+ );
57
+ }
58
+ return res.text();
59
+ }
60
+ async function fetchJSON(url) {
61
+ const text = await fetchText(url);
62
+ return JSON.parse(text);
63
+ }
64
+
65
+ // src/commands/init.ts
66
+ import fs2 from "fs-extra";
67
+ import path2 from "path";
68
+ import chalk from "chalk";
69
+ import ora from "ora";
70
+ import prompts from "prompts";
71
+ var DEFAULT_CONFIG = {
72
+ $schema: "https://microbuild.dev/schema.json",
73
+ model: "copy-own",
74
+ tsx: true,
75
+ srcDir: true,
76
+ aliases: {
77
+ components: "@/components/ui",
78
+ lib: "@/lib/microbuild"
79
+ },
80
+ installedLib: [],
81
+ installedComponents: [],
82
+ componentVersions: {},
83
+ registryVersion: "1.0.0"
84
+ };
85
+ var TEMPLATES_ROOT = getTemplatesRoot();
86
+ async function copyTemplateFile(sourceRelativePath, targetPath, cwd) {
87
+ const sourcePath = path2.join(TEMPLATES_ROOT, sourceRelativePath);
88
+ if (!fs2.existsSync(sourcePath) || fs2.existsSync(targetPath)) {
89
+ return;
90
+ }
91
+ await fs2.ensureDir(path2.dirname(targetPath));
92
+ await fs2.copy(sourcePath, targetPath);
93
+ console.log(chalk.green(`\u2713 Created ${path2.relative(cwd, targetPath)}`));
94
+ }
95
+ async function init(options) {
96
+ const { cwd, yes } = options;
97
+ console.log(chalk.bold("\n\u{1F680} Welcome to Microbuild!\n"));
98
+ console.log(chalk.dim("Copy & Own Model - Components become part of your codebase.\n"));
99
+ const configPath = path2.join(cwd, "microbuild.json");
100
+ if (fs2.existsSync(configPath) && !yes) {
101
+ const { overwrite } = await prompts({
102
+ type: "confirm",
103
+ name: "overwrite",
104
+ message: "microbuild.json already exists. Overwrite?",
105
+ initial: false
106
+ });
107
+ if (!overwrite) {
108
+ console.log(chalk.yellow("\n\u2713 Keeping existing configuration\n"));
109
+ return;
110
+ }
111
+ }
112
+ const packageJsonPath = path2.join(cwd, "package.json");
113
+ let projectType = "unknown";
114
+ let hasSrcDir = fs2.existsSync(path2.join(cwd, "src"));
115
+ if (fs2.existsSync(packageJsonPath)) {
116
+ const packageJson = await fs2.readJSON(packageJsonPath);
117
+ if (packageJson.dependencies?.["next"]) {
118
+ projectType = "next";
119
+ if (fs2.existsSync(path2.join(cwd, "app")) && !hasSrcDir) {
120
+ hasSrcDir = false;
121
+ }
122
+ } else if (packageJson.dependencies?.["vite"]) {
123
+ projectType = "vite";
124
+ } else if (packageJson.dependencies?.["react"]) {
125
+ projectType = "react";
126
+ }
127
+ } else {
128
+ console.log(chalk.yellow("\u26A0 No package.json found. Creating minimal Next.js project...\n"));
129
+ const projectName = path2.basename(cwd);
130
+ const minimalPackageJson = {
131
+ name: projectName,
132
+ version: "0.1.0",
133
+ private: true,
134
+ scripts: {
135
+ dev: "next dev --turbopack",
136
+ build: "next build",
137
+ start: "next start",
138
+ lint: "next lint"
139
+ },
140
+ dependencies: {
141
+ "next": "^15.0.0",
142
+ "react": "^19.0.0",
143
+ "react-dom": "^19.0.0",
144
+ "@mantine/core": "^8.0.0",
145
+ "@mantine/hooks": "^8.0.0",
146
+ "@tabler/icons-react": "^3.0.0",
147
+ "clsx": "^2.0.0",
148
+ "tailwind-merge": "^2.0.0"
149
+ },
150
+ devDependencies: {
151
+ "@types/node": "^20",
152
+ "@types/react": "^19",
153
+ "@types/react-dom": "^19",
154
+ "typescript": "^5"
155
+ }
156
+ };
157
+ await fs2.writeJSON(packageJsonPath, minimalPackageJson, { spaces: 2 });
158
+ projectType = "next";
159
+ hasSrcDir = false;
160
+ console.log(chalk.green("\u2713 Created package.json\n"));
161
+ }
162
+ console.log(chalk.dim(`Detected: ${projectType} project${hasSrcDir ? " with src directory" : ""}
163
+ `));
164
+ let config = { ...DEFAULT_CONFIG };
165
+ config.srcDir = hasSrcDir;
166
+ if (!yes) {
167
+ const answers = await prompts([
168
+ {
169
+ type: "confirm",
170
+ name: "srcDir",
171
+ message: "Use src directory?",
172
+ initial: hasSrcDir
173
+ },
174
+ {
175
+ type: "text",
176
+ name: "componentsPath",
177
+ message: "Where should components be installed?",
178
+ initial: "@/components/ui"
179
+ },
180
+ {
181
+ type: "text",
182
+ name: "libPath",
183
+ message: "Where should lib files (types, services, hooks) be installed?",
184
+ initial: "@/lib/microbuild"
185
+ },
186
+ {
187
+ type: "confirm",
188
+ name: "tsx",
189
+ message: "Use TypeScript?",
190
+ initial: true
191
+ }
192
+ ]);
193
+ config.srcDir = answers.srcDir ?? hasSrcDir;
194
+ config.aliases.components = answers.componentsPath || "@/components/ui";
195
+ config.aliases.lib = answers.libPath || "@/lib/microbuild";
196
+ config.tsx = answers.tsx ?? true;
197
+ }
198
+ const spinner = ora("Setting up Copy & Own structure...").start();
199
+ try {
200
+ await fs2.writeJSON(configPath, config, { spaces: 2 });
201
+ spinner.succeed("Created microbuild.json");
202
+ const componentsDir = resolveAlias(config.aliases.components, cwd, config.srcDir);
203
+ await fs2.ensureDir(componentsDir);
204
+ console.log(chalk.green(`\u2713 Created ${path2.relative(cwd, componentsDir)}`));
205
+ const libDir = resolveAlias(config.aliases.lib, cwd, config.srcDir);
206
+ await fs2.ensureDir(libDir);
207
+ await fs2.ensureDir(path2.join(libDir, "types"));
208
+ await fs2.ensureDir(path2.join(libDir, "services"));
209
+ await fs2.ensureDir(path2.join(libDir, "hooks"));
210
+ console.log(chalk.green(`\u2713 Created ${path2.relative(cwd, libDir)}`));
211
+ console.log(chalk.dim(" \u2514\u2500\u2500 types/"));
212
+ console.log(chalk.dim(" \u2514\u2500\u2500 services/"));
213
+ console.log(chalk.dim(" \u2514\u2500\u2500 hooks/"));
214
+ const tsconfigPath = path2.join(cwd, "tsconfig.json");
215
+ if (!fs2.existsSync(tsconfigPath) && config.tsx) {
216
+ const tsconfig = {
217
+ compilerOptions: {
218
+ target: "ES2017",
219
+ lib: ["dom", "dom.iterable", "esnext"],
220
+ allowJs: true,
221
+ skipLibCheck: true,
222
+ strict: true,
223
+ noEmit: true,
224
+ esModuleInterop: true,
225
+ module: "esnext",
226
+ moduleResolution: "bundler",
227
+ resolveJsonModule: true,
228
+ isolatedModules: true,
229
+ jsx: "preserve",
230
+ incremental: true,
231
+ plugins: [{ name: "next" }],
232
+ paths: {
233
+ "@/*": [config.srcDir ? "./src/*" : "./*"]
234
+ },
235
+ baseUrl: "."
236
+ },
237
+ include: ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
238
+ exclude: ["node_modules"]
239
+ };
240
+ await fs2.writeJSON(tsconfigPath, tsconfig, { spaces: 2 });
241
+ console.log(chalk.green(`\u2713 Created tsconfig.json with @/ path alias`));
242
+ }
243
+ const nextEnvPath = path2.join(cwd, "next-env.d.ts");
244
+ if (!fs2.existsSync(nextEnvPath) && projectType === "next") {
245
+ const nextEnvContent = `/// <reference types="next" />
246
+ /// <reference types="next/image-types/global" />
247
+
248
+ // NOTE: This file should not be edited
249
+ // see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
250
+ `;
251
+ await fs2.writeFile(nextEnvPath, nextEnvContent);
252
+ console.log(chalk.green(`\u2713 Created next-env.d.ts`));
253
+ }
254
+ if (projectType === "next") {
255
+ const srcRoot = config.srcDir ? path2.join(cwd, "src") : cwd;
256
+ const appDir = path2.join(srcRoot, "app");
257
+ const libRoot = path2.join(srcRoot, "lib");
258
+ const componentsRoot = path2.join(srcRoot, "components");
259
+ await fs2.ensureDir(appDir);
260
+ await fs2.ensureDir(libRoot);
261
+ await fs2.ensureDir(componentsRoot);
262
+ await copyTemplateFile("app/design-tokens.css", path2.join(appDir, "design-tokens.css"), cwd);
263
+ await copyTemplateFile("app/globals.css", path2.join(appDir, "globals.css"), cwd);
264
+ await copyTemplateFile("app/layout.tsx", path2.join(appDir, "layout.tsx"), cwd);
265
+ await copyTemplateFile("app/page.tsx", path2.join(appDir, "page.tsx"), cwd);
266
+ await copyTemplateFile("lib/theme.ts", path2.join(libRoot, "theme.ts"), cwd);
267
+ await copyTemplateFile(
268
+ "components/ColorSchemeToggle.tsx",
269
+ path2.join(componentsRoot, "ColorSchemeToggle.tsx"),
270
+ cwd
271
+ );
272
+ }
273
+ console.log(chalk.bold("\n\u{1F4E6} Checking dependencies...\n"));
274
+ const coreDeps = [
275
+ "@mantine/core",
276
+ "@mantine/hooks",
277
+ "react",
278
+ "react-dom"
279
+ ];
280
+ const utilityDeps = ["clsx", "tailwind-merge"];
281
+ const missingDeps = [];
282
+ const missingUtilDeps = [];
283
+ if (fs2.existsSync(packageJsonPath)) {
284
+ const packageJson = await fs2.readJSON(packageJsonPath);
285
+ const allDeps = {
286
+ ...packageJson.dependencies,
287
+ ...packageJson.devDependencies
288
+ };
289
+ for (const dep of coreDeps) {
290
+ if (!allDeps[dep]) {
291
+ missingDeps.push(dep);
292
+ }
293
+ }
294
+ for (const dep of utilityDeps) {
295
+ if (!allDeps[dep]) {
296
+ missingUtilDeps.push(dep);
297
+ }
298
+ }
299
+ }
300
+ if (missingDeps.length > 0) {
301
+ console.log(chalk.yellow("\u26A0 Missing core dependencies:"));
302
+ missingDeps.forEach((dep) => console.log(chalk.dim(` - ${dep}`)));
303
+ console.log(chalk.dim("\nInstall with:"));
304
+ console.log(chalk.cyan(` pnpm add ${missingDeps.join(" ")}
305
+ `));
306
+ } else {
307
+ console.log(chalk.green("\u2713 Core dependencies installed\n"));
308
+ }
309
+ if (missingUtilDeps.length > 0) {
310
+ console.log(chalk.dim("Optional utility dependencies for cn() helper:"));
311
+ console.log(chalk.cyan(` pnpm add ${missingUtilDeps.join(" ")}
312
+ `));
313
+ }
314
+ console.log(chalk.bold.blue("\u{1F4CB} Copy & Own Benefits:\n"));
315
+ console.log(" \u2705 No external package dependencies for component code");
316
+ console.log(" \u2705 Full customization - components are your application code");
317
+ console.log(" \u2705 No breaking changes from upstream updates");
318
+ console.log(" \u2705 Bundle only what you use - tree-shaking friendly");
319
+ console.log(" \u2705 Works offline after installation");
320
+ console.log(chalk.bold.green("\n\u2728 Setup complete!\n"));
321
+ console.log("Next steps:");
322
+ console.log(chalk.cyan(" 1. Add components: ") + chalk.dim("npx microbuild add input select-dropdown"));
323
+ console.log(chalk.cyan(" 2. List components: ") + chalk.dim("npx microbuild list"));
324
+ console.log(chalk.cyan(" 3. Add all basics: ") + chalk.dim("npx microbuild add --category input"));
325
+ console.log(chalk.dim("\nComponents will be copied with all dependencies inlined.\n"));
326
+ } catch (error) {
327
+ spinner.fail("Failed to initialize");
328
+ console.error(chalk.red(error));
329
+ process.exit(1);
330
+ }
331
+ }
332
+ function resolveAlias(alias, cwd, srcDir = true) {
333
+ if (alias.startsWith("@/")) {
334
+ const relativePath = alias.slice(2);
335
+ if (srcDir) {
336
+ return path2.join(cwd, "src", relativePath);
337
+ }
338
+ return path2.join(cwd, relativePath);
339
+ }
340
+ return path2.join(cwd, alias);
341
+ }
342
+ async function loadConfig(cwd) {
343
+ const configPath = path2.join(cwd, "microbuild.json");
344
+ if (!fs2.existsSync(configPath)) {
345
+ return null;
346
+ }
347
+ return await fs2.readJSON(configPath);
348
+ }
349
+ async function saveConfig(cwd, config) {
350
+ const configPath = path2.join(cwd, "microbuild.json");
351
+ await fs2.writeJSON(configPath, config, { spaces: 2 });
352
+ }
353
+
354
+ export {
355
+ getRegistry,
356
+ resolveSourceFile,
357
+ sourceFileExists,
358
+ init,
359
+ loadConfig,
360
+ saveConfig
361
+ };
362
+ //# sourceMappingURL=chunk-6YA3DSAE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/resolver.ts","../src/commands/init.ts"],"sourcesContent":["/**\n * Remote/Local Source Resolver\n *\n * Abstracts file fetching so the CLI works in two modes:\n *\n * 1. **Remote mode** (default when installed via npm / npx)\n * Fetches registry.json and component source files from the GitHub raw CDN.\n *\n * 2. **Local mode** (when running from the monorepo checkout)\n * Reads files directly from the `packages/` directory on disk.\n *\n * The mode is determined automatically:\n * - If `PACKAGES_ROOT/registry.json` exists on disk → local mode\n * - Otherwise → remote mode (uses REGISTRY_BASE_URL)\n */\n\nimport fs from 'fs-extra';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\n// ─── Configuration ───────────────────────────────────────────────\n\n/**\n * Base URL for fetching files remotely.\n * Points to the raw GitHub content of the `main` branch.\n *\n * Override at runtime with the `MICROBUILD_REGISTRY_URL` env var.\n *\n * ⚠️ REPLACE the placeholder below with your actual GitHub org/repo.\n */\nconst DEFAULT_REGISTRY_URL =\n 'https://raw.githubusercontent.com/microbuild-ui/ui/main/packages';\n\n/**\n * Runtime-configurable registry URL.\n */\nexport const REGISTRY_BASE_URL =\n process.env.MICROBUILD_REGISTRY_URL ?? DEFAULT_REGISTRY_URL;\n\n// Local packages root (only valid when running from monorepo)\n// From dist/index.js → packages/cli/dist → needs ../../ to reach packages/\nconst LOCAL_PACKAGES_ROOT = path.resolve(__dirname, '../..');\n\n/**\n * Detect whether we are running locally inside the monorepo.\n */\nfunction isLocalMode(): boolean {\n return fs.existsSync(path.join(LOCAL_PACKAGES_ROOT, 'registry.json'));\n}\n\n// ─── Public API ──────────────────────────────────────────────────\n\nexport interface Registry {\n version: string;\n name: string;\n lib: Record<string, LibModule>;\n components: ComponentEntry[];\n categories: Array<{ name: string; title: string; description: string }>;\n dependencies?: Record<string, string[]>;\n aliases?: Record<string, string>;\n meta?: Record<string, unknown>;\n}\n\nexport interface FileMapping {\n source: string;\n target: string;\n}\n\nexport interface LibModule {\n name: string;\n description: string;\n files?: FileMapping[];\n path?: string;\n target?: string;\n internalDependencies?: string[];\n}\n\nexport interface ComponentEntry {\n name: string;\n title: string;\n description: string;\n category: string;\n files: FileMapping[];\n dependencies: string[];\n internalDependencies: string[];\n registryDependencies?: string[];\n}\n\n// In-memory cache so we fetch registry.json at most once per CLI invocation\nlet _registryCache: Registry | null = null;\n\n/**\n * Load registry.json (local or remote).\n */\nexport async function getRegistry(): Promise<Registry> {\n if (_registryCache) return _registryCache;\n\n if (isLocalMode()) {\n const registryPath = path.join(LOCAL_PACKAGES_ROOT, 'registry.json');\n _registryCache = await fs.readJSON(registryPath) as Registry;\n } else {\n const url = `${REGISTRY_BASE_URL}/registry.json`;\n _registryCache = await fetchJSON<Registry>(url);\n }\n\n return _registryCache;\n}\n\n/**\n * Read a source file referenced in registry.json.\n *\n * @param source – the `source` field from a FileMapping, e.g. `\"types/src/core.ts\"`\n * @returns the file content as a UTF-8 string\n */\nexport async function resolveSourceFile(source: string): Promise<string> {\n if (isLocalMode()) {\n const fullPath = path.join(LOCAL_PACKAGES_ROOT, source);\n if (!fs.existsSync(fullPath)) {\n throw new Error(`Source file not found on disk: ${fullPath}`);\n }\n return fs.readFile(fullPath, 'utf-8');\n }\n\n // Remote mode\n const url = `${REGISTRY_BASE_URL}/${source}`;\n return fetchText(url);\n}\n\n/**\n * Check whether a source file exists.\n * In remote mode we optimistically return `true` (the registry is the manifest).\n */\nexport async function sourceFileExists(source: string): Promise<boolean> {\n if (isLocalMode()) {\n return fs.existsSync(path.join(LOCAL_PACKAGES_ROOT, source));\n }\n // In remote mode, trust the registry – the file should exist.\n return true;\n}\n\n/**\n * Resolve a template file (used by `init` command).\n * Templates are bundled inside the CLI package under `dist/templates/`.\n * When running locally they live in `packages/cli/templates/`.\n */\nexport function getTemplatesRoot(): string {\n // When built, templates are copied into dist/templates by tsup copy plugin\n const builtTemplates = path.resolve(__dirname, 'templates');\n if (fs.existsSync(builtTemplates)) return builtTemplates;\n\n // Fallback: running locally from source\n const localTemplates = path.resolve(__dirname, '../templates');\n if (fs.existsSync(localTemplates)) return localTemplates;\n\n throw new Error(\n 'Templates directory not found. Ensure the CLI is built correctly.'\n );\n}\n\n/**\n * Return the local PACKAGES_ROOT (only meaningful in local mode).\n * Falls back gracefully so remote-mode callers don't break.\n */\nexport function getLocalPackagesRoot(): string {\n return LOCAL_PACKAGES_ROOT;\n}\n\n// ─── HTTP helpers ────────────────────────────────────────────────\n\nasync function fetchText(url: string): Promise<string> {\n const res = await fetch(url);\n if (!res.ok) {\n throw new Error(\n `Failed to fetch ${url}: ${res.status} ${res.statusText}`\n );\n }\n return res.text();\n}\n\nasync function fetchJSON<T>(url: string): Promise<T> {\n const text = await fetchText(url);\n return JSON.parse(text) as T;\n}\n","import fs from 'fs-extra';\nimport path from 'path';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport prompts from 'prompts';\nimport { getTemplatesRoot } from '../resolver.js';\n\n/**\n * Component version info for tracking updates\n */\nexport interface ComponentVersion {\n /** Registry version when installed */\n version: string;\n /** Installation timestamp */\n installedAt: string;\n /** Source package (e.g., @microbuild/ui-interfaces) */\n source: string;\n}\n\n/**\n * Microbuild Configuration File\n * \n * Copy & Own Model:\n * - Components are copied to your project as source files\n * - No runtime dependency on @microbuild/* packages\n * - Full customization - you own the code\n * - Works offline after installation\n */\nexport interface Config {\n $schema?: string;\n /** Distribution model - always 'copy-own' */\n model: 'copy-own';\n /** Use TypeScript (.tsx) or JavaScript (.jsx) */\n tsx: boolean;\n /** Use 'src' directory structure */\n srcDir: boolean;\n /** Path aliases for generated files */\n aliases: {\n /** Where UI components are copied (e.g., @/components/ui) */\n components: string;\n /** Where lib files are copied (e.g., @/lib/microbuild) */\n lib: string;\n };\n /** Installed lib modules */\n installedLib: string[];\n /** Installed components */\n installedComponents: string[];\n /** Component version tracking for update detection */\n componentVersions?: Record<string, ComponentVersion>;\n /** Registry version at last install */\n registryVersion?: string;\n}\n\nconst DEFAULT_CONFIG: Config = {\n $schema: 'https://microbuild.dev/schema.json',\n model: 'copy-own',\n tsx: true,\n srcDir: true,\n aliases: {\n components: '@/components/ui',\n lib: '@/lib/microbuild',\n },\n installedLib: [],\n installedComponents: [],\n componentVersions: {},\n registryVersion: '1.0.0',\n};\n\nconst TEMPLATES_ROOT = getTemplatesRoot();\n\nasync function copyTemplateFile(sourceRelativePath: string, targetPath: string, cwd: string) {\n const sourcePath = path.join(TEMPLATES_ROOT, sourceRelativePath);\n\n if (!fs.existsSync(sourcePath) || fs.existsSync(targetPath)) {\n return;\n }\n\n await fs.ensureDir(path.dirname(targetPath));\n await fs.copy(sourcePath, targetPath);\n console.log(chalk.green(`✓ Created ${path.relative(cwd, targetPath)}`));\n}\n\nexport async function init(options: { yes?: boolean; cwd: string }) {\n const { cwd, yes } = options;\n\n console.log(chalk.bold('\\n🚀 Welcome to Microbuild!\\n'));\n console.log(chalk.dim('Copy & Own Model - Components become part of your codebase.\\n'));\n\n // Check if already initialized\n const configPath = path.join(cwd, 'microbuild.json');\n if (fs.existsSync(configPath) && !yes) {\n const { overwrite } = await prompts({\n type: 'confirm',\n name: 'overwrite',\n message: 'microbuild.json already exists. Overwrite?',\n initial: false,\n });\n\n if (!overwrite) {\n console.log(chalk.yellow('\\n✓ Keeping existing configuration\\n'));\n return;\n }\n }\n\n // Detect project type\n const packageJsonPath = path.join(cwd, 'package.json');\n let projectType = 'unknown';\n let hasSrcDir = fs.existsSync(path.join(cwd, 'src'));\n\n if (fs.existsSync(packageJsonPath)) {\n const packageJson = await fs.readJSON(packageJsonPath);\n if (packageJson.dependencies?.['next']) {\n projectType = 'next';\n // Next.js App Router often uses 'app' instead of 'src'\n if (fs.existsSync(path.join(cwd, 'app')) && !hasSrcDir) {\n hasSrcDir = false;\n }\n } else if (packageJson.dependencies?.['vite']) {\n projectType = 'vite';\n } else if (packageJson.dependencies?.['react']) {\n projectType = 'react';\n }\n } else {\n // Create a minimal package.json for empty projects\n console.log(chalk.yellow('⚠ No package.json found. Creating minimal Next.js project...\\n'));\n \n const projectName = path.basename(cwd);\n const minimalPackageJson = {\n name: projectName,\n version: '0.1.0',\n private: true,\n scripts: {\n dev: 'next dev --turbopack',\n build: 'next build',\n start: 'next start',\n lint: 'next lint'\n },\n dependencies: {\n 'next': '^15.0.0',\n 'react': '^19.0.0',\n 'react-dom': '^19.0.0',\n '@mantine/core': '^8.0.0',\n '@mantine/hooks': '^8.0.0',\n '@tabler/icons-react': '^3.0.0',\n 'clsx': '^2.0.0',\n 'tailwind-merge': '^2.0.0'\n },\n devDependencies: {\n '@types/node': '^20',\n '@types/react': '^19',\n '@types/react-dom': '^19',\n 'typescript': '^5'\n }\n };\n \n await fs.writeJSON(packageJsonPath, minimalPackageJson, { spaces: 2 });\n projectType = 'next';\n hasSrcDir = false; // New projects use App Router without src/\n console.log(chalk.green('✓ Created package.json\\n'));\n }\n\n console.log(chalk.dim(`Detected: ${projectType} project${hasSrcDir ? ' with src directory' : ''}\\n`));\n\n let config = { ...DEFAULT_CONFIG };\n config.srcDir = hasSrcDir;\n\n if (!yes) {\n // Prompt for configuration\n const answers = await prompts([\n {\n type: 'confirm',\n name: 'srcDir',\n message: 'Use src directory?',\n initial: hasSrcDir,\n },\n {\n type: 'text',\n name: 'componentsPath',\n message: 'Where should components be installed?',\n initial: '@/components/ui',\n },\n {\n type: 'text',\n name: 'libPath',\n message: 'Where should lib files (types, services, hooks) be installed?',\n initial: '@/lib/microbuild',\n },\n {\n type: 'confirm',\n name: 'tsx',\n message: 'Use TypeScript?',\n initial: true,\n },\n ]);\n\n config.srcDir = answers.srcDir ?? hasSrcDir;\n config.aliases.components = answers.componentsPath || '@/components/ui';\n config.aliases.lib = answers.libPath || '@/lib/microbuild';\n config.tsx = answers.tsx ?? true;\n }\n\n const spinner = ora('Setting up Copy & Own structure...').start();\n\n try {\n // Write config\n await fs.writeJSON(configPath, config, { spaces: 2 });\n spinner.succeed('Created microbuild.json');\n\n // Create directory structure\n // Components directory\n const componentsDir = resolveAlias(config.aliases.components, cwd, config.srcDir);\n await fs.ensureDir(componentsDir);\n console.log(chalk.green(`✓ Created ${path.relative(cwd, componentsDir)}`));\n\n // Lib directory structure\n const libDir = resolveAlias(config.aliases.lib, cwd, config.srcDir);\n await fs.ensureDir(libDir);\n await fs.ensureDir(path.join(libDir, 'types'));\n await fs.ensureDir(path.join(libDir, 'services'));\n await fs.ensureDir(path.join(libDir, 'hooks'));\n console.log(chalk.green(`✓ Created ${path.relative(cwd, libDir)}`));\n console.log(chalk.dim(' └── types/'));\n console.log(chalk.dim(' └── services/'));\n console.log(chalk.dim(' └── hooks/'));\n\n // Create tsconfig.json if missing (required for path aliases)\n const tsconfigPath = path.join(cwd, 'tsconfig.json');\n if (!fs.existsSync(tsconfigPath) && config.tsx) {\n const tsconfig = {\n compilerOptions: {\n target: 'ES2017',\n lib: ['dom', 'dom.iterable', 'esnext'],\n allowJs: true,\n skipLibCheck: true,\n strict: true,\n noEmit: true,\n esModuleInterop: true,\n module: 'esnext',\n moduleResolution: 'bundler',\n resolveJsonModule: true,\n isolatedModules: true,\n jsx: 'preserve',\n incremental: true,\n plugins: [{ name: 'next' }],\n paths: {\n '@/*': [config.srcDir ? './src/*' : './*']\n },\n baseUrl: '.'\n },\n include: ['next-env.d.ts', '**/*.ts', '**/*.tsx', '.next/types/**/*.ts'],\n exclude: ['node_modules']\n };\n await fs.writeJSON(tsconfigPath, tsconfig, { spaces: 2 });\n console.log(chalk.green(`✓ Created tsconfig.json with @/ path alias`));\n }\n\n // Create next-env.d.ts if missing (for Next.js TypeScript support)\n const nextEnvPath = path.join(cwd, 'next-env.d.ts');\n if (!fs.existsSync(nextEnvPath) && projectType === 'next') {\n const nextEnvContent = `/// <reference types=\"next\" />\n/// <reference types=\"next/image-types/global\" />\n\n// NOTE: This file should not be edited\n// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.\n`;\n await fs.writeFile(nextEnvPath, nextEnvContent);\n console.log(chalk.green(`✓ Created next-env.d.ts`));\n }\n\n // Create a basic Next.js app skeleton with design system files\n if (projectType === 'next') {\n const srcRoot = config.srcDir ? path.join(cwd, 'src') : cwd;\n const appDir = path.join(srcRoot, 'app');\n const libRoot = path.join(srcRoot, 'lib');\n const componentsRoot = path.join(srcRoot, 'components');\n\n await fs.ensureDir(appDir);\n await fs.ensureDir(libRoot);\n await fs.ensureDir(componentsRoot);\n\n await copyTemplateFile('app/design-tokens.css', path.join(appDir, 'design-tokens.css'), cwd);\n await copyTemplateFile('app/globals.css', path.join(appDir, 'globals.css'), cwd);\n await copyTemplateFile('app/layout.tsx', path.join(appDir, 'layout.tsx'), cwd);\n await copyTemplateFile('app/page.tsx', path.join(appDir, 'page.tsx'), cwd);\n await copyTemplateFile('lib/theme.ts', path.join(libRoot, 'theme.ts'), cwd);\n await copyTemplateFile(\n 'components/ColorSchemeToggle.tsx',\n path.join(componentsRoot, 'ColorSchemeToggle.tsx'),\n cwd\n );\n }\n\n // Check for required dependencies\n console.log(chalk.bold('\\n📦 Checking dependencies...\\n'));\n\n // Core dependencies always needed\n const coreDeps = [\n '@mantine/core',\n '@mantine/hooks',\n 'react',\n 'react-dom',\n ];\n\n // Optional dependencies for specific features (installed on-demand when components need them)\n // @mantine/dates - DateTime component\n // @mantine/notifications - CollectionForm notifications\n // @mantine/dropzone - Upload component\n // @tabler/icons-react - Icon components\n // dayjs - DateTime component\n\n // Utility dependencies (for utils.ts)\n const utilityDeps = ['clsx', 'tailwind-merge'];\n\n const missingDeps: string[] = [];\n const missingUtilDeps: string[] = [];\n\n if (fs.existsSync(packageJsonPath)) {\n const packageJson = await fs.readJSON(packageJsonPath);\n const allDeps = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n };\n\n for (const dep of coreDeps) {\n if (!allDeps[dep]) {\n missingDeps.push(dep);\n }\n }\n\n for (const dep of utilityDeps) {\n if (!allDeps[dep]) {\n missingUtilDeps.push(dep);\n }\n }\n }\n\n if (missingDeps.length > 0) {\n console.log(chalk.yellow('⚠ Missing core dependencies:'));\n missingDeps.forEach(dep => console.log(chalk.dim(` - ${dep}`)));\n console.log(chalk.dim('\\nInstall with:'));\n console.log(chalk.cyan(` pnpm add ${missingDeps.join(' ')}\\n`));\n } else {\n console.log(chalk.green('✓ Core dependencies installed\\n'));\n }\n\n if (missingUtilDeps.length > 0) {\n console.log(chalk.dim('Optional utility dependencies for cn() helper:'));\n console.log(chalk.cyan(` pnpm add ${missingUtilDeps.join(' ')}\\n`));\n }\n\n // Print benefits\n console.log(chalk.bold.blue('📋 Copy & Own Benefits:\\n'));\n console.log(' ✅ No external package dependencies for component code');\n console.log(' ✅ Full customization - components are your application code');\n console.log(' ✅ No breaking changes from upstream updates');\n console.log(' ✅ Bundle only what you use - tree-shaking friendly');\n console.log(' ✅ Works offline after installation');\n\n // Success message\n console.log(chalk.bold.green('\\n✨ Setup complete!\\n'));\n console.log('Next steps:');\n console.log(chalk.cyan(' 1. Add components: ') + chalk.dim('npx microbuild add input select-dropdown'));\n console.log(chalk.cyan(' 2. List components: ') + chalk.dim('npx microbuild list'));\n console.log(chalk.cyan(' 3. Add all basics: ') + chalk.dim('npx microbuild add --category input'));\n console.log(chalk.dim('\\nComponents will be copied with all dependencies inlined.\\n'));\n\n } catch (error) {\n spinner.fail('Failed to initialize');\n console.error(chalk.red(error));\n process.exit(1);\n }\n}\n\n/**\n * Resolve path alias to absolute path\n * Handles @/ aliases and accounts for srcDir configuration\n */\nexport function resolveAlias(alias: string, cwd: string, srcDir: boolean = true): string {\n if (alias.startsWith('@/')) {\n const relativePath = alias.slice(2);\n if (srcDir) {\n return path.join(cwd, 'src', relativePath);\n }\n return path.join(cwd, relativePath);\n }\n return path.join(cwd, alias);\n}\n\n/**\n * Load and validate the microbuild.json config\n */\nexport async function loadConfig(cwd: string): Promise<Config | null> {\n const configPath = path.join(cwd, 'microbuild.json');\n if (!fs.existsSync(configPath)) {\n return null;\n }\n return await fs.readJSON(configPath) as Config;\n}\n\n/**\n * Save the microbuild.json config\n */\nexport async function saveConfig(cwd: string, config: Config): Promise<void> {\n const configPath = path.join(cwd, 'microbuild.json');\n await fs.writeJSON(configPath, config, { spaces: 2 });\n}\n"],"mappings":"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","names":["fs","path","path","fs"]}
@@ -0,0 +1 @@
1
+ #!/usr/bin/env node