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,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logger Utility
|
|
3
|
+
*
|
|
4
|
+
* Provides colored console output and loading spinners.
|
|
5
|
+
*/
|
|
6
|
+
import chalk from 'chalk';
|
|
7
|
+
import ora from 'ora';
|
|
8
|
+
/**
|
|
9
|
+
* Log levels
|
|
10
|
+
*/
|
|
11
|
+
export const logger = {
|
|
12
|
+
/**
|
|
13
|
+
* Success message (green)
|
|
14
|
+
*/
|
|
15
|
+
success(message) {
|
|
16
|
+
console.log(chalk.green('✓'), message);
|
|
17
|
+
},
|
|
18
|
+
/**
|
|
19
|
+
* Error message (red)
|
|
20
|
+
*/
|
|
21
|
+
error(message) {
|
|
22
|
+
console.log(chalk.red('✗'), message);
|
|
23
|
+
},
|
|
24
|
+
/**
|
|
25
|
+
* Warning message (yellow)
|
|
26
|
+
*/
|
|
27
|
+
warn(message) {
|
|
28
|
+
console.log(chalk.yellow('⚠'), message);
|
|
29
|
+
},
|
|
30
|
+
/**
|
|
31
|
+
* Info message (blue)
|
|
32
|
+
*/
|
|
33
|
+
info(message) {
|
|
34
|
+
console.log(chalk.blue('ℹ'), message);
|
|
35
|
+
},
|
|
36
|
+
/**
|
|
37
|
+
* Plain message
|
|
38
|
+
*/
|
|
39
|
+
log(message) {
|
|
40
|
+
console.log(message);
|
|
41
|
+
},
|
|
42
|
+
/**
|
|
43
|
+
* Section header
|
|
44
|
+
*/
|
|
45
|
+
header(message) {
|
|
46
|
+
console.log();
|
|
47
|
+
console.log(chalk.bold.cyan(message));
|
|
48
|
+
console.log();
|
|
49
|
+
},
|
|
50
|
+
/**
|
|
51
|
+
* Create a loading spinner
|
|
52
|
+
*/
|
|
53
|
+
spinner(text) {
|
|
54
|
+
return ora(text).start();
|
|
55
|
+
},
|
|
56
|
+
/**
|
|
57
|
+
* Break line
|
|
58
|
+
*/
|
|
59
|
+
break() {
|
|
60
|
+
console.log();
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* Format a list of items
|
|
65
|
+
*/
|
|
66
|
+
export function formatList(items) {
|
|
67
|
+
return items.map(item => ` • ${item}`).join('\n');
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Format key-value pairs
|
|
71
|
+
*/
|
|
72
|
+
export function formatKeyValue(pairs) {
|
|
73
|
+
const maxKeyLength = Math.max(...Object.keys(pairs).map(k => k.length));
|
|
74
|
+
return Object.entries(pairs)
|
|
75
|
+
.map(([key, value]) => {
|
|
76
|
+
const paddedKey = key.padEnd(maxKeyLength);
|
|
77
|
+
return ` ${chalk.dim(paddedKey)} ${value}`;
|
|
78
|
+
})
|
|
79
|
+
.join('\n');
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Create a box around text
|
|
83
|
+
*/
|
|
84
|
+
export function box(text) {
|
|
85
|
+
const lines = text.split('\n');
|
|
86
|
+
const maxLength = Math.max(...lines.map(l => l.length));
|
|
87
|
+
const border = '─'.repeat(maxLength + 4);
|
|
88
|
+
const top = `┌${border}┐`;
|
|
89
|
+
const bottom = `└${border}┘`;
|
|
90
|
+
const content = lines.map(line => `│ ${line.padEnd(maxLength)} │`).join('\n');
|
|
91
|
+
return `${top}\n${content}\n${bottom}`;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Package Manager Detection
|
|
3
|
+
*
|
|
4
|
+
* Detects which package manager is being used in the project
|
|
5
|
+
* and provides appropriate commands.
|
|
6
|
+
*/
|
|
7
|
+
import { PackageManager } from '../types/index.js';
|
|
8
|
+
/**
|
|
9
|
+
* Detect package manager from lock files
|
|
10
|
+
*/
|
|
11
|
+
export declare function detectPackageManager(projectPath: string): PackageManager;
|
|
12
|
+
/**
|
|
13
|
+
* Get install command for package manager
|
|
14
|
+
*/
|
|
15
|
+
export declare function getInstallCommand(pm: PackageManager): string;
|
|
16
|
+
/**
|
|
17
|
+
* Get dev install command for package manager
|
|
18
|
+
*/
|
|
19
|
+
export declare function getDevInstallCommand(pm: PackageManager): string;
|
|
20
|
+
/**
|
|
21
|
+
* Get run command for package manager
|
|
22
|
+
*/
|
|
23
|
+
export declare function getRunCommand(pm: PackageManager, script: string): string;
|
|
24
|
+
/**
|
|
25
|
+
* Get execute command for package manager (for npx/dlx equivalents)
|
|
26
|
+
*/
|
|
27
|
+
export declare function getExecCommand(pm: PackageManager, command: string): string;
|
|
28
|
+
/**
|
|
29
|
+
* Check if package manager is installed
|
|
30
|
+
*/
|
|
31
|
+
export declare function isPackageManagerInstalled(pm: PackageManager): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Get package manager version
|
|
34
|
+
*/
|
|
35
|
+
export declare function getPackageManagerVersion(pm: PackageManager): string | null;
|
|
36
|
+
/**
|
|
37
|
+
* Detect which package manager was used to invoke the CLI
|
|
38
|
+
* Uses npm_config_user_agent environment variable
|
|
39
|
+
*/
|
|
40
|
+
export declare function detectInvokingPackageManager(): PackageManager;
|
|
41
|
+
//# sourceMappingURL=package-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-manager.d.ts","sourceRoot":"","sources":["../../src/utils/package-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,CAgBxE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,cAAc,GAAG,MAAM,CAS5D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,cAAc,GAAG,MAAM,CAS/D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CASxE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAS1E;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,cAAc,GAAG,OAAO,CAOrE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,cAAc,GAAG,MAAM,GAAG,IAAI,CAO1E;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,IAAI,cAAc,CAa7D"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Package Manager Detection
|
|
3
|
+
*
|
|
4
|
+
* Detects which package manager is being used in the project
|
|
5
|
+
* and provides appropriate commands.
|
|
6
|
+
*/
|
|
7
|
+
import { existsSync } from 'fs';
|
|
8
|
+
import { join } from 'path';
|
|
9
|
+
import { execSync } from 'child_process';
|
|
10
|
+
/**
|
|
11
|
+
* Detect package manager from lock files
|
|
12
|
+
*/
|
|
13
|
+
export function detectPackageManager(projectPath) {
|
|
14
|
+
const lockFiles = {
|
|
15
|
+
'pnpm-lock.yaml': 'pnpm',
|
|
16
|
+
'yarn.lock': 'yarn',
|
|
17
|
+
'package-lock.json': 'npm',
|
|
18
|
+
'bun.lockb': 'bun',
|
|
19
|
+
};
|
|
20
|
+
for (const [lockFile, pm] of Object.entries(lockFiles)) {
|
|
21
|
+
if (existsSync(join(projectPath, lockFile))) {
|
|
22
|
+
return pm;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
// Default to npm
|
|
26
|
+
return 'npm';
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Get install command for package manager
|
|
30
|
+
*/
|
|
31
|
+
export function getInstallCommand(pm) {
|
|
32
|
+
const commands = {
|
|
33
|
+
npm: 'npm install',
|
|
34
|
+
yarn: 'yarn add',
|
|
35
|
+
pnpm: 'pnpm add',
|
|
36
|
+
bun: 'bun add',
|
|
37
|
+
};
|
|
38
|
+
return commands[pm];
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Get dev install command for package manager
|
|
42
|
+
*/
|
|
43
|
+
export function getDevInstallCommand(pm) {
|
|
44
|
+
const commands = {
|
|
45
|
+
npm: 'npm install --save-dev',
|
|
46
|
+
yarn: 'yarn add --dev',
|
|
47
|
+
pnpm: 'pnpm add --save-dev',
|
|
48
|
+
bun: 'bun add --dev',
|
|
49
|
+
};
|
|
50
|
+
return commands[pm];
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Get run command for package manager
|
|
54
|
+
*/
|
|
55
|
+
export function getRunCommand(pm, script) {
|
|
56
|
+
const commands = {
|
|
57
|
+
npm: `npm run ${script}`,
|
|
58
|
+
yarn: `yarn ${script}`,
|
|
59
|
+
pnpm: `pnpm ${script}`,
|
|
60
|
+
bun: `bun run ${script}`,
|
|
61
|
+
};
|
|
62
|
+
return commands[pm];
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Get execute command for package manager (for npx/dlx equivalents)
|
|
66
|
+
*/
|
|
67
|
+
export function getExecCommand(pm, command) {
|
|
68
|
+
const commands = {
|
|
69
|
+
npm: `npx ${command}`,
|
|
70
|
+
yarn: `yarn dlx ${command}`,
|
|
71
|
+
pnpm: `pnpm dlx ${command}`,
|
|
72
|
+
bun: `bunx ${command}`,
|
|
73
|
+
};
|
|
74
|
+
return commands[pm];
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Check if package manager is installed
|
|
78
|
+
*/
|
|
79
|
+
export function isPackageManagerInstalled(pm) {
|
|
80
|
+
try {
|
|
81
|
+
execSync(`${pm} --version`, { stdio: 'ignore' });
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Get package manager version
|
|
90
|
+
*/
|
|
91
|
+
export function getPackageManagerVersion(pm) {
|
|
92
|
+
try {
|
|
93
|
+
const version = execSync(`${pm} --version`, { encoding: 'utf-8' });
|
|
94
|
+
return version.trim();
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Detect which package manager was used to invoke the CLI
|
|
102
|
+
* Uses npm_config_user_agent environment variable
|
|
103
|
+
*/
|
|
104
|
+
export function detectInvokingPackageManager() {
|
|
105
|
+
const userAgent = process.env.npm_config_user_agent || '';
|
|
106
|
+
if (userAgent.includes('pnpm')) {
|
|
107
|
+
return 'pnpm';
|
|
108
|
+
}
|
|
109
|
+
else if (userAgent.includes('yarn')) {
|
|
110
|
+
return 'yarn';
|
|
111
|
+
}
|
|
112
|
+
else if (userAgent.includes('bun')) {
|
|
113
|
+
return 'bun';
|
|
114
|
+
}
|
|
115
|
+
// Default to npm (covers npx and npm run)
|
|
116
|
+
return 'npm';
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=package-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-manager.js","sourceRoot":"","sources":["../../src/utils/package-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompting system — registry questions and shared prompts (Clack).
|
|
3
|
+
*/
|
|
4
|
+
import { PromptQuestion } from "../types/index.js";
|
|
5
|
+
/**
|
|
6
|
+
* Run prompts from registry questions
|
|
7
|
+
*/
|
|
8
|
+
export declare function runPrompts(questions: PromptQuestion[], options?: {
|
|
9
|
+
skipPrompts?: boolean;
|
|
10
|
+
defaults?: Record<string, any>;
|
|
11
|
+
}): Promise<Record<string, any>>;
|
|
12
|
+
export declare function confirm(message: string, defaultValue?: boolean): Promise<boolean>;
|
|
13
|
+
export declare function select<T extends string>(message: string, choices: Array<{
|
|
14
|
+
name: string;
|
|
15
|
+
value: T;
|
|
16
|
+
}>, defaultValue?: T): Promise<T>;
|
|
17
|
+
export declare function input(message: string, defaultValue?: string): Promise<string>;
|
|
18
|
+
export declare function multiSelect<T extends string>(message: string, choices: Array<{
|
|
19
|
+
name: string;
|
|
20
|
+
value: T;
|
|
21
|
+
}>, defaultValues?: T[]): Promise<T[]>;
|
|
22
|
+
//# sourceMappingURL=prompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/utils/prompts.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAOnD;;GAEG;AACH,wBAAsB,UAAU,CAC9B,SAAS,EAAE,cAAc,EAAE,EAC3B,OAAO,CAAC,EAAE;IACR,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC,GACA,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAyF9B;AAED,wBAAsB,OAAO,CAC3B,OAAO,EAAE,MAAM,EACf,YAAY,UAAQ,GACnB,OAAO,CAAC,OAAO,CAAC,CAOlB;AAED,wBAAsB,MAAM,CAAC,CAAC,SAAS,MAAM,EAC3C,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,CAAC,EAC1C,YAAY,CAAC,EAAE,CAAC,GACf,OAAO,CAAC,CAAC,CAAC,CAaZ;AAED,wBAAsB,KAAK,CACzB,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,CAOjB;AAED,wBAAsB,WAAW,CAAC,CAAC,SAAS,MAAM,EAChD,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,CAAC,EAC1C,aAAa,CAAC,EAAE,CAAC,EAAE,GAClB,OAAO,CAAC,CAAC,EAAE,CAAC,CAUd"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompting system — registry questions and shared prompts (Clack).
|
|
3
|
+
*/
|
|
4
|
+
import * as p from "@clack/prompts";
|
|
5
|
+
function exitOnCancel() {
|
|
6
|
+
p.cancel("Operation cancelled.");
|
|
7
|
+
process.exit(0);
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Run prompts from registry questions
|
|
11
|
+
*/
|
|
12
|
+
export async function runPrompts(questions, options) {
|
|
13
|
+
if (options?.skipPrompts) {
|
|
14
|
+
const answers = {};
|
|
15
|
+
for (const question of questions) {
|
|
16
|
+
const key = question.name;
|
|
17
|
+
answers[key] = options.defaults?.[key] ?? question.default;
|
|
18
|
+
}
|
|
19
|
+
return answers;
|
|
20
|
+
}
|
|
21
|
+
const answers = {};
|
|
22
|
+
for (const q of questions) {
|
|
23
|
+
const prefill = options?.defaults?.[q.name] ?? answers[q.name] ?? q.default;
|
|
24
|
+
switch (q.type) {
|
|
25
|
+
case "list": {
|
|
26
|
+
if (!q.choices?.length) {
|
|
27
|
+
answers[q.name] = prefill;
|
|
28
|
+
break;
|
|
29
|
+
}
|
|
30
|
+
const opts = q.choices.map((c) => ({
|
|
31
|
+
value: c.value,
|
|
32
|
+
label: c.name,
|
|
33
|
+
}));
|
|
34
|
+
const initial = typeof prefill === "string"
|
|
35
|
+
? opts.find((o) => o.value === prefill)?.value
|
|
36
|
+
: undefined;
|
|
37
|
+
const result = await p.select({
|
|
38
|
+
message: q.message,
|
|
39
|
+
options: opts,
|
|
40
|
+
initialValue: (initial ?? opts[0].value),
|
|
41
|
+
});
|
|
42
|
+
if (p.isCancel(result))
|
|
43
|
+
exitOnCancel();
|
|
44
|
+
answers[q.name] = result;
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
case "input": {
|
|
48
|
+
const result = await p.text({
|
|
49
|
+
message: q.message,
|
|
50
|
+
initialValue: prefill !== undefined && prefill !== null
|
|
51
|
+
? String(prefill)
|
|
52
|
+
: undefined,
|
|
53
|
+
});
|
|
54
|
+
if (p.isCancel(result))
|
|
55
|
+
exitOnCancel();
|
|
56
|
+
answers[q.name] = typeof result === "string" ? result : "";
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
case "confirm": {
|
|
60
|
+
const result = await p.confirm({
|
|
61
|
+
message: q.message,
|
|
62
|
+
initialValue: Boolean(prefill),
|
|
63
|
+
});
|
|
64
|
+
if (p.isCancel(result))
|
|
65
|
+
exitOnCancel();
|
|
66
|
+
answers[q.name] = Boolean(result);
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
case "checkbox": {
|
|
70
|
+
if (!q.choices?.length) {
|
|
71
|
+
answers[q.name] = Array.isArray(prefill) ? prefill : [];
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
const opts = q.choices.map((c) => ({
|
|
75
|
+
value: c.value,
|
|
76
|
+
label: c.name,
|
|
77
|
+
}));
|
|
78
|
+
const initialValues = Array.isArray(prefill)
|
|
79
|
+
? prefill.filter((v) => opts.some((o) => o.value === v))
|
|
80
|
+
: [];
|
|
81
|
+
const result = await p.multiselect({
|
|
82
|
+
message: q.message,
|
|
83
|
+
options: opts,
|
|
84
|
+
initialValues,
|
|
85
|
+
required: false,
|
|
86
|
+
});
|
|
87
|
+
if (p.isCancel(result))
|
|
88
|
+
exitOnCancel();
|
|
89
|
+
answers[q.name] = result;
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
default:
|
|
93
|
+
answers[q.name] = prefill;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return answers;
|
|
97
|
+
}
|
|
98
|
+
export async function confirm(message, defaultValue = false) {
|
|
99
|
+
const result = await p.confirm({
|
|
100
|
+
message,
|
|
101
|
+
initialValue: defaultValue,
|
|
102
|
+
});
|
|
103
|
+
if (p.isCancel(result))
|
|
104
|
+
exitOnCancel();
|
|
105
|
+
return Boolean(result);
|
|
106
|
+
}
|
|
107
|
+
export async function select(message, choices, defaultValue) {
|
|
108
|
+
const opts = choices.map((c) => ({ value: c.value, label: c.name }));
|
|
109
|
+
const initial = defaultValue !== undefined
|
|
110
|
+
? opts.find((o) => o.value === defaultValue)?.value
|
|
111
|
+
: undefined;
|
|
112
|
+
const result = await p.select({
|
|
113
|
+
message,
|
|
114
|
+
options: opts,
|
|
115
|
+
initialValue: (initial ?? opts[0]?.value),
|
|
116
|
+
});
|
|
117
|
+
if (p.isCancel(result))
|
|
118
|
+
exitOnCancel();
|
|
119
|
+
return result;
|
|
120
|
+
}
|
|
121
|
+
export async function input(message, defaultValue) {
|
|
122
|
+
const result = await p.text({
|
|
123
|
+
message,
|
|
124
|
+
initialValue: defaultValue,
|
|
125
|
+
});
|
|
126
|
+
if (p.isCancel(result))
|
|
127
|
+
exitOnCancel();
|
|
128
|
+
return typeof result === "string" ? result : defaultValue ?? "";
|
|
129
|
+
}
|
|
130
|
+
export async function multiSelect(message, choices, defaultValues) {
|
|
131
|
+
const opts = choices.map((c) => ({ value: c.value, label: c.name }));
|
|
132
|
+
const result = await p.multiselect({
|
|
133
|
+
message,
|
|
134
|
+
options: opts,
|
|
135
|
+
initialValues: (defaultValues ?? []),
|
|
136
|
+
required: false,
|
|
137
|
+
});
|
|
138
|
+
if (p.isCancel(result))
|
|
139
|
+
exitOnCancel();
|
|
140
|
+
return result;
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/utils/prompts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validation Utilities
|
|
3
|
+
*
|
|
4
|
+
* Functions for validating project structure and configuration.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Check if directory is a Next.js project
|
|
8
|
+
*/
|
|
9
|
+
export declare function isNextJsProject(projectPath: string): Promise<boolean>;
|
|
10
|
+
/**
|
|
11
|
+
* Check if project has src/ folder structure
|
|
12
|
+
*/
|
|
13
|
+
export declare function hasSrcFolder(projectPath: string): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Check if project has app/ folder (App Router)
|
|
16
|
+
*/
|
|
17
|
+
export declare function hasAppFolder(projectPath: string): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Check if project has pages/ folder (Pages Router)
|
|
20
|
+
*/
|
|
21
|
+
export declare function hasPagesFolder(projectPath: string): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Detect project structure
|
|
24
|
+
*/
|
|
25
|
+
export declare function detectProjectStructure(projectPath: string): {
|
|
26
|
+
hasSrcFolder: boolean;
|
|
27
|
+
hasAppFolder: boolean;
|
|
28
|
+
hasPagesFolder: boolean;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Check if Tailar is already initialized
|
|
32
|
+
*/
|
|
33
|
+
export declare function isTailarInitialized(projectPath: string): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Validate project for Tailar installation
|
|
36
|
+
*/
|
|
37
|
+
export declare function validateProject(projectPath: string): Promise<{
|
|
38
|
+
valid: boolean;
|
|
39
|
+
errors: string[];
|
|
40
|
+
warnings: string[];
|
|
41
|
+
}>;
|
|
42
|
+
/**
|
|
43
|
+
* Validate package name
|
|
44
|
+
*/
|
|
45
|
+
export declare function isValidPackageName(name: string): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Validate path is safe (no traversal)
|
|
48
|
+
*/
|
|
49
|
+
export declare function isSafePath(path: string): boolean;
|
|
50
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH;;GAEG;AACH,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAkB3E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAKzD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAK3D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM;;;;EAMzD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAEhE;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IAClE,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC,CAgCD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGxD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGhD"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validation Utilities
|
|
3
|
+
*
|
|
4
|
+
* Functions for validating project structure and configuration.
|
|
5
|
+
*/
|
|
6
|
+
import { existsSync } from 'fs';
|
|
7
|
+
import { join } from 'path';
|
|
8
|
+
import { readFile } from 'fs/promises';
|
|
9
|
+
/**
|
|
10
|
+
* Check if directory is a Next.js project
|
|
11
|
+
*/
|
|
12
|
+
export async function isNextJsProject(projectPath) {
|
|
13
|
+
const packageJsonPath = join(projectPath, 'package.json');
|
|
14
|
+
if (!existsSync(packageJsonPath)) {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
try {
|
|
18
|
+
const content = await readFile(packageJsonPath, 'utf-8');
|
|
19
|
+
const pkg = JSON.parse(content);
|
|
20
|
+
return !!(pkg.dependencies?.next ||
|
|
21
|
+
pkg.devDependencies?.next);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Check if project has src/ folder structure
|
|
29
|
+
*/
|
|
30
|
+
export function hasSrcFolder(projectPath) {
|
|
31
|
+
return existsSync(join(projectPath, 'src'));
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Check if project has app/ folder (App Router)
|
|
35
|
+
*/
|
|
36
|
+
export function hasAppFolder(projectPath) {
|
|
37
|
+
return (existsSync(join(projectPath, 'app')) ||
|
|
38
|
+
existsSync(join(projectPath, 'src', 'app')));
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Check if project has pages/ folder (Pages Router)
|
|
42
|
+
*/
|
|
43
|
+
export function hasPagesFolder(projectPath) {
|
|
44
|
+
return (existsSync(join(projectPath, 'pages')) ||
|
|
45
|
+
existsSync(join(projectPath, 'src', 'pages')));
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Detect project structure
|
|
49
|
+
*/
|
|
50
|
+
export function detectProjectStructure(projectPath) {
|
|
51
|
+
return {
|
|
52
|
+
hasSrcFolder: hasSrcFolder(projectPath),
|
|
53
|
+
hasAppFolder: hasAppFolder(projectPath),
|
|
54
|
+
hasPagesFolder: hasPagesFolder(projectPath),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Check if Tailar is already initialized
|
|
59
|
+
*/
|
|
60
|
+
export function isTailarInitialized(projectPath) {
|
|
61
|
+
return existsSync(join(projectPath, '.tailar.json'));
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Validate project for Tailar installation
|
|
65
|
+
*/
|
|
66
|
+
export async function validateProject(projectPath) {
|
|
67
|
+
const errors = [];
|
|
68
|
+
const warnings = [];
|
|
69
|
+
// Check if directory exists
|
|
70
|
+
if (!existsSync(projectPath)) {
|
|
71
|
+
errors.push('Project directory does not exist');
|
|
72
|
+
return { valid: false, errors, warnings };
|
|
73
|
+
}
|
|
74
|
+
// Check if it's a Next.js project
|
|
75
|
+
const isNext = await isNextJsProject(projectPath);
|
|
76
|
+
if (!isNext) {
|
|
77
|
+
errors.push('Not a Next.js project (package.json missing or no Next.js dependency)');
|
|
78
|
+
}
|
|
79
|
+
// Check for App Router
|
|
80
|
+
const structure = detectProjectStructure(projectPath);
|
|
81
|
+
if (!structure.hasAppFolder) {
|
|
82
|
+
warnings.push('App Router not detected. Tailar requires Next.js App Router.');
|
|
83
|
+
}
|
|
84
|
+
// Check if already initialized
|
|
85
|
+
if (isTailarInitialized(projectPath)) {
|
|
86
|
+
warnings.push('Tailar is already initialized in this project');
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
valid: errors.length === 0,
|
|
90
|
+
errors,
|
|
91
|
+
warnings,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Validate package name
|
|
96
|
+
*/
|
|
97
|
+
export function isValidPackageName(name) {
|
|
98
|
+
const packageNameRegex = /^(@[a-z0-9-~][a-z0-9-._~]*\/)?[a-z0-9-~][a-z0-9-._~]*$/;
|
|
99
|
+
return packageNameRegex.test(name);
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Validate path is safe (no traversal)
|
|
103
|
+
*/
|
|
104
|
+
export function isSafePath(path) {
|
|
105
|
+
const normalized = path.replace(/\\/g, '/');
|
|
106
|
+
return !normalized.includes('../') && !normalized.startsWith('/');
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "tailar",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "CLI tool for scaffolding Next.js features and components",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"tailar": "./dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"main": "./dist/index.js",
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"README.md",
|
|
13
|
+
"LICENSE"
|
|
14
|
+
],
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "tsc",
|
|
17
|
+
"dev": "tsc --watch",
|
|
18
|
+
"test": "node --experimental-vm-modules node_modules/jest/bin/jest.js",
|
|
19
|
+
"test:watch": "node --experimental-vm-modules node_modules/jest/bin/jest.js --watch",
|
|
20
|
+
"test:coverage": "node --experimental-vm-modules node_modules/jest/bin/jest.js --coverage",
|
|
21
|
+
"prepublishOnly": "npm run build",
|
|
22
|
+
"prepare-release": "npm run build && cp README.npm.md README.md",
|
|
23
|
+
"version": "node -e \"console.log(require('./package.json').version)\""
|
|
24
|
+
},
|
|
25
|
+
"keywords": [
|
|
26
|
+
"nextjs",
|
|
27
|
+
"cli",
|
|
28
|
+
"scaffolding",
|
|
29
|
+
"tailar",
|
|
30
|
+
"templates"
|
|
31
|
+
],
|
|
32
|
+
"author": "Tailar",
|
|
33
|
+
"license": "MIT",
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"@clack/prompts": "^0.7.0",
|
|
36
|
+
"chalk": "^5.3.0",
|
|
37
|
+
"commander": "^12.0.0",
|
|
38
|
+
"fs-extra": "^11.2.0",
|
|
39
|
+
"glob": "^10.3.10",
|
|
40
|
+
"node-fetch": "^3.3.2",
|
|
41
|
+
"open": "^11.0.0",
|
|
42
|
+
"ora": "^8.0.1"
|
|
43
|
+
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"@jest/globals": "^29.7.0",
|
|
46
|
+
"@types/fs-extra": "^11.0.4",
|
|
47
|
+
"@types/jest": "^29.5.11",
|
|
48
|
+
"@types/node": "^20.11.17",
|
|
49
|
+
"jest": "^29.7.0",
|
|
50
|
+
"ts-jest": "^29.1.2",
|
|
51
|
+
"typescript": "^5.3.3"
|
|
52
|
+
},
|
|
53
|
+
"engines": {
|
|
54
|
+
"node": ">=18.0.0"
|
|
55
|
+
}
|
|
56
|
+
}
|