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,112 @@
1
+ /**
2
+ * Auth Storage Module
3
+ *
4
+ * Handles storing and retrieving CLI authentication tokens
5
+ * Platform-specific path resolution for credentials file
6
+ */
7
+ import { readFile, writeFile, mkdir, unlink } from "fs/promises";
8
+ import { existsSync } from "fs";
9
+ import { join } from "path";
10
+ import { homedir } from "os";
11
+ import { logger } from "../utils/logger.js";
12
+ const CREDENTIALS_FILENAME = "credentials.json";
13
+ /**
14
+ * Get platform-specific credentials directory path
15
+ */
16
+ function getCredentialsDir() {
17
+ const platform = process.platform;
18
+ if (platform === "win32") {
19
+ // Windows: %APPDATA%/tailar
20
+ const appData = process.env.APPDATA;
21
+ if (!appData) {
22
+ throw new Error("APPDATA environment variable not set");
23
+ }
24
+ return join(appData, "tailar");
25
+ }
26
+ else {
27
+ // macOS/Linux: ~/.tailar
28
+ return join(homedir(), ".tailar");
29
+ }
30
+ }
31
+ /**
32
+ * Get full path to credentials file
33
+ */
34
+ function getCredentialsPath() {
35
+ return join(getCredentialsDir(), CREDENTIALS_FILENAME);
36
+ }
37
+ /**
38
+ * Read stored token from credentials file
39
+ */
40
+ export async function getStoredToken() {
41
+ const credentialsPath = getCredentialsPath();
42
+ if (!existsSync(credentialsPath)) {
43
+ return null;
44
+ }
45
+ try {
46
+ const content = await readFile(credentialsPath, "utf-8");
47
+ const tokenData = JSON.parse(content);
48
+ // Validate structure
49
+ if (!tokenData.accessToken ||
50
+ !tokenData.refreshToken ||
51
+ !tokenData.expiresAt) {
52
+ logger.warn("Invalid token data structure, clearing credentials");
53
+ await clearToken();
54
+ return null;
55
+ }
56
+ return tokenData;
57
+ }
58
+ catch (error) {
59
+ logger.warn(`Failed to read credentials: ${error}`);
60
+ return null;
61
+ }
62
+ }
63
+ /**
64
+ * Save token to credentials file
65
+ */
66
+ export async function saveToken(tokenData) {
67
+ const credentialsDir = getCredentialsDir();
68
+ const credentialsPath = getCredentialsPath();
69
+ try {
70
+ // Ensure directory exists
71
+ if (!existsSync(credentialsDir)) {
72
+ await mkdir(credentialsDir, { recursive: true });
73
+ }
74
+ // Write token data
75
+ const content = JSON.stringify(tokenData, null, 2);
76
+ await writeFile(credentialsPath, content, "utf-8");
77
+ // Set restrictive permissions (owner read/write only)
78
+ if (process.platform !== "win32") {
79
+ await import("fs/promises").then((fs) => fs.chmod(credentialsPath, 0o600));
80
+ }
81
+ }
82
+ catch (error) {
83
+ throw new Error(`Failed to save credentials: ${error}`);
84
+ }
85
+ }
86
+ /**
87
+ * Clear stored token (delete credentials file)
88
+ */
89
+ export async function clearToken() {
90
+ const credentialsPath = getCredentialsPath();
91
+ if (existsSync(credentialsPath)) {
92
+ try {
93
+ await unlink(credentialsPath);
94
+ }
95
+ catch (error) {
96
+ logger.warn(`Failed to delete credentials file: ${error}`);
97
+ }
98
+ }
99
+ }
100
+ /**
101
+ * Check if token exists and is not expired
102
+ */
103
+ export function isTokenValid(tokenData) {
104
+ if (!tokenData) {
105
+ return false;
106
+ }
107
+ // Check if token is expired (with 5 minute buffer)
108
+ const now = Math.floor(Date.now() / 1000);
109
+ const buffer = 5 * 60; // 5 minutes in seconds
110
+ return tokenData.expiresAt > now + buffer;
111
+ }
112
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/auth/storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Add Command
3
+ *
4
+ * Add features, blocks, or components to the project.
5
+ */
6
+ import { Command } from "commander";
7
+ export declare const addCommand: Command;
8
+ //# sourceMappingURL=add.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkCpC,eAAO,MAAM,UAAU,SAsKnB,CAAC"}
@@ -0,0 +1,285 @@
1
+ /**
2
+ * Add Command
3
+ *
4
+ * Add features, blocks, or components to the project.
5
+ */
6
+ import { Command } from "commander";
7
+ import { logger } from "../utils/logger.js";
8
+ import { readConfig, writeConfig, isInstalled, addInstalledItem, } from "../utils/config.js";
9
+ import { detectPackageManager } from "../utils/package-manager.js";
10
+ import { detectProjectStructure } from "../utils/validation.js";
11
+ import { loadRegistry } from "../registry/loader.js";
12
+ import { getEntry, getVariant, } from "../registry/query.js";
13
+ import * as p from "@clack/prompts";
14
+ import { confirm, runPrompts } from "../utils/prompts.js";
15
+ import { installFiles } from "../installers/files.js";
16
+ import { mergeDependencies, runInstall, collectDependencies, } from "../installers/dependencies.js";
17
+ import { executePostInstallSteps } from "../installers/post-install.js";
18
+ import { collectTemplateVariables, extractVariablesFromAnswers, mergeVariables, } from "../installers/templates.js";
19
+ import { isAuthenticated, authenticate } from "../auth/flow.js";
20
+ import { checkSubscription } from "../api/client.js";
21
+ export const addCommand = new Command("add")
22
+ .description("Add a feature, block, or component")
23
+ .argument("<name>", "Name of the feature, block, or component to add")
24
+ .option("-y, --yes", "Skip prompts and use defaults")
25
+ .option("--variant <variant>", "Specify variant")
26
+ .option("--provider <provider>", "Specify provider")
27
+ .option("--force", "Force reinstall even if already installed")
28
+ .action(async (name, options) => {
29
+ try {
30
+ const projectPath = process.cwd();
31
+ // Check if initialized
32
+ const config = await readConfig(projectPath);
33
+ if (!config) {
34
+ logger.error("Tailar not initialized. Run `tailar init` first.");
35
+ process.exit(1);
36
+ }
37
+ // Detect project structure and package manager
38
+ const structure = detectProjectStructure(projectPath);
39
+ const packageManager = detectPackageManager(projectPath);
40
+ const context = {
41
+ root: projectPath,
42
+ packageManager,
43
+ structure,
44
+ config,
45
+ };
46
+ // Load registry
47
+ logger.info("Loading registry...");
48
+ const registry = await loadRegistry();
49
+ // Find entry
50
+ const entry = getEntry(registry, name);
51
+ if (!entry) {
52
+ logger.error(`Not found: ${name}`);
53
+ logger.info("Run `tailar list` to see available items");
54
+ process.exit(1);
55
+ }
56
+ logger.header(`📦 Adding ${entry.label}`);
57
+ if (!options.yes) {
58
+ p.intro(`Tailar add — ${entry.label}`);
59
+ }
60
+ // Check if component requires subscription
61
+ const requiresSubscription = entry.requiresSubscription === true &&
62
+ (entry.subscriptionTier || 0) > 0;
63
+ // Always check subscription for paid components - no exceptions
64
+ if (requiresSubscription) {
65
+ // Check authentication first - this is mandatory for paid components
66
+ if (!(await isAuthenticated())) {
67
+ logger.info("Authentication required for this component.");
68
+ logger.break();
69
+ await authenticate();
70
+ logger.break();
71
+ }
72
+ // Verify subscription access via API
73
+ logger.info("Verifying subscription access...");
74
+ // Don't pass registry entry here - force API check with authentication
75
+ const accessCheck = await checkSubscription(entry.type, name);
76
+ if (!accessCheck.accessible) {
77
+ logger.error(`Access denied: ${accessCheck.reason || "Subscription required"}`);
78
+ logger.break();
79
+ logger.info("Visit https://tailar.dev/choose-plan to upgrade your subscription.");
80
+ process.exit(1);
81
+ }
82
+ logger.success("Subscription verified");
83
+ }
84
+ // Check if already installed
85
+ if (isInstalled(config, entry.type, name) && !options.force) {
86
+ logger.warn(`${entry.label} is already installed`);
87
+ const reinstall = options.yes || (await confirm("Reinstall?", false));
88
+ if (!reinstall) {
89
+ logger.info("Cancelled");
90
+ process.exit(0);
91
+ }
92
+ }
93
+ // Check and install feature dependencies
94
+ const allPostInstallSteps = [];
95
+ let needsPackageInstall = false;
96
+ if (entry.featureDependencies && entry.featureDependencies.length > 0) {
97
+ logger.info("Checking dependencies...");
98
+ const missingDeps = entry.featureDependencies.filter((dep) => !isInstalled(config, "feature", dep));
99
+ if (missingDeps.length > 0) {
100
+ logger.warn(`Missing required features: ${missingDeps.join(", ")}`);
101
+ const installDeps = options.yes ||
102
+ (await confirm("Install missing dependencies?", true));
103
+ if (!installDeps) {
104
+ logger.error("Cannot proceed without dependencies");
105
+ process.exit(1);
106
+ }
107
+ // Install dependencies recursively and collect post-install steps
108
+ for (const depName of missingDeps) {
109
+ logger.info(`Installing dependency: ${depName}`);
110
+ const result = await installEntry(depName, context, registry, options);
111
+ allPostInstallSteps.push(...result.postInstallSteps);
112
+ if (result.hasDependencies) {
113
+ needsPackageInstall = true;
114
+ }
115
+ }
116
+ }
117
+ }
118
+ // Install the entry and collect its post-install steps
119
+ const entryResult = await installEntry(name, context, registry, options);
120
+ allPostInstallSteps.push(...entryResult.postInstallSteps);
121
+ if (entryResult.hasDependencies) {
122
+ needsPackageInstall = true;
123
+ }
124
+ // Run package manager install once if any dependencies were added
125
+ if (needsPackageInstall) {
126
+ logger.info("Installing packages...");
127
+ const installSpinner = logger.spinner(`Running ${context.packageManager} install...`);
128
+ await runInstall(context.root, context.packageManager, {
129
+ silent: true,
130
+ });
131
+ installSpinner.succeed("Packages installed");
132
+ }
133
+ // Execute all collected post-install steps together
134
+ if (allPostInstallSteps.length > 0) {
135
+ logger.info("Running post-install steps...");
136
+ await executePostInstallSteps(context.root, allPostInstallSteps, context);
137
+ }
138
+ logger.break();
139
+ logger.success(`✨ ${entry.label} added successfully!`);
140
+ logger.break();
141
+ }
142
+ catch (error) {
143
+ logger.error(`Failed to add: ${error}`);
144
+ process.exit(1);
145
+ }
146
+ });
147
+ /**
148
+ * Install a single entry (feature, block, or component)
149
+ * Returns post-install steps and dependency info
150
+ */
151
+ async function installEntry(name, context, registry, options) {
152
+ const entry = getEntry(registry, name);
153
+ if (!entry) {
154
+ throw new Error(`Entry not found: ${name}`);
155
+ }
156
+ // Run prompts if any
157
+ let answers = {};
158
+ if (entry.questions && entry.questions.length > 0 && !options.yes) {
159
+ logger.info("Configuration:");
160
+ answers = await runPrompts(entry.questions, {
161
+ skipPrompts: options.yes,
162
+ defaults: {
163
+ variant: options.variant,
164
+ provider: options.provider,
165
+ },
166
+ });
167
+ }
168
+ // Determine variant using registry's variantResolver (data-driven)
169
+ let selectedVariant;
170
+ if (options.variant) {
171
+ // Explicit variant from command line
172
+ selectedVariant = options.variant;
173
+ }
174
+ else if (answers.variant) {
175
+ // Direct variant answer from prompts
176
+ selectedVariant = answers.variant;
177
+ }
178
+ else if (entry.variantResolver) {
179
+ // Use registry's variant resolver for generic resolution
180
+ const resolver = entry.variantResolver;
181
+ // Check if we should detect from installed features
182
+ if (resolver.detect && context.config) {
183
+ const featureToDetect = resolver.detect;
184
+ const installedFeature = context.config.installed.features.find((f) => f.name === featureToDetect);
185
+ if (installedFeature?.variant) {
186
+ // Apply mapping if exists, otherwise use variant directly
187
+ if (resolver.mapping) {
188
+ const mappedValue = resolver.mapping[installedFeature.variant];
189
+ selectedVariant = mappedValue || installedFeature.variant;
190
+ }
191
+ else {
192
+ selectedVariant = installedFeature.variant;
193
+ }
194
+ }
195
+ }
196
+ // Fallback to answerKey if detect didn't work
197
+ if (!selectedVariant && resolver.answerKey) {
198
+ const answerValue = options.provider || answers[resolver.answerKey];
199
+ if (answerValue !== undefined) {
200
+ // Apply mapping if exists, otherwise use value directly
201
+ if (resolver.mapping) {
202
+ const mappedValue = resolver.mapping[String(answerValue)];
203
+ selectedVariant = mappedValue || String(answerValue);
204
+ }
205
+ else {
206
+ selectedVariant = String(answerValue);
207
+ }
208
+ }
209
+ }
210
+ // Fallback to default variant
211
+ if (!selectedVariant && resolver.default) {
212
+ selectedVariant = resolver.default;
213
+ }
214
+ }
215
+ // Get variant if applicable
216
+ const variant = selectedVariant
217
+ ? getVariant(entry, selectedVariant)
218
+ : undefined;
219
+ // Collect template variables
220
+ let templateVars = {};
221
+ if (entry.templates && entry.templates.length > 0) {
222
+ templateVars = await collectTemplateVariables(entry.templates, {
223
+ skipPrompts: options.yes,
224
+ });
225
+ }
226
+ // Merge variables from answers
227
+ const answerVars = extractVariablesFromAnswers(answers);
228
+ const allVars = mergeVariables(templateVars, answerVars);
229
+ // Collect files (base + variant)
230
+ let files = [...entry.files];
231
+ if (variant?.files) {
232
+ files.push(...variant.files);
233
+ }
234
+ // Install files
235
+ logger.info("Installing files...");
236
+ const spinner = logger.spinner("Copying files...");
237
+ const result = await installFiles(context.root, files, context, allVars, {
238
+ overwrite: options.force || options.yes,
239
+ componentType: entry.type,
240
+ componentName: entry.name,
241
+ variant: selectedVariant,
242
+ registryEntry: entry, // Pass registry entry to skip auth for free components
243
+ });
244
+ if (result.conflicts.length > 0 && !options.force) {
245
+ spinner.fail("File conflicts detected");
246
+ logger.error("The following files already exist:");
247
+ result.conflicts.forEach((file) => logger.error(` ${file}`));
248
+ logger.info("Use --force to overwrite");
249
+ throw new Error("File conflicts detected");
250
+ }
251
+ spinner.succeed(`Installed ${result.installed.length} files`);
252
+ // Collect and merge dependencies (but don't run install yet)
253
+ const deps = collectDependencies(entry, selectedVariant);
254
+ let hasDependencies = false;
255
+ if (deps.length > 0) {
256
+ logger.info("Updating dependencies...");
257
+ const depResult = await mergeDependencies(context.root, deps);
258
+ logger.success(`Added ${depResult.added.dependencies.length} dependencies, ` +
259
+ `${depResult.added.devDependencies.length} devDependencies`);
260
+ if (depResult.conflicts.length > 0) {
261
+ logger.warn("Dependency version conflicts:");
262
+ depResult.conflicts.forEach((conflict) => logger.warn(` ${conflict}`));
263
+ }
264
+ hasDependencies = true;
265
+ }
266
+ // Collect post-install steps (don't execute yet)
267
+ const postInstallSteps = [
268
+ ...(entry.postInstall || []),
269
+ ...(variant?.postInstall || []),
270
+ ];
271
+ // Update config
272
+ if (!context.config) {
273
+ throw new Error("Project config not found");
274
+ }
275
+ const updatedConfig = addInstalledItem(context.config, entry.type, name, {
276
+ variant: selectedVariant,
277
+ provider: options.provider || answers.emailProvider || answers.dbProvider,
278
+ });
279
+ await writeConfig(context.root, updatedConfig);
280
+ context.config = updatedConfig;
281
+ logger.success(`${entry.label} installed`);
282
+ // Return post-install steps and dependency info
283
+ return { postInstallSteps, hasDependencies };
284
+ }
285
+ //# sourceMappingURL=add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
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
+ export declare const initCommand: Command;
8
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqCpC,eAAO,MAAM,WAAW,SAkSpB,CAAC"}