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.
- package/LICENSE +22 -0
- package/README.md +183 -0
- package/README.npm.md +183 -0
- package/dist/api/client.d.ts +47 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +329 -0
- package/dist/api/client.js.map +1 -0
- package/dist/auth/browser.d.ts +11 -0
- package/dist/auth/browser.d.ts.map +1 -0
- package/dist/auth/browser.js +46 -0
- package/dist/auth/browser.js.map +1 -0
- package/dist/auth/flow.d.ts +28 -0
- package/dist/auth/flow.d.ts.map +1 -0
- package/dist/auth/flow.js +171 -0
- package/dist/auth/flow.js.map +1 -0
- package/dist/auth/storage.d.ts +30 -0
- package/dist/auth/storage.d.ts.map +1 -0
- package/dist/auth/storage.js +112 -0
- package/dist/auth/storage.js.map +1 -0
- package/dist/commands/add.d.ts +8 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +285 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/init.d.ts +8 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +230 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.d.ts +8 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +176 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +83 -0
- package/dist/index.js.map +1 -0
- package/dist/installers/dependencies.d.ts +27 -0
- package/dist/installers/dependencies.d.ts.map +1 -0
- package/dist/installers/dependencies.js +185 -0
- package/dist/installers/dependencies.js.map +1 -0
- package/dist/installers/files.d.ts +50 -0
- package/dist/installers/files.d.ts.map +1 -0
- package/dist/installers/files.js +211 -0
- package/dist/installers/files.js.map +1 -0
- package/dist/installers/install-feature.d.ts +20 -0
- package/dist/installers/install-feature.d.ts.map +1 -0
- package/dist/installers/install-feature.js +169 -0
- package/dist/installers/install-feature.js.map +1 -0
- package/dist/installers/post-install.d.ts +18 -0
- package/dist/installers/post-install.d.ts.map +1 -0
- package/dist/installers/post-install.js +228 -0
- package/dist/installers/post-install.js.map +1 -0
- package/dist/installers/templates.d.ts +22 -0
- package/dist/installers/templates.d.ts.map +1 -0
- package/dist/installers/templates.js +62 -0
- package/dist/installers/templates.js.map +1 -0
- package/dist/registry/loader.d.ts +21 -0
- package/dist/registry/loader.d.ts.map +1 -0
- package/dist/registry/loader.js +83 -0
- package/dist/registry/loader.js.map +1 -0
- package/dist/registry/query.d.ts +55 -0
- package/dist/registry/query.d.ts.map +1 -0
- package/dist/registry/query.js +123 -0
- package/dist/registry/query.js.map +1 -0
- package/dist/types/config.d.ts +85 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +7 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +9 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/registry.d.ts +180 -0
- package/dist/types/registry.d.ts.map +1 -0
- package/dist/types/registry.js +8 -0
- package/dist/types/registry.js.map +1 -0
- package/dist/types/wizard.d.ts +43 -0
- package/dist/types/wizard.d.ts.map +1 -0
- package/dist/types/wizard.js +59 -0
- package/dist/types/wizard.js.map +1 -0
- package/dist/utils/clack-wizard.d.ts +9 -0
- package/dist/utils/clack-wizard.d.ts.map +1 -0
- package/dist/utils/clack-wizard.js +328 -0
- package/dist/utils/clack-wizard.js.map +1 -0
- package/dist/utils/config.d.ts +49 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +121 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/logger.d.ts +56 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +93 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/package-manager.d.ts +41 -0
- package/dist/utils/package-manager.d.ts.map +1 -0
- package/dist/utils/package-manager.js +118 -0
- package/dist/utils/package-manager.js.map +1 -0
- package/dist/utils/prompts.d.ts +22 -0
- package/dist/utils/prompts.d.ts.map +1 -0
- package/dist/utils/prompts.js +142 -0
- package/dist/utils/prompts.js.map +1 -0
- package/dist/utils/validation.d.ts +50 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +108 -0
- package/dist/utils/validation.js.map +1 -0
- 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"}
|