tailar 0.2.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 (104) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +183 -0
  3. package/README.npm.md +183 -0
  4. package/dist/api/client.d.ts +47 -0
  5. package/dist/api/client.d.ts.map +1 -0
  6. package/dist/api/client.js +329 -0
  7. package/dist/api/client.js.map +1 -0
  8. package/dist/auth/browser.d.ts +11 -0
  9. package/dist/auth/browser.d.ts.map +1 -0
  10. package/dist/auth/browser.js +46 -0
  11. package/dist/auth/browser.js.map +1 -0
  12. package/dist/auth/flow.d.ts +28 -0
  13. package/dist/auth/flow.d.ts.map +1 -0
  14. package/dist/auth/flow.js +171 -0
  15. package/dist/auth/flow.js.map +1 -0
  16. package/dist/auth/storage.d.ts +30 -0
  17. package/dist/auth/storage.d.ts.map +1 -0
  18. package/dist/auth/storage.js +112 -0
  19. package/dist/auth/storage.js.map +1 -0
  20. package/dist/commands/add.d.ts +8 -0
  21. package/dist/commands/add.d.ts.map +1 -0
  22. package/dist/commands/add.js +285 -0
  23. package/dist/commands/add.js.map +1 -0
  24. package/dist/commands/init.d.ts +8 -0
  25. package/dist/commands/init.d.ts.map +1 -0
  26. package/dist/commands/init.js +230 -0
  27. package/dist/commands/init.js.map +1 -0
  28. package/dist/commands/list.d.ts +8 -0
  29. package/dist/commands/list.d.ts.map +1 -0
  30. package/dist/commands/list.js +176 -0
  31. package/dist/commands/list.js.map +1 -0
  32. package/dist/index.d.ts +9 -0
  33. package/dist/index.d.ts.map +1 -0
  34. package/dist/index.js +83 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/installers/dependencies.d.ts +27 -0
  37. package/dist/installers/dependencies.d.ts.map +1 -0
  38. package/dist/installers/dependencies.js +185 -0
  39. package/dist/installers/dependencies.js.map +1 -0
  40. package/dist/installers/files.d.ts +50 -0
  41. package/dist/installers/files.d.ts.map +1 -0
  42. package/dist/installers/files.js +211 -0
  43. package/dist/installers/files.js.map +1 -0
  44. package/dist/installers/install-feature.d.ts +20 -0
  45. package/dist/installers/install-feature.d.ts.map +1 -0
  46. package/dist/installers/install-feature.js +169 -0
  47. package/dist/installers/install-feature.js.map +1 -0
  48. package/dist/installers/post-install.d.ts +18 -0
  49. package/dist/installers/post-install.d.ts.map +1 -0
  50. package/dist/installers/post-install.js +228 -0
  51. package/dist/installers/post-install.js.map +1 -0
  52. package/dist/installers/templates.d.ts +22 -0
  53. package/dist/installers/templates.d.ts.map +1 -0
  54. package/dist/installers/templates.js +62 -0
  55. package/dist/installers/templates.js.map +1 -0
  56. package/dist/registry/loader.d.ts +21 -0
  57. package/dist/registry/loader.d.ts.map +1 -0
  58. package/dist/registry/loader.js +83 -0
  59. package/dist/registry/loader.js.map +1 -0
  60. package/dist/registry/query.d.ts +55 -0
  61. package/dist/registry/query.d.ts.map +1 -0
  62. package/dist/registry/query.js +123 -0
  63. package/dist/registry/query.js.map +1 -0
  64. package/dist/types/config.d.ts +85 -0
  65. package/dist/types/config.d.ts.map +1 -0
  66. package/dist/types/config.js +7 -0
  67. package/dist/types/config.js.map +1 -0
  68. package/dist/types/index.d.ts +9 -0
  69. package/dist/types/index.d.ts.map +1 -0
  70. package/dist/types/index.js +9 -0
  71. package/dist/types/index.js.map +1 -0
  72. package/dist/types/registry.d.ts +180 -0
  73. package/dist/types/registry.d.ts.map +1 -0
  74. package/dist/types/registry.js +8 -0
  75. package/dist/types/registry.js.map +1 -0
  76. package/dist/types/wizard.d.ts +43 -0
  77. package/dist/types/wizard.d.ts.map +1 -0
  78. package/dist/types/wizard.js +59 -0
  79. package/dist/types/wizard.js.map +1 -0
  80. package/dist/utils/clack-wizard.d.ts +9 -0
  81. package/dist/utils/clack-wizard.d.ts.map +1 -0
  82. package/dist/utils/clack-wizard.js +328 -0
  83. package/dist/utils/clack-wizard.js.map +1 -0
  84. package/dist/utils/config.d.ts +49 -0
  85. package/dist/utils/config.d.ts.map +1 -0
  86. package/dist/utils/config.js +121 -0
  87. package/dist/utils/config.js.map +1 -0
  88. package/dist/utils/logger.d.ts +56 -0
  89. package/dist/utils/logger.d.ts.map +1 -0
  90. package/dist/utils/logger.js +93 -0
  91. package/dist/utils/logger.js.map +1 -0
  92. package/dist/utils/package-manager.d.ts +41 -0
  93. package/dist/utils/package-manager.d.ts.map +1 -0
  94. package/dist/utils/package-manager.js +118 -0
  95. package/dist/utils/package-manager.js.map +1 -0
  96. package/dist/utils/prompts.d.ts +22 -0
  97. package/dist/utils/prompts.d.ts.map +1 -0
  98. package/dist/utils/prompts.js +142 -0
  99. package/dist/utils/prompts.js.map +1 -0
  100. package/dist/utils/validation.d.ts +50 -0
  101. package/dist/utils/validation.d.ts.map +1 -0
  102. package/dist/utils/validation.js +108 -0
  103. package/dist/utils/validation.js.map +1 -0
  104. package/package.json +56 -0
@@ -0,0 +1,230 @@
1
+ /**
2
+ * Init Command
3
+ *
4
+ * Initialize a new Tailar project or add Tailar to an existing Next.js project.
5
+ */
6
+ import { Command } from "commander";
7
+ import { logger } from "../utils/logger.js";
8
+ import { validateProject, detectProjectStructure, isNextJsProject, } from "../utils/validation.js";
9
+ import { detectPackageManager, } from "../utils/package-manager.js";
10
+ import { readConfig, writeConfig, createInitialConfig, } from "../utils/config.js";
11
+ import { loadRegistry } from "../registry/loader.js";
12
+ import { getFeature } from "../registry/query.js";
13
+ import { installFiles } from "../installers/files.js";
14
+ import { mergeDependencies, runInstall, collectDependencies, } from "../installers/dependencies.js";
15
+ import { executePostInstallSteps } from "../installers/post-install.js";
16
+ import { isAuthenticated, authenticate } from "../auth/flow.js";
17
+ import { checkSubscription } from "../api/client.js";
18
+ import { confirm } from "../utils/prompts.js";
19
+ import { clackTextInput, runGenerationFromWizardConfig, runInitWizard, } from "../utils/clack-wizard.js";
20
+ export const initCommand = new Command("init")
21
+ .description("Initialize Tailar in your Next.js project")
22
+ .option("-y, --yes", "Skip prompts and use defaults")
23
+ .action(async (options) => {
24
+ try {
25
+ logger.header("🚀 Tailar Initialization");
26
+ const projectPath = process.cwd();
27
+ // Check if Next.js project exists
28
+ let isNext = await isNextJsProject(projectPath);
29
+ let actualProjectPath = projectPath;
30
+ let shadcnCreatedProject = false;
31
+ let detectedProjectName;
32
+ let shadcnProjectName; // Project name used for shadcn init
33
+ if (!isNext) {
34
+ // Authenticate and verify purchase before the guided wizard (paid features).
35
+ if (!(await isAuthenticated())) {
36
+ logger.info("A Tailar purchase is required to use the CLI.");
37
+ logger.break();
38
+ await authenticate();
39
+ logger.break();
40
+ }
41
+ const accessCheck = await checkSubscription("feature", "shared");
42
+ if (!accessCheck.accessible) {
43
+ logger.error(`Access denied: ${accessCheck.reason ?? "Active purchase required."}`);
44
+ logger.info("Visit https://tailar.dev/choose-plan to get access.");
45
+ process.exit(1);
46
+ }
47
+ const wizardState = await runInitWizard();
48
+ if (!wizardState) {
49
+ // Wizard handles its own messaging and cancellation.
50
+ return;
51
+ }
52
+ const generationResult = await runGenerationFromWizardConfig(projectPath, wizardState);
53
+ // After generating a new project via the wizard, we are done.
54
+ // Further Tailar initialization (features, registry, etc.) will be added later.
55
+ return;
56
+ }
57
+ // Ensure we're in the correct directory
58
+ if (actualProjectPath !== projectPath) {
59
+ process.chdir(actualProjectPath);
60
+ }
61
+ // Validate project (use actualProjectPath which may have changed)
62
+ const validation = await validateProject(actualProjectPath);
63
+ if (!validation.valid) {
64
+ logger.error("Project validation failed:");
65
+ validation.errors.forEach((err) => logger.error(` ${err}`));
66
+ process.exit(1);
67
+ }
68
+ if (validation.warnings.length > 0) {
69
+ // Filter out the "already initialized" warning if we just created the project
70
+ const relevantWarnings = shadcnCreatedProject
71
+ ? validation.warnings.filter((w) => !w.includes("already initialized"))
72
+ : validation.warnings;
73
+ if (relevantWarnings.length > 0) {
74
+ relevantWarnings.forEach((warn) => logger.warn(warn));
75
+ if (!options.yes) {
76
+ const proceed = await confirm("Continue anyway?", false);
77
+ if (!proceed) {
78
+ logger.info("Initialization cancelled");
79
+ process.exit(0);
80
+ }
81
+ }
82
+ }
83
+ }
84
+ // Check if already initialized (only if we didn't just create the project)
85
+ const existingConfig = await readConfig(actualProjectPath);
86
+ if (existingConfig && !shadcnCreatedProject && !options.yes) {
87
+ const reinit = await confirm("Tailar is already initialized. Reinitialize?", false);
88
+ if (!reinit) {
89
+ logger.info("Initialization cancelled");
90
+ process.exit(0);
91
+ }
92
+ }
93
+ // Detect project structure
94
+ const structure = detectProjectStructure(actualProjectPath);
95
+ logger.success(`Project structure detected: ${structure.hasSrcFolder ? "src/" : "root"}`);
96
+ // Detect package manager
97
+ const packageManager = detectPackageManager(actualProjectPath);
98
+ logger.success(`Package manager: ${packageManager}`);
99
+ // Get project name (skip if shadcn created the project - use detected name)
100
+ // Note: shadcnProjectName was already collected before shadcn init if shadcn created the project
101
+ let projectName = detectedProjectName;
102
+ if (!shadcnCreatedProject && !options.yes) {
103
+ projectName = await clackTextInput("Project name (optional):", undefined);
104
+ }
105
+ else if (shadcnCreatedProject) {
106
+ // Use the name we collected before running shadcn init
107
+ projectName = shadcnProjectName;
108
+ }
109
+ // Create config
110
+ const config = createInitialConfig({
111
+ name: projectName,
112
+ hasSrcFolder: structure.hasSrcFolder,
113
+ hasAppFolder: structure.hasAppFolder,
114
+ });
115
+ const context = {
116
+ root: actualProjectPath,
117
+ packageManager,
118
+ structure,
119
+ config,
120
+ };
121
+ // Load registry
122
+ logger.info("Loading registry...");
123
+ const spinner = logger.spinner("Fetching components...");
124
+ const registry = await loadRegistry();
125
+ spinner.succeed("Registry loaded");
126
+ // Install default features (i18n and shared)
127
+ logger.header("📦 Installing default features");
128
+ const featuresToInstall = ["i18n", "shared"];
129
+ const allDeps = [];
130
+ // Check if any default features require subscription
131
+ let needsAuth = false;
132
+ for (const featureName of featuresToInstall) {
133
+ const feature = getFeature(registry, featureName);
134
+ if (feature &&
135
+ feature.requiresSubscription === true &&
136
+ (feature.subscriptionTier || 0) > 0) {
137
+ needsAuth = true;
138
+ break;
139
+ }
140
+ }
141
+ // Authenticate if needed for paid features
142
+ if (needsAuth) {
143
+ if (!(await isAuthenticated())) {
144
+ logger.info("Authentication required for default features.");
145
+ logger.break();
146
+ await authenticate();
147
+ logger.break();
148
+ }
149
+ }
150
+ for (const featureName of featuresToInstall) {
151
+ const feature = getFeature(registry, featureName);
152
+ if (!feature) {
153
+ logger.warn(`Feature not found: ${featureName}`);
154
+ continue;
155
+ }
156
+ // Check subscription for this feature
157
+ const requiresSubscription = feature.requiresSubscription === true &&
158
+ (feature.subscriptionTier || 0) > 0;
159
+ if (requiresSubscription) {
160
+ logger.info(`Verifying subscription for ${feature.label}...`);
161
+ const accessCheck = await checkSubscription("feature", featureName, feature);
162
+ if (!accessCheck.accessible) {
163
+ logger.warn(`Skipping ${feature.label}: ${accessCheck.reason || "Subscription required"}`);
164
+ logger.info("You can install it later with: tailar add " + featureName);
165
+ continue;
166
+ }
167
+ }
168
+ logger.info(`Installing ${feature.label}...`);
169
+ // Install files
170
+ const installSpinner = logger.spinner("Copying files...");
171
+ const result = await installFiles(actualProjectPath, feature.files, context, {}, {
172
+ overwrite: true,
173
+ componentType: "feature",
174
+ componentName: featureName,
175
+ registryEntry: feature, // Pass registry entry to skip auth for free components
176
+ });
177
+ installSpinner.succeed(`Installed ${result.installed.length} files`);
178
+ // Collect dependencies
179
+ const deps = collectDependencies(feature);
180
+ allDeps.push(...deps);
181
+ // Add to config
182
+ config.installed.features.push({
183
+ name: featureName,
184
+ installedAt: new Date().toISOString(),
185
+ });
186
+ // Execute post-install steps
187
+ if (feature.postInstall && feature.postInstall.length > 0) {
188
+ logger.info("Running post-install steps...");
189
+ await executePostInstallSteps(actualProjectPath, feature.postInstall, context);
190
+ }
191
+ }
192
+ // Merge dependencies
193
+ if (allDeps.length > 0) {
194
+ logger.info("Updating package.json...");
195
+ const depResult = await mergeDependencies(actualProjectPath, allDeps);
196
+ logger.success(`Added ${depResult.added.dependencies.length} dependencies`);
197
+ if (depResult.conflicts.length > 0) {
198
+ logger.warn("Dependency version conflicts:");
199
+ depResult.conflicts.forEach((conflict) => logger.warn(` ${conflict}`));
200
+ }
201
+ }
202
+ // Write config
203
+ await writeConfig(actualProjectPath, config);
204
+ logger.success("Configuration saved");
205
+ // Run package manager install
206
+ logger.info("Installing dependencies...");
207
+ const installSpinner = logger.spinner(`Running ${packageManager} install...`);
208
+ await runInstall(actualProjectPath, packageManager, { silent: true });
209
+ installSpinner.succeed("Dependencies installed");
210
+ // Success message
211
+ logger.break();
212
+ logger.success("✨ Tailar initialized successfully!");
213
+ logger.break();
214
+ logger.info("Next steps:");
215
+ // Show cd command if we have a project name (especially if created via shadcn)
216
+ if (detectedProjectName || projectName) {
217
+ const projectDir = detectedProjectName || projectName;
218
+ logger.log(` • cd ${projectDir}`);
219
+ }
220
+ logger.log(" • Run `npx tailar list` to see available features");
221
+ logger.log(" • Run `npx tailar add <feature>` to add features");
222
+ logger.log(" • Check out the documentation at https://tailar.dev/docs");
223
+ logger.break();
224
+ }
225
+ catch (error) {
226
+ logger.error(`Initialization failed: ${error}`);
227
+ process.exit(1);
228
+ }
229
+ });
230
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * List Command
3
+ *
4
+ * List all available features, blocks, and components.
5
+ */
6
+ import { Command } from "commander";
7
+ export declare const listCommand: Command;
8
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,eAAO,MAAM,WAAW,SAqOpB,CAAC"}
@@ -0,0 +1,176 @@
1
+ /**
2
+ * List Command
3
+ *
4
+ * List all available features, blocks, and components.
5
+ */
6
+ import { Command } from "commander";
7
+ import chalk from "chalk";
8
+ import { logger } from "../utils/logger.js";
9
+ import { loadRegistry } from "../registry/loader.js";
10
+ import { readConfig, getInstalledItems } from "../utils/config.js";
11
+ export const listCommand = new Command("list")
12
+ .description("List all available features, blocks, and components")
13
+ .option("--features", "List only features")
14
+ .option("--blocks", "List only blocks")
15
+ .option("--components", "List only components")
16
+ .option("--installed", "List only installed items")
17
+ .action(async (options) => {
18
+ try {
19
+ const projectPath = process.cwd();
20
+ // Load registry
21
+ const spinner = logger.spinner("Loading registry...");
22
+ const registry = await loadRegistry();
23
+ spinner.succeed("Registry loaded");
24
+ // Read config to check installed items
25
+ const config = await readConfig(projectPath);
26
+ const installedFeatures = config
27
+ ? getInstalledItems(config, "feature")
28
+ : [];
29
+ const installedBlocks = config ? getInstalledItems(config, "block") : [];
30
+ const installedComponents = config
31
+ ? getInstalledItems(config, "component")
32
+ : [];
33
+ // Helper to check if installed
34
+ const isItemInstalled = (type, name) => {
35
+ switch (type) {
36
+ case "feature":
37
+ return installedFeatures.includes(name);
38
+ case "block":
39
+ return installedBlocks.includes(name);
40
+ case "component":
41
+ return installedComponents.includes(name);
42
+ default:
43
+ return false;
44
+ }
45
+ };
46
+ // Helper to get subscription badge
47
+ const getSubscriptionBadge = (entry) => {
48
+ if (!entry.requiresSubscription ||
49
+ (entry.subscriptionTier || 0) === 0) {
50
+ return "";
51
+ }
52
+ const tierNames = ["FREE", "SOLO", "TEAM", "AGENCY"];
53
+ const tierName = tierNames[entry.subscriptionTier || 0] ||
54
+ `TIER ${entry.subscriptionTier}`;
55
+ // Color code: SOLO = yellow, TEAM = magenta, AGENCY = cyan
56
+ if (entry.subscriptionTier === 1) {
57
+ return chalk.yellow(`[${tierName}]`);
58
+ }
59
+ else if (entry.subscriptionTier === 2) {
60
+ return chalk.magenta(`[${tierName}]`);
61
+ }
62
+ else if (entry.subscriptionTier === 3) {
63
+ return chalk.cyan(`[${tierName}]`);
64
+ }
65
+ return chalk.dim(`[${tierName}]`);
66
+ };
67
+ // Helper to format entry
68
+ const formatEntry = (entry) => {
69
+ const installed = isItemInstalled(entry.type, entry.name);
70
+ const installedBadge = installed ? chalk.green("✓ installed") : "";
71
+ const subscriptionBadge = getSubscriptionBadge(entry);
72
+ const name = chalk.bold(entry.name);
73
+ const label = chalk.dim(`(${entry.label})`);
74
+ const badges = [subscriptionBadge, installedBadge]
75
+ .filter(Boolean)
76
+ .join(" ");
77
+ return ` ${name} ${label} ${badges}\n ${chalk.dim(entry.description)}`;
78
+ };
79
+ // Filter entries if --installed flag is used
80
+ const filterInstalled = (entries, type) => {
81
+ if (!options.installed)
82
+ return entries;
83
+ return entries.filter((e) => isItemInstalled(type, e.name));
84
+ };
85
+ logger.break();
86
+ logger.header("📦 Tailar Components");
87
+ // Show registry metadata
88
+ logger.log(chalk.dim(`Registry version: ${registry.version}`));
89
+ logger.log(chalk.dim(`Last updated: ${new Date(registry.metadata.lastUpdated).toLocaleDateString()}`));
90
+ logger.break();
91
+ // List features
92
+ if (!options.blocks && !options.components) {
93
+ const features = filterInstalled(registry.features, "feature");
94
+ if (features.length > 0) {
95
+ logger.log(chalk.bold.cyan("Features:"));
96
+ features.forEach((feature) => {
97
+ logger.log(formatEntry(feature));
98
+ // Show variants if any
99
+ if (feature.variants && feature.variants.length > 0) {
100
+ logger.log(chalk.dim(` Variants: ${feature.variants
101
+ .map((v) => v.name)
102
+ .join(", ")}`));
103
+ }
104
+ // Show dependencies if any
105
+ if (feature.featureDependencies &&
106
+ feature.featureDependencies.length > 0) {
107
+ logger.log(chalk.dim(` Requires: ${feature.featureDependencies.join(", ")}`));
108
+ }
109
+ logger.break();
110
+ });
111
+ }
112
+ else if (options.installed) {
113
+ logger.log(chalk.dim("No features installed"));
114
+ logger.break();
115
+ }
116
+ }
117
+ // List blocks
118
+ if (!options.features && !options.components) {
119
+ const blocks = filterInstalled(registry.blocks, "block");
120
+ if (blocks.length > 0) {
121
+ logger.log(chalk.bold.cyan("Blocks:"));
122
+ blocks.forEach((block) => {
123
+ logger.log(formatEntry(block));
124
+ logger.break();
125
+ });
126
+ }
127
+ else if (options.installed && !options.features) {
128
+ logger.log(chalk.dim("No blocks installed"));
129
+ logger.break();
130
+ }
131
+ }
132
+ // List components
133
+ if (!options.features && !options.blocks) {
134
+ const components = filterInstalled(registry.components, "component");
135
+ if (components.length > 0) {
136
+ logger.log(chalk.bold.cyan("Components:"));
137
+ components.forEach((component) => {
138
+ logger.log(formatEntry(component));
139
+ // Show dependencies if any
140
+ if (component.featureDependencies &&
141
+ component.featureDependencies.length > 0) {
142
+ logger.log(chalk.dim(` Requires: ${component.featureDependencies.join(", ")}`));
143
+ }
144
+ logger.break();
145
+ });
146
+ }
147
+ else if (options.installed && !options.features && !options.blocks) {
148
+ logger.log(chalk.dim("No components installed"));
149
+ logger.break();
150
+ }
151
+ }
152
+ // Show totals
153
+ const totalFeatures = registry.features.length;
154
+ const totalBlocks = registry.blocks.length;
155
+ const totalComponents = registry.components.length;
156
+ const total = totalFeatures + totalBlocks + totalComponents;
157
+ logger.log(chalk.dim(`Total: ${total} items (${totalFeatures} features, ${totalBlocks} blocks, ${totalComponents} components)`));
158
+ if (config) {
159
+ const totalInstalled = installedFeatures.length +
160
+ installedBlocks.length +
161
+ installedComponents.length;
162
+ logger.log(chalk.dim(`Installed: ${totalInstalled} items`));
163
+ }
164
+ logger.break();
165
+ // Show usage hint
166
+ logger.log(chalk.dim("Usage:"));
167
+ logger.log(chalk.dim(" tailar add <name> Add a feature, block, or component"));
168
+ logger.log(chalk.dim(" tailar list --installed Show only installed items"));
169
+ logger.break();
170
+ }
171
+ catch (error) {
172
+ logger.error(`Failed to list: ${error}`);
173
+ process.exit(1);
174
+ }
175
+ });
176
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Tailar CLI - Entry Point
4
+ *
5
+ * This is the main entry point for the Tailar CLI tool.
6
+ * It sets up Commander.js and registers all available commands.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG"}
package/dist/index.js ADDED
@@ -0,0 +1,83 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Tailar CLI - Entry Point
4
+ *
5
+ * This is the main entry point for the Tailar CLI tool.
6
+ * It sets up Commander.js and registers all available commands.
7
+ */
8
+ // Load environment variables from .env file if it exists
9
+ import { existsSync, readFileSync } from "fs";
10
+ import { fileURLToPath } from "url";
11
+ import { dirname, join } from "path";
12
+ // Simple .env file parser (no external dependency needed)
13
+ function parseEnvLines(envContent) {
14
+ const out = {};
15
+ for (const line of envContent.split("\n")) {
16
+ const trimmed = line.trim();
17
+ if (!trimmed || trimmed.startsWith("#"))
18
+ continue;
19
+ const match = trimmed.match(/^([^=]+)=(.*)$/);
20
+ if (match) {
21
+ const key = match[1].trim();
22
+ let value = match[2].trim();
23
+ if ((value.startsWith('"') && value.endsWith('"')) ||
24
+ (value.startsWith("'") && value.endsWith("'"))) {
25
+ value = value.slice(1, -1);
26
+ }
27
+ out[key] = value;
28
+ }
29
+ }
30
+ return out;
31
+ }
32
+ function loadEnvFile() {
33
+ const cwdEnvPath = join(process.cwd(), ".env");
34
+ const __filename = fileURLToPath(import.meta.url);
35
+ const __dirname = dirname(__filename);
36
+ const cliEnvPath = join(__dirname, "../.env");
37
+ // 1) CLI .env — fills API_BASE_URL etc. when present (local registry).
38
+ // 2) Project .env — fills app secrets; keys here override CLI for same name.
39
+ // Previously only the first existing file was loaded (cwd), so inside any
40
+ // project the CLI never saw API_BASE_URL and always hit tailar.dev (hang).
41
+ const cliVars = existsSync(cliEnvPath)
42
+ ? parseEnvLines(readFileSync(cliEnvPath, "utf-8"))
43
+ : {};
44
+ const cwdVars = existsSync(cwdEnvPath)
45
+ ? parseEnvLines(readFileSync(cwdEnvPath, "utf-8"))
46
+ : {};
47
+ const merged = { ...cliVars, ...cwdVars };
48
+ for (const [key, value] of Object.entries(merged)) {
49
+ if (!process.env[key]) {
50
+ process.env[key] = value;
51
+ }
52
+ }
53
+ }
54
+ // Load .env file before importing commands
55
+ loadEnvFile();
56
+ import { Command } from "commander";
57
+ import { initCommand } from "./commands/init.js";
58
+ import { addCommand } from "./commands/add.js";
59
+ import { listCommand } from "./commands/list.js";
60
+ // Get package.json for version
61
+ const __filename = fileURLToPath(import.meta.url);
62
+ const __dirname = dirname(__filename);
63
+ const packageJson = JSON.parse(readFileSync(join(__dirname, "../package.json"), "utf-8"));
64
+ const program = new Command();
65
+ program
66
+ .name("tailar")
67
+ .description("CLI tool for scaffolding Next.js features and components")
68
+ .version(packageJson.version);
69
+ // Register commands
70
+ program.addCommand(initCommand);
71
+ program.addCommand(addCommand);
72
+ program.addCommand(listCommand);
73
+ // Global error handler
74
+ process.on("unhandledRejection", (err) => {
75
+ console.error("Unhandled error:", err);
76
+ process.exit(1);
77
+ });
78
+ process.on("uncaughtException", (err) => {
79
+ console.error("Uncaught exception:", err);
80
+ process.exit(1);
81
+ });
82
+ program.parse();
83
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Dependency Manager
3
+ *
4
+ * Handles merging dependencies into package.json and running install commands.
5
+ */
6
+ import { DependencyMap, PackageManager } from "../types/index.js";
7
+ /**
8
+ * Merge dependencies into package.json
9
+ */
10
+ export declare function mergeDependencies(projectPath: string, dependencyMaps: DependencyMap[]): Promise<{
11
+ added: {
12
+ dependencies: string[];
13
+ devDependencies: string[];
14
+ };
15
+ conflicts: string[];
16
+ }>;
17
+ /**
18
+ * Run package manager install
19
+ */
20
+ export declare function runInstall(projectPath: string, packageManager: PackageManager, options?: {
21
+ silent?: boolean;
22
+ }): Promise<void>;
23
+ /**
24
+ * Collect all dependencies from entry and its variants
25
+ */
26
+ export declare function collectDependencies(entry: any, selectedVariant?: string): DependencyMap[];
27
+ //# sourceMappingURL=dependencies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependencies.d.ts","sourceRoot":"","sources":["../../src/installers/dependencies.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAqBlE;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,aAAa,EAAE,GAC9B,OAAO,CAAC;IACT,KAAK,EAAE;QAAE,YAAY,EAAE,MAAM,EAAE,CAAC;QAAC,eAAe,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAC7D,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB,CAAC,CAsID;AAcD;;GAEG;AACH,wBAAsB,UAAU,CAC9B,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,cAAc,EAC9B,OAAO,GAAE;IACP,MAAM,CAAC,EAAE,OAAO,CAAC;CACb,GACL,OAAO,CAAC,IAAI,CAAC,CAgBf;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,GAAG,EACV,eAAe,CAAC,EAAE,MAAM,GACvB,aAAa,EAAE,CAiBjB"}