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,328 @@
1
+ import * as p from '@clack/prompts';
2
+ import { execSync } from 'child_process';
3
+ import { existsSync, readdirSync, statSync } from 'fs';
4
+ import { join } from 'path';
5
+ import { normalizeModuleSelection, } from '../types/wizard.js';
6
+ import { createInitialConfig, writeConfig, } from './config.js';
7
+ import { detectPackageManager, detectInvokingPackageManager, } from './package-manager.js';
8
+ import { isNextJsProject, detectProjectStructure } from './validation.js';
9
+ import { installFeature } from '../installers/install-feature.js';
10
+ import { runInstall } from '../installers/dependencies.js';
11
+ import { executePostInstallSteps } from '../installers/post-install.js';
12
+ import { readConfig } from './config.js';
13
+ const CORE_MODULES = ['database', 'email', 'auth', 'payments'];
14
+ function formatModuleLabel(id) {
15
+ switch (id) {
16
+ case 'database':
17
+ return 'Database';
18
+ case 'email':
19
+ return 'Email';
20
+ case 'auth':
21
+ return 'Authentication';
22
+ case 'payments':
23
+ return 'Payments';
24
+ default:
25
+ return id;
26
+ }
27
+ }
28
+ function formatModuleSummary(modules) {
29
+ if (modules.length === 0)
30
+ return 'No modules selected';
31
+ return modules.map((m) => formatModuleLabel(m)).join(', ');
32
+ }
33
+ export async function clackTextInput(message, defaultValue) {
34
+ const result = await p.text({
35
+ message,
36
+ initialValue: defaultValue,
37
+ });
38
+ if (p.isCancel(result)) {
39
+ p.cancel('Operation cancelled.');
40
+ process.exit(0);
41
+ }
42
+ const value = typeof result === 'string' ? result.trim() : undefined;
43
+ return value || defaultValue;
44
+ }
45
+ export async function runInitWizard() {
46
+ p.intro('Tailar Init — Guided Wizard');
47
+ const projectType = await p.select({
48
+ message: 'What kind of project are you building?',
49
+ options: [
50
+ { value: 'saas', label: 'SaaS product' },
51
+ { value: 'ai', label: 'AI product (coming soon)' },
52
+ ],
53
+ });
54
+ if (p.isCancel(projectType)) {
55
+ p.cancel('Initialization cancelled.');
56
+ return null;
57
+ }
58
+ if (projectType === 'ai') {
59
+ p.outro('AI product templates are coming soon. No files were generated.');
60
+ return null;
61
+ }
62
+ const projectName = (await clackTextInput('Project name:', 'my-app')) ?? 'my-app';
63
+ const rawSelection = await p.multiselect({
64
+ message: 'Select modules to include (space to toggle, enter to submit):',
65
+ options: [
66
+ { value: 'database', label: 'Database' },
67
+ { value: 'email', label: 'Email' },
68
+ {
69
+ value: 'auth',
70
+ label: 'Authentication',
71
+ hint: 'requires Database, Email',
72
+ },
73
+ {
74
+ value: 'payments',
75
+ label: 'Payments',
76
+ hint: 'requires Auth, Database, Email (Stripe)',
77
+ },
78
+ ],
79
+ initialValues: [...CORE_MODULES],
80
+ required: false,
81
+ });
82
+ if (p.isCancel(rawSelection)) {
83
+ p.cancel('Initialization cancelled.');
84
+ return null;
85
+ }
86
+ const { modules, autoNotes } = normalizeModuleSelection(rawSelection);
87
+ if (autoNotes.length > 0) {
88
+ p.note(autoNotes.join('\n'), 'Selection adjusted');
89
+ }
90
+ p.note('Storage and Analytics — coming soon.', 'Roadmap');
91
+ const providers = {
92
+ authProvider: 'better-auth',
93
+ };
94
+ if (modules.includes('database')) {
95
+ const db = await p.select({
96
+ message: 'Database provider:',
97
+ options: [
98
+ { value: 'postgres', label: 'PostgreSQL' },
99
+ { value: 'mysql', label: 'MySQL' },
100
+ { value: 'mongodb', label: 'MongoDB' },
101
+ ],
102
+ });
103
+ if (p.isCancel(db)) {
104
+ p.cancel('Initialization cancelled.');
105
+ return null;
106
+ }
107
+ providers.database = db;
108
+ }
109
+ if (modules.includes('email')) {
110
+ const email = await p.select({
111
+ message: 'Email provider:',
112
+ options: [
113
+ { value: 'resend', label: 'Resend' },
114
+ { value: 'postmark', label: 'Postmark' },
115
+ { value: 'sendgrid', label: 'SendGrid' },
116
+ ],
117
+ });
118
+ if (p.isCancel(email)) {
119
+ p.cancel('Initialization cancelled.');
120
+ return null;
121
+ }
122
+ providers.email = email;
123
+ }
124
+ if (modules.includes('auth')) {
125
+ const structure = await p.select({
126
+ message: 'Authentication structure (Better Auth):',
127
+ options: [
128
+ { value: 'org-based', label: 'Organization-based (multi-tenant)' },
129
+ { value: 'user-based', label: 'User-based' },
130
+ ],
131
+ });
132
+ if (p.isCancel(structure)) {
133
+ p.cancel('Initialization cancelled.');
134
+ return null;
135
+ }
136
+ providers.authStructure = structure;
137
+ }
138
+ if (modules.includes('payments')) {
139
+ providers.payments = 'stripe';
140
+ }
141
+ return {
142
+ projectType: 'saas',
143
+ projectName,
144
+ modules,
145
+ providers,
146
+ };
147
+ }
148
+ export async function runGenerationFromWizardConfig(projectPath, wizard) {
149
+ p.intro('Scaffolding Tailar SaaS project...');
150
+ const invokingPM = detectInvokingPackageManager();
151
+ const beforeTime = Date.now();
152
+ const projectName = wizard.projectName || 'my-app';
153
+ const projectNameInput = `echo "${projectName}"`;
154
+ let fullCommand;
155
+ if (invokingPM === 'pnpm') {
156
+ fullCommand = `${projectNameInput} | pnpm dlx shadcn@latest init -t next -y -d`;
157
+ }
158
+ else if (invokingPM === 'yarn') {
159
+ fullCommand = `${projectNameInput} | yarn dlx shadcn@latest init -t next -y -d`;
160
+ }
161
+ else if (invokingPM === 'bun') {
162
+ fullCommand = `${projectNameInput} | bunx shadcn@latest init -t next -y -d`;
163
+ }
164
+ else {
165
+ fullCommand = `${projectNameInput} | npx --yes shadcn@latest init -t next -y -d`;
166
+ }
167
+ const baseSpinner = p.spinner();
168
+ baseSpinner.start('Creating Next.js + shadcn project...');
169
+ try {
170
+ execSync(fullCommand, {
171
+ cwd: projectPath,
172
+ stdio: 'inherit',
173
+ shell: '/bin/sh',
174
+ });
175
+ }
176
+ catch {
177
+ baseSpinner.stop('Failed to create Next.js project.');
178
+ throw new Error('shadcn init failed');
179
+ }
180
+ baseSpinner.stop('Base project created.');
181
+ const afterTime = Date.now();
182
+ const timeThreshold = beforeTime - 10000;
183
+ const dirs = readdirSync(projectPath)
184
+ .filter((file) => {
185
+ const fullPath = join(projectPath, file);
186
+ return (existsSync(fullPath) &&
187
+ statSync(fullPath).isDirectory() &&
188
+ !file.startsWith('.') &&
189
+ file !== 'node_modules');
190
+ })
191
+ .map((dir) => {
192
+ const fullPath = join(projectPath, dir);
193
+ const stats = statSync(fullPath);
194
+ const mtime = stats.mtime.getTime();
195
+ const isRecentlyCreated = mtime >= timeThreshold && mtime <= afterTime + 5000;
196
+ return { name: dir, path: fullPath, mtime, isRecentlyCreated };
197
+ })
198
+ .sort((a, b) => {
199
+ if (a.isRecentlyCreated && !b.isRecentlyCreated)
200
+ return -1;
201
+ if (!a.isRecentlyCreated && b.isRecentlyCreated)
202
+ return 1;
203
+ return b.mtime - a.mtime;
204
+ });
205
+ let actualProjectPath = projectPath;
206
+ let detectedProjectName;
207
+ for (const dirInfo of dirs) {
208
+ if (await isNextJsProject(dirInfo.path)) {
209
+ actualProjectPath = dirInfo.path;
210
+ detectedProjectName = dirInfo.name;
211
+ process.chdir(actualProjectPath);
212
+ break;
213
+ }
214
+ }
215
+ if (!(await isNextJsProject(actualProjectPath))) {
216
+ p.outro('Could not find the initialized Next.js project.');
217
+ process.exit(1);
218
+ }
219
+ const structure = detectProjectStructure(actualProjectPath);
220
+ const packageManager = detectPackageManager(actualProjectPath);
221
+ const baseConfig = createInitialConfig({
222
+ name: detectedProjectName ?? projectName,
223
+ hasSrcFolder: structure.hasSrcFolder,
224
+ hasAppFolder: structure.hasAppFolder,
225
+ });
226
+ const meta = {
227
+ projectType: wizard.projectType,
228
+ modules: wizard.modules,
229
+ providers: wizard.providers,
230
+ packageManager,
231
+ };
232
+ const mergedConfig = {
233
+ ...baseConfig,
234
+ ...meta,
235
+ };
236
+ await writeConfig(actualProjectPath, mergedConfig);
237
+ const allPostInstall = [];
238
+ let needsInstall = false;
239
+ const runInstallStep = async (label, fn) => {
240
+ const sp = p.spinner();
241
+ sp.start(label);
242
+ try {
243
+ const r = await fn();
244
+ allPostInstall.push(...r.postInstallSteps);
245
+ if (r.hasDependencies)
246
+ needsInstall = true;
247
+ sp.stop(label.replace('…', '') + ' done.');
248
+ }
249
+ catch (e) {
250
+ sp.stop('Failed: ' + label);
251
+ throw e;
252
+ }
253
+ };
254
+ await runInstallStep('Installing Shared UI (Tailar base)…', () => installFeature(actualProjectPath, 'shared', { yes: true }));
255
+ await runInstallStep('Installing i18n (next-intl)…', () => installFeature(actualProjectPath, 'i18n', { yes: true }));
256
+ if (wizard.modules.includes('database') && wizard.providers.database) {
257
+ await runInstallStep('Installing Database (Prisma)…', () => installFeature(actualProjectPath, 'db', {
258
+ yes: true,
259
+ presetAnswers: { dbProvider: wizard.providers.database },
260
+ }));
261
+ }
262
+ if (wizard.modules.includes('email') && wizard.providers.email) {
263
+ await runInstallStep('Installing Email…', () => installFeature(actualProjectPath, 'emails', {
264
+ yes: true,
265
+ presetAnswers: { emailProvider: wizard.providers.email },
266
+ }));
267
+ }
268
+ if (wizard.modules.includes('auth') && wizard.providers.authStructure) {
269
+ await runInstallStep('Installing Authentication (Better Auth)…', () => installFeature(actualProjectPath, 'auth', {
270
+ yes: true,
271
+ presetAnswers: {
272
+ organizationBased: wizard.providers.authStructure === 'org-based',
273
+ },
274
+ }));
275
+ }
276
+ if (wizard.modules.includes('payments')) {
277
+ await runInstallStep('Installing Payments (Stripe)…', () => installFeature(actualProjectPath, 'payments', { yes: true }));
278
+ }
279
+ let sidebarVariant = 'default';
280
+ if (wizard.modules.includes('auth') && wizard.providers.authStructure) {
281
+ sidebarVariant =
282
+ wizard.providers.authStructure === 'org-based' ? 'org-based' : 'user-based';
283
+ }
284
+ await runInstallStep('Installing App Sidebar…', () => installFeature(actualProjectPath, 'app-sidebar', {
285
+ yes: true,
286
+ variant: sidebarVariant,
287
+ }));
288
+ if (wizard.modules.includes('auth')) {
289
+ await runInstallStep('Applying SaaS root page template…', () => installFeature(actualProjectPath, 'saas', {
290
+ yes: true,
291
+ }));
292
+ }
293
+ if (needsInstall) {
294
+ const sp = p.spinner();
295
+ sp.start('Installing npm dependencies…');
296
+ await runInstall(actualProjectPath, packageManager, { silent: true });
297
+ sp.stop('Dependencies installed.');
298
+ }
299
+ const config = await readConfig(actualProjectPath);
300
+ if (config && allPostInstall.length > 0) {
301
+ const ctx = {
302
+ root: actualProjectPath,
303
+ packageManager,
304
+ structure,
305
+ config,
306
+ };
307
+ await executePostInstallSteps(actualProjectPath, allPostInstall, ctx);
308
+ }
309
+ p.outro([
310
+ 'Tailar SaaS project created successfully.',
311
+ '',
312
+ `Project directory: ${detectedProjectName ?? projectName}`,
313
+ `Modules: ${formatModuleSummary(wizard.modules)}`,
314
+ ].join('\n'));
315
+ const pmRunDev = packageManager === 'yarn'
316
+ ? 'yarn dev'
317
+ : packageManager === 'pnpm'
318
+ ? 'pnpm dev'
319
+ : packageManager === 'bun'
320
+ ? 'bun dev'
321
+ : 'npm run dev';
322
+ console.log('');
323
+ console.log('Next steps:');
324
+ console.log(` • cd ${detectedProjectName ?? projectName}`);
325
+ console.log(` • ${pmRunDev}`);
326
+ return { projectRoot: actualProjectPath, packageManager };
327
+ }
328
+ //# sourceMappingURL=clack-wizard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clack-wizard.js","sourceRoot":"","sources":["../../src/utils/clack-wizard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Configuration Management
3
+ *
4
+ * Handles reading and writing the .tailar.json configuration file.
5
+ */
6
+ import { ProjectConfig } from '../types/index.js';
7
+ /**
8
+ * Read project configuration
9
+ */
10
+ export declare function readConfig(projectPath: string): Promise<ProjectConfig | null>;
11
+ /**
12
+ * Write project configuration
13
+ */
14
+ export declare function writeConfig(projectPath: string, config: ProjectConfig): Promise<void>;
15
+ /**
16
+ * Create initial configuration
17
+ */
18
+ export declare function createInitialConfig(options: {
19
+ name?: string;
20
+ hasSrcFolder: boolean;
21
+ hasAppFolder: boolean;
22
+ }): ProjectConfig;
23
+ /**
24
+ * Check if item is already installed
25
+ */
26
+ export declare function isInstalled(config: ProjectConfig, type: 'feature' | 'block' | 'component' | 'template', name: string): boolean;
27
+ /**
28
+ * Add installed item to config
29
+ */
30
+ export declare function addInstalledItem(config: ProjectConfig, type: 'feature' | 'block' | 'component' | 'template', name: string, metadata?: {
31
+ variant?: string;
32
+ provider?: string;
33
+ }): ProjectConfig;
34
+ /**
35
+ * Remove installed item from config
36
+ */
37
+ export declare function removeInstalledItem(config: ProjectConfig, type: 'feature' | 'block' | 'component', name: string): ProjectConfig;
38
+ /**
39
+ * Get installed items by type
40
+ */
41
+ export declare function getInstalledItems(config: ProjectConfig, type: 'feature' | 'block' | 'component'): string[];
42
+ /**
43
+ * Get installed item metadata
44
+ */
45
+ export declare function getInstalledItemMetadata(config: ProjectConfig, type: 'feature' | 'block' | 'component', name: string): {
46
+ name: string;
47
+ installedAt: string;
48
+ } | undefined;
49
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAIlD;;GAEG;AACH,wBAAsB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAanF;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,IAAI,CAAC,CASf;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;CACvB,GAAG,aAAa,CAehB;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,WAAW,GAAG,UAAU,EACpD,IAAI,EAAE,MAAM,GACX,OAAO,CAIT;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,WAAW,GAAG,UAAU,EACpD,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE;IACT,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GACA,aAAa,CA8Bf;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,WAAW,EACvC,IAAI,EAAE,MAAM,GACX,aAAa,CAWf;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,WAAW,GACtC,MAAM,EAAE,CAEV;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,WAAW,EACvC,IAAI,EAAE,MAAM;;;cAIb"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Configuration Management
3
+ *
4
+ * Handles reading and writing the .tailar.json configuration file.
5
+ */
6
+ import { readFile, writeFile } from 'fs/promises';
7
+ import { existsSync } from 'fs';
8
+ import { join } from 'path';
9
+ const CONFIG_FILENAME = '.tailar.json';
10
+ /**
11
+ * Read project configuration
12
+ */
13
+ export async function readConfig(projectPath) {
14
+ const configPath = join(projectPath, CONFIG_FILENAME);
15
+ if (!existsSync(configPath)) {
16
+ return null;
17
+ }
18
+ try {
19
+ const content = await readFile(configPath, 'utf-8');
20
+ return JSON.parse(content);
21
+ }
22
+ catch (error) {
23
+ throw new Error(`Failed to read config: ${error}`);
24
+ }
25
+ }
26
+ /**
27
+ * Write project configuration
28
+ */
29
+ export async function writeConfig(projectPath, config) {
30
+ const configPath = join(projectPath, CONFIG_FILENAME);
31
+ try {
32
+ const content = JSON.stringify(config, null, 2);
33
+ await writeFile(configPath, content, 'utf-8');
34
+ }
35
+ catch (error) {
36
+ throw new Error(`Failed to write config: ${error}`);
37
+ }
38
+ }
39
+ /**
40
+ * Create initial configuration
41
+ */
42
+ export function createInitialConfig(options) {
43
+ return {
44
+ name: options.name,
45
+ version: '0.1.0',
46
+ installed: {
47
+ features: [],
48
+ blocks: [],
49
+ components: [],
50
+ templates: [],
51
+ },
52
+ structure: {
53
+ hasSrcFolder: options.hasSrcFolder,
54
+ hasAppFolder: options.hasAppFolder,
55
+ },
56
+ };
57
+ }
58
+ /**
59
+ * Check if item is already installed
60
+ */
61
+ export function isInstalled(config, type, name) {
62
+ const key = `${type}s`;
63
+ const collection = config.installed[key] ?? [];
64
+ return collection.some(item => item.name === name);
65
+ }
66
+ /**
67
+ * Add installed item to config
68
+ */
69
+ export function addInstalledItem(config, type, name, metadata) {
70
+ const key = `${type}s`;
71
+ const collection = config.installed[key] ?? [];
72
+ // Remove existing entry if present
73
+ const filtered = collection.filter(item => item.name !== name);
74
+ // Add new entry
75
+ const newEntry = {
76
+ name,
77
+ installedAt: new Date().toISOString(),
78
+ };
79
+ if (metadata?.variant) {
80
+ newEntry.variant = metadata.variant;
81
+ }
82
+ if (metadata?.provider) {
83
+ newEntry.provider = metadata.provider;
84
+ }
85
+ filtered.push(newEntry);
86
+ return {
87
+ ...config,
88
+ installed: {
89
+ ...config.installed,
90
+ [`${type}s`]: filtered,
91
+ },
92
+ };
93
+ }
94
+ /**
95
+ * Remove installed item from config
96
+ */
97
+ export function removeInstalledItem(config, type, name) {
98
+ const collection = config.installed[`${type}s`];
99
+ const filtered = collection.filter(item => item.name !== name);
100
+ return {
101
+ ...config,
102
+ installed: {
103
+ ...config.installed,
104
+ [`${type}s`]: filtered,
105
+ },
106
+ };
107
+ }
108
+ /**
109
+ * Get installed items by type
110
+ */
111
+ export function getInstalledItems(config, type) {
112
+ return config.installed[`${type}s`].map(item => item.name);
113
+ }
114
+ /**
115
+ * Get installed item metadata
116
+ */
117
+ export function getInstalledItemMetadata(config, type, name) {
118
+ const collection = config.installed[`${type}s`];
119
+ return collection.find(item => item.name === name);
120
+ }
121
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Logger Utility
3
+ *
4
+ * Provides colored console output and loading spinners.
5
+ */
6
+ import { Ora } from 'ora';
7
+ /**
8
+ * Log levels
9
+ */
10
+ export declare const logger: {
11
+ /**
12
+ * Success message (green)
13
+ */
14
+ success(message: string): void;
15
+ /**
16
+ * Error message (red)
17
+ */
18
+ error(message: string): void;
19
+ /**
20
+ * Warning message (yellow)
21
+ */
22
+ warn(message: string): void;
23
+ /**
24
+ * Info message (blue)
25
+ */
26
+ info(message: string): void;
27
+ /**
28
+ * Plain message
29
+ */
30
+ log(message: string): void;
31
+ /**
32
+ * Section header
33
+ */
34
+ header(message: string): void;
35
+ /**
36
+ * Create a loading spinner
37
+ */
38
+ spinner(text: string): Ora;
39
+ /**
40
+ * Break line
41
+ */
42
+ break(): void;
43
+ };
44
+ /**
45
+ * Format a list of items
46
+ */
47
+ export declare function formatList(items: string[]): string;
48
+ /**
49
+ * Format key-value pairs
50
+ */
51
+ export declare function formatKeyValue(pairs: Record<string, string>): string;
52
+ /**
53
+ * Create a box around text
54
+ */
55
+ export declare function box(text: string): string;
56
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAY,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE/B;;GAEG;AACH,eAAO,MAAM,MAAM;IACjB;;OAEG;qBACc,MAAM,GAAG,IAAI;IAI9B;;OAEG;mBACY,MAAM,GAAG,IAAI;IAI5B;;OAEG;kBACW,MAAM,GAAG,IAAI;IAI3B;;OAEG;kBACW,MAAM,GAAG,IAAI;IAI3B;;OAEG;iBACU,MAAM,GAAG,IAAI;IAI1B;;OAEG;oBACa,MAAM,GAAG,IAAI;IAM7B;;OAEG;kBACW,MAAM,GAAG,GAAG;IAI1B;;OAEG;aACM,IAAI;CAGd,CAAC;AAEF;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAElD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAQpE;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAUxC"}