portfolify 2.0.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 (66) hide show
  1. package/dist/commands/generate.d.ts +7 -0
  2. package/dist/commands/generate.d.ts.map +1 -0
  3. package/dist/commands/generate.js +129 -0
  4. package/dist/commands/generate.js.map +1 -0
  5. package/dist/commands/portfolio.d.ts +12 -0
  6. package/dist/commands/portfolio.d.ts.map +1 -0
  7. package/dist/commands/portfolio.js +292 -0
  8. package/dist/commands/portfolio.js.map +1 -0
  9. package/dist/generator/index.d.ts +3 -0
  10. package/dist/generator/index.d.ts.map +1 -0
  11. package/dist/generator/index.js +572 -0
  12. package/dist/generator/index.js.map +1 -0
  13. package/dist/generator/portfolio-generator.d.ts +4 -0
  14. package/dist/generator/portfolio-generator.d.ts.map +1 -0
  15. package/dist/generator/portfolio-generator.js +1577 -0
  16. package/dist/generator/portfolio-generator.js.map +1 -0
  17. package/dist/index.d.ts +3 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +40 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/prompts/index.d.ts +81 -0
  22. package/dist/prompts/index.d.ts.map +1 -0
  23. package/dist/prompts/index.js +330 -0
  24. package/dist/prompts/index.js.map +1 -0
  25. package/dist/prompts/portfolio-prompts.d.ts +60 -0
  26. package/dist/prompts/portfolio-prompts.d.ts.map +1 -0
  27. package/dist/prompts/portfolio-prompts.js +635 -0
  28. package/dist/prompts/portfolio-prompts.js.map +1 -0
  29. package/dist/themes/index.d.ts +15 -0
  30. package/dist/themes/index.d.ts.map +1 -0
  31. package/dist/themes/index.js +64 -0
  32. package/dist/themes/index.js.map +1 -0
  33. package/dist/utils/file.d.ts +5 -0
  34. package/dist/utils/file.d.ts.map +1 -0
  35. package/dist/utils/file.js +33 -0
  36. package/dist/utils/file.js.map +1 -0
  37. package/dist/utils/logger.d.ts +9 -0
  38. package/dist/utils/logger.d.ts.map +1 -0
  39. package/dist/utils/logger.js +22 -0
  40. package/dist/utils/logger.js.map +1 -0
  41. package/dist/utils/validator.d.ts +27 -0
  42. package/dist/utils/validator.d.ts.map +1 -0
  43. package/dist/utils/validator.js +322 -0
  44. package/dist/utils/validator.js.map +1 -0
  45. package/package.json +66 -0
  46. package/templates/index.html +16 -0
  47. package/templates/package.json +37 -0
  48. package/templates/postcss.config.js +6 -0
  49. package/templates/src/App.tsx +56 -0
  50. package/templates/src/components/Blog.tsx +119 -0
  51. package/templates/src/components/Footer.tsx +206 -0
  52. package/templates/src/components/Hero.tsx +182 -0
  53. package/templates/src/components/Projects.tsx +130 -0
  54. package/templates/src/components/SEO.tsx +38 -0
  55. package/templates/src/components/Skills.tsx +107 -0
  56. package/templates/src/components/ThemeToggle.tsx +39 -0
  57. package/templates/src/config/portfolio.json +61 -0
  58. package/templates/src/content/blog/welcome.mdx +29 -0
  59. package/templates/src/lib/blog.ts +63 -0
  60. package/templates/src/lib/utils.ts +6 -0
  61. package/templates/src/main.tsx +13 -0
  62. package/templates/src/styles/globals.css +123 -0
  63. package/templates/tailwind.config.js +65 -0
  64. package/templates/tsconfig.json +37 -0
  65. package/templates/tsconfig.node.json +12 -0
  66. package/templates/vite.config.ts +24 -0
@@ -0,0 +1,64 @@
1
+ export const themes = {
2
+ 'modern-dark': {
3
+ name: 'Modern Dark',
4
+ colors: {
5
+ primary: '220 90% 56%',
6
+ secondary: '280 80% 60%',
7
+ accent: '340 82% 52%',
8
+ background: '224 71% 4%',
9
+ foreground: '213 31% 91%',
10
+ muted: '223 47% 11%'
11
+ }
12
+ },
13
+ 'gradient-purple': {
14
+ name: 'Gradient Purple',
15
+ colors: {
16
+ primary: '271 91% 65%',
17
+ secondary: '296 80% 60%',
18
+ accent: '326 78% 66%',
19
+ background: '240 10% 3.9%',
20
+ foreground: '0 0% 98%',
21
+ muted: '240 3.7% 15.9%'
22
+ }
23
+ },
24
+ 'ocean-blue': {
25
+ name: 'Ocean Blue',
26
+ colors: {
27
+ primary: '199 89% 48%',
28
+ secondary: '187 85% 53%',
29
+ accent: '173 80% 40%',
30
+ background: '200 50% 5%',
31
+ foreground: '180 20% 96%',
32
+ muted: '200 40% 12%'
33
+ }
34
+ },
35
+ 'sunset-orange': {
36
+ name: 'Sunset Orange',
37
+ colors: {
38
+ primary: '25 95% 53%',
39
+ secondary: '45 93% 47%',
40
+ accent: '340 82% 52%',
41
+ background: '20 14.3% 4.1%',
42
+ foreground: '0 0% 95%',
43
+ muted: '0 0% 15%'
44
+ }
45
+ },
46
+ 'minimal-light': {
47
+ name: 'Minimal Light',
48
+ colors: {
49
+ primary: '222 47% 11%',
50
+ secondary: '215 28% 17%',
51
+ accent: '262 83% 58%',
52
+ background: '0 0% 100%',
53
+ foreground: '222 47% 11%',
54
+ muted: '210 40% 96.1%'
55
+ }
56
+ }
57
+ };
58
+ export function getThemeChoices() {
59
+ return Object.keys(themes);
60
+ }
61
+ export function getTheme(key) {
62
+ return themes[key] || themes['modern-dark'];
63
+ }
64
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/themes/index.ts"],"names":[],"mappings":"AAYA,MAAM,CAAC,MAAM,MAAM,GAA0B;IACzC,aAAa,EAAE;QACX,IAAI,EAAE,aAAa;QACnB,MAAM,EAAE;YACJ,OAAO,EAAE,aAAa;YACtB,SAAS,EAAE,aAAa;YACxB,MAAM,EAAE,aAAa;YACrB,UAAU,EAAE,YAAY;YACxB,UAAU,EAAE,aAAa;YACzB,KAAK,EAAE,aAAa;SACvB;KACJ;IACD,iBAAiB,EAAE;QACf,IAAI,EAAE,iBAAiB;QACvB,MAAM,EAAE;YACJ,OAAO,EAAE,aAAa;YACtB,SAAS,EAAE,aAAa;YACxB,MAAM,EAAE,aAAa;YACrB,UAAU,EAAE,cAAc;YAC1B,UAAU,EAAE,UAAU;YACtB,KAAK,EAAE,gBAAgB;SAC1B;KACJ;IACD,YAAY,EAAE;QACV,IAAI,EAAE,YAAY;QAClB,MAAM,EAAE;YACJ,OAAO,EAAE,aAAa;YACtB,SAAS,EAAE,aAAa;YACxB,MAAM,EAAE,aAAa;YACrB,UAAU,EAAE,YAAY;YACxB,UAAU,EAAE,aAAa;YACzB,KAAK,EAAE,aAAa;SACvB;KACJ;IACD,eAAe,EAAE;QACb,IAAI,EAAE,eAAe;QACrB,MAAM,EAAE;YACJ,OAAO,EAAE,YAAY;YACrB,SAAS,EAAE,YAAY;YACvB,MAAM,EAAE,aAAa;YACrB,UAAU,EAAE,eAAe;YAC3B,UAAU,EAAE,UAAU;YACtB,KAAK,EAAE,UAAU;SACpB;KACJ;IACD,eAAe,EAAE;QACb,IAAI,EAAE,eAAe;QACrB,MAAM,EAAE;YACJ,OAAO,EAAE,aAAa;YACtB,SAAS,EAAE,aAAa;YACxB,MAAM,EAAE,aAAa;YACrB,UAAU,EAAE,WAAW;YACvB,UAAU,EAAE,aAAa;YACzB,KAAK,EAAE,eAAe;SACzB;KACJ;CACJ,CAAC;AAEF,MAAM,UAAU,eAAe;IAC3B,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,GAAW;IAChC,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,aAAa,CAAC,CAAC;AAChD,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function copyDirectory(src: string, dest: string): Promise<void>;
2
+ export declare function writeFile(filePath: string, content: string): Promise<void>;
3
+ export declare function processTemplate(templatePath: string, data: any): Promise<string>;
4
+ export declare function fileExists(filePath: string): Promise<boolean>;
5
+ //# sourceMappingURL=file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../src/utils/file.ts"],"names":[],"mappings":"AAIA,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAW5E;AAED,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGhF;AAED,wBAAsB,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAGtF;AAED,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOnE"}
@@ -0,0 +1,33 @@
1
+ import fs from 'fs-extra';
2
+ import path from 'path';
3
+ import ejs from 'ejs';
4
+ export async function copyDirectory(src, dest) {
5
+ await fs.copy(src, dest, {
6
+ filter: (srcPath) => {
7
+ const basename = path.basename(srcPath);
8
+ // Skip node_modules and build artifacts at any level
9
+ if (basename === 'node_modules' || basename === 'dist') {
10
+ return false;
11
+ }
12
+ return true;
13
+ }
14
+ });
15
+ }
16
+ export async function writeFile(filePath, content) {
17
+ await fs.ensureDir(path.dirname(filePath));
18
+ await fs.writeFile(filePath, content, 'utf-8');
19
+ }
20
+ export async function processTemplate(templatePath, data) {
21
+ const template = await fs.readFile(templatePath, 'utf-8');
22
+ return ejs.render(template, data);
23
+ }
24
+ export async function fileExists(filePath) {
25
+ try {
26
+ await fs.access(filePath);
27
+ return true;
28
+ }
29
+ catch {
30
+ return false;
31
+ }
32
+ }
33
+ //# sourceMappingURL=file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.js","sourceRoot":"","sources":["../../src/utils/file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAW,EAAE,IAAY;IACzD,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE;QACrB,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE;YAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACxC,qDAAqD;YACrD,IAAI,QAAQ,KAAK,cAAc,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;gBACrD,OAAO,KAAK,CAAC;YACjB,CAAC;YACD,OAAO,IAAI,CAAC;QAChB,CAAC;KACJ,CAAC,CAAC;AACP,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAAgB,EAAE,OAAe;IAC7D,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3C,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,YAAoB,EAAE,IAAS;IACjE,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAC1D,OAAO,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC7C,IAAI,CAAC;QACD,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC"}
@@ -0,0 +1,9 @@
1
+ export declare const logger: {
2
+ success: (message: string) => void;
3
+ error: (message: string) => void;
4
+ info: (message: string) => void;
5
+ warning: (message: string) => void;
6
+ step: (message: string) => void;
7
+ header: (message: string) => void;
8
+ };
9
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM;uBACI,MAAM;qBAIR,MAAM;oBAIP,MAAM;uBAIH,MAAM;oBAIT,MAAM;sBAIJ,MAAM;CAG3B,CAAC"}
@@ -0,0 +1,22 @@
1
+ import chalk from 'chalk';
2
+ export const logger = {
3
+ success: (message) => {
4
+ console.log(chalk.green('✓'), message);
5
+ },
6
+ error: (message) => {
7
+ console.log(chalk.red('✗'), message);
8
+ },
9
+ info: (message) => {
10
+ console.log(chalk.blue('ℹ'), message);
11
+ },
12
+ warning: (message) => {
13
+ console.log(chalk.yellow('⚠'), message);
14
+ },
15
+ step: (message) => {
16
+ console.log(chalk.cyan('→'), message);
17
+ },
18
+ header: (message) => {
19
+ console.log(chalk.bold.magenta(`\n${message}\n`));
20
+ }
21
+ };
22
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,MAAM,MAAM,GAAG;IAClB,OAAO,EAAE,CAAC,OAAe,EAAE,EAAE;QACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,EAAE,CAAC,OAAe,EAAE,EAAE;QACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,EAAE,CAAC,OAAe,EAAE,EAAE;QACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,EAAE,CAAC,OAAe,EAAE,EAAE;QACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,EAAE,CAAC,OAAe,EAAE,EAAE;QACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,EAAE,CAAC,OAAe,EAAE,EAAE;QACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC;IACtD,CAAC;CACJ,CAAC"}
@@ -0,0 +1,27 @@
1
+ export interface ValidationResult {
2
+ success: boolean;
3
+ typescript: {
4
+ success: boolean;
5
+ errors: string[];
6
+ };
7
+ eslint: {
8
+ success: boolean;
9
+ errors: string[];
10
+ warnings: number;
11
+ };
12
+ dependencies: {
13
+ success: boolean;
14
+ missing: string[];
15
+ };
16
+ files: {
17
+ success: boolean;
18
+ missing: string[];
19
+ };
20
+ assets: {
21
+ warnings: string[];
22
+ };
23
+ }
24
+ export declare function validateProject(projectDir: string, autoFix?: boolean): Promise<ValidationResult>;
25
+ export declare function runDevBuildCheck(projectDir: string): Promise<boolean>;
26
+ export declare function printValidationSummary(result: ValidationResult): void;
27
+ //# sourceMappingURL=validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/utils/validator.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,gBAAgB;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE;QACR,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;IACF,MAAM,EAAE;QACJ,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,YAAY,EAAE;QACV,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;IACF,KAAK,EAAE;QACH,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;IACF,MAAM,EAAE;QACJ,QAAQ,EAAE,MAAM,EAAE,CAAC;KACtB,CAAC;CACL;AA2BD,wBAAsB,eAAe,CACjC,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,OAAe,GACzB,OAAO,CAAC,gBAAgB,CAAC,CA8L3B;AA2CD,wBAAsB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA0B3E;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAsDrE"}
@@ -0,0 +1,322 @@
1
+ import { exec } from 'child_process';
2
+ import { promisify } from 'util';
3
+ import path from 'path';
4
+ import fs from 'fs-extra';
5
+ import ora from 'ora';
6
+ import chalk from 'chalk';
7
+ const execAsync = promisify(exec);
8
+ const REQUIRED_FILES = {
9
+ 'react-vite': [
10
+ 'package.json',
11
+ 'tsconfig.json',
12
+ 'vite.config.ts',
13
+ 'index.html',
14
+ 'src/main.tsx',
15
+ 'src/App.tsx'
16
+ ],
17
+ 'nextjs': [
18
+ 'package.json',
19
+ 'tsconfig.json',
20
+ 'next.config.js',
21
+ 'src/app/page.tsx',
22
+ 'src/app/layout.tsx'
23
+ ],
24
+ 'sveltekit': [
25
+ 'package.json',
26
+ 'tsconfig.json',
27
+ 'svelte.config.js',
28
+ 'src/routes/+page.svelte',
29
+ 'src/routes/+layout.svelte'
30
+ ]
31
+ };
32
+ export async function validateProject(projectDir, autoFix = false) {
33
+ const result = {
34
+ success: true,
35
+ typescript: { success: true, errors: [] },
36
+ eslint: { success: true, errors: [], warnings: 0 },
37
+ dependencies: { success: true, missing: [] },
38
+ files: { success: true, missing: [] },
39
+ assets: { warnings: [] }
40
+ };
41
+ // Determine framework from package.json
42
+ const packageJsonPath = path.join(projectDir, 'package.json');
43
+ let framework = 'react-vite';
44
+ if (await fs.pathExists(packageJsonPath)) {
45
+ const packageJson = await fs.readJson(packageJsonPath);
46
+ if (packageJson.dependencies?.next) {
47
+ framework = 'nextjs';
48
+ }
49
+ else if (packageJson.devDependencies?.['@sveltejs/kit']) {
50
+ framework = 'sveltekit';
51
+ }
52
+ }
53
+ // 1. Check required files
54
+ const fileSpinner = ora('Checking required files...').start();
55
+ const requiredFiles = REQUIRED_FILES[framework] || REQUIRED_FILES['react-vite'];
56
+ for (const file of requiredFiles) {
57
+ const filePath = path.join(projectDir, file);
58
+ if (!await fs.pathExists(filePath)) {
59
+ result.files.missing.push(file);
60
+ }
61
+ }
62
+ if (result.files.missing.length > 0) {
63
+ result.files.success = false;
64
+ result.success = false;
65
+ fileSpinner.fail(`Missing ${result.files.missing.length} required file(s)`);
66
+ }
67
+ else {
68
+ fileSpinner.succeed('All required files present');
69
+ }
70
+ // 2. Check dependencies
71
+ const depsSpinner = ora('Checking dependencies...').start();
72
+ const nodeModulesPath = path.join(projectDir, 'node_modules');
73
+ if (!await fs.pathExists(nodeModulesPath)) {
74
+ result.dependencies.success = false;
75
+ result.dependencies.missing.push('node_modules (run npm install)');
76
+ depsSpinner.warn('Dependencies not installed');
77
+ }
78
+ else {
79
+ // Check for specific critical dependencies
80
+ const criticalDeps = ['react', 'react-dom'];
81
+ for (const dep of criticalDeps) {
82
+ const depPath = path.join(nodeModulesPath, dep);
83
+ if (!await fs.pathExists(depPath)) {
84
+ result.dependencies.missing.push(dep);
85
+ }
86
+ }
87
+ if (result.dependencies.missing.length > 0) {
88
+ result.dependencies.success = false;
89
+ result.success = false;
90
+ depsSpinner.warn(`Missing ${result.dependencies.missing.length} dependency(ies)`);
91
+ }
92
+ else {
93
+ depsSpinner.succeed('All dependencies installed');
94
+ }
95
+ }
96
+ // 3. TypeScript check
97
+ const tsSpinner = ora('Running TypeScript check...').start();
98
+ try {
99
+ const tscPath = path.join(projectDir, 'node_modules', '.bin', 'tsc');
100
+ const tscExists = await fs.pathExists(tscPath) || await fs.pathExists(tscPath + '.cmd');
101
+ if (tscExists) {
102
+ try {
103
+ await execAsync('npx tsc --noEmit', { cwd: projectDir });
104
+ tsSpinner.succeed('TypeScript: no errors');
105
+ }
106
+ catch (error) {
107
+ const stderr = error.stderr || error.stdout || '';
108
+ const errors = parseTypeScriptErrors(stderr);
109
+ if (errors.length > 0) {
110
+ result.typescript.success = false;
111
+ result.typescript.errors = errors;
112
+ result.success = false;
113
+ tsSpinner.fail(`TypeScript: ${errors.length} error(s)`);
114
+ }
115
+ else {
116
+ tsSpinner.succeed('TypeScript: no errors');
117
+ }
118
+ }
119
+ }
120
+ else {
121
+ tsSpinner.warn('TypeScript not installed, skipping check');
122
+ }
123
+ }
124
+ catch (error) {
125
+ tsSpinner.warn('Could not run TypeScript check');
126
+ }
127
+ // 4. ESLint check
128
+ const eslintSpinner = ora('Running ESLint check...').start();
129
+ try {
130
+ const eslintConfigExists = await fs.pathExists(path.join(projectDir, '.eslintrc.json')) ||
131
+ await fs.pathExists(path.join(projectDir, '.eslintrc.js')) ||
132
+ await fs.pathExists(path.join(projectDir, 'eslint.config.js'));
133
+ if (eslintConfigExists) {
134
+ try {
135
+ const command = autoFix
136
+ ? 'npx eslint src --ext .ts,.tsx --fix --max-warnings=0'
137
+ : 'npx eslint src --ext .ts,.tsx --max-warnings=0';
138
+ await execAsync(command, { cwd: projectDir });
139
+ eslintSpinner.succeed('ESLint: clean');
140
+ }
141
+ catch (error) {
142
+ const output = error.stdout || error.stderr || '';
143
+ const { errors, warnings } = parseESLintOutput(output);
144
+ result.eslint.errors = errors;
145
+ result.eslint.warnings = warnings;
146
+ if (errors.length > 0) {
147
+ result.eslint.success = false;
148
+ result.success = false;
149
+ eslintSpinner.fail(`ESLint: ${errors.length} error(s), ${warnings} warning(s)`);
150
+ }
151
+ else if (warnings > 0) {
152
+ eslintSpinner.warn(`ESLint: ${warnings} warning(s)`);
153
+ }
154
+ else {
155
+ eslintSpinner.succeed('ESLint: clean');
156
+ }
157
+ }
158
+ }
159
+ else {
160
+ eslintSpinner.info('ESLint not configured, skipping check');
161
+ }
162
+ }
163
+ catch (error) {
164
+ eslintSpinner.warn('Could not run ESLint check');
165
+ }
166
+ // 5. Check assets
167
+ const assetsSpinner = ora('Checking assets...').start();
168
+ const publicDir = path.join(projectDir, 'public');
169
+ const assetsDir = path.join(projectDir, 'src', 'assets');
170
+ const assetWarnings = [];
171
+ // Check for placeholder images
172
+ if (await fs.pathExists(assetsDir)) {
173
+ const assetFiles = await fs.readdir(assetsDir);
174
+ const hasPlaceholders = assetFiles.some(f => f.includes('placeholder'));
175
+ if (hasPlaceholders) {
176
+ assetWarnings.push('Contains placeholder images - consider replacing with real assets');
177
+ }
178
+ }
179
+ // Check for favicon
180
+ if (await fs.pathExists(publicDir)) {
181
+ const publicFiles = await fs.readdir(publicDir);
182
+ const hasFavicon = publicFiles.some(f => f.includes('favicon'));
183
+ if (!hasFavicon) {
184
+ assetWarnings.push('Missing favicon.ico in public folder');
185
+ }
186
+ }
187
+ result.assets.warnings = assetWarnings;
188
+ if (assetWarnings.length > 0) {
189
+ assetsSpinner.warn(`${assetWarnings.length} asset warning(s)`);
190
+ }
191
+ else {
192
+ assetsSpinner.succeed('Assets check passed');
193
+ }
194
+ // 6. Optional: Run Prettier if autoFix is enabled
195
+ if (autoFix) {
196
+ const prettierSpinner = ora('Running Prettier...').start();
197
+ try {
198
+ const prettierConfigExists = await fs.pathExists(path.join(projectDir, '.prettierrc')) ||
199
+ await fs.pathExists(path.join(projectDir, 'prettier.config.js'));
200
+ if (prettierConfigExists) {
201
+ await execAsync('npx prettier --write "src/**/*.{ts,tsx,css}"', { cwd: projectDir });
202
+ prettierSpinner.succeed('Prettier: formatted');
203
+ }
204
+ else {
205
+ prettierSpinner.info('Prettier not configured, skipping');
206
+ }
207
+ }
208
+ catch (error) {
209
+ prettierSpinner.warn('Could not run Prettier');
210
+ }
211
+ }
212
+ return result;
213
+ }
214
+ function parseTypeScriptErrors(output) {
215
+ const errors = [];
216
+ const lines = output.split('\n');
217
+ for (const line of lines) {
218
+ // Match TypeScript error format: file.ts(line,col): error TS####: message
219
+ if (line.includes('error TS') || line.includes(': error')) {
220
+ const cleanedLine = line.trim();
221
+ if (cleanedLine) {
222
+ errors.push(cleanedLine);
223
+ }
224
+ }
225
+ }
226
+ return errors.slice(0, 10); // Limit to first 10 errors
227
+ }
228
+ function parseESLintOutput(output) {
229
+ const errors = [];
230
+ let warnings = 0;
231
+ const lines = output.split('\n');
232
+ for (const line of lines) {
233
+ if (line.includes('error')) {
234
+ errors.push(line.trim());
235
+ }
236
+ if (line.includes('warning')) {
237
+ warnings++;
238
+ }
239
+ }
240
+ // Parse summary line if present
241
+ const summaryMatch = output.match(/(\d+) problems? \((\d+) errors?, (\d+) warnings?\)/);
242
+ if (summaryMatch) {
243
+ warnings = parseInt(summaryMatch[3], 10);
244
+ }
245
+ return { errors: errors.slice(0, 10), warnings };
246
+ }
247
+ export async function runDevBuildCheck(projectDir) {
248
+ const spinner = ora('Running development build check...').start();
249
+ try {
250
+ await execAsync('npm run build', { cwd: projectDir, timeout: 120000 });
251
+ spinner.succeed('Build completed successfully');
252
+ return true;
253
+ }
254
+ catch (error) {
255
+ const output = error.stdout || error.stderr || '';
256
+ spinner.fail('Build failed');
257
+ // Extract and log build errors
258
+ const errorLines = output.split('\n').filter((line) => line.toLowerCase().includes('error') ||
259
+ line.includes('failed'));
260
+ if (errorLines.length > 0) {
261
+ console.log(chalk.red('\nBuild errors:'));
262
+ errorLines.slice(0, 5).forEach((line) => {
263
+ console.log(chalk.red(` ${line}`));
264
+ });
265
+ }
266
+ return false;
267
+ }
268
+ }
269
+ export function printValidationSummary(result) {
270
+ console.log('\n');
271
+ console.log(chalk.bold.cyan('📊 Validation Summary'));
272
+ console.log(chalk.gray('─'.repeat(50)));
273
+ // Files
274
+ if (result.files.success) {
275
+ console.log(chalk.green(' ✅ Required files: all present'));
276
+ }
277
+ else {
278
+ console.log(chalk.red(` ❌ Missing files: ${result.files.missing.join(', ')}`));
279
+ }
280
+ // Dependencies
281
+ if (result.dependencies.success) {
282
+ console.log(chalk.green(' ✅ Dependencies: all installed'));
283
+ }
284
+ else {
285
+ console.log(chalk.yellow(` ⚠️ Missing: ${result.dependencies.missing.join(', ')}`));
286
+ }
287
+ // TypeScript
288
+ if (result.typescript.success) {
289
+ console.log(chalk.green(' ✅ TypeScript: no errors'));
290
+ }
291
+ else {
292
+ console.log(chalk.red(` ❌ TypeScript: ${result.typescript.errors.length} error(s)`));
293
+ result.typescript.errors.slice(0, 3).forEach(err => {
294
+ console.log(chalk.red(` • ${err.substring(0, 80)}...`));
295
+ });
296
+ }
297
+ // ESLint
298
+ if (result.eslint.success && result.eslint.warnings === 0) {
299
+ console.log(chalk.green(' ✅ ESLint: clean'));
300
+ }
301
+ else if (result.eslint.errors.length === 0) {
302
+ console.log(chalk.yellow(` ⚠️ ESLint: ${result.eslint.warnings} warning(s)`));
303
+ }
304
+ else {
305
+ console.log(chalk.red(` ❌ ESLint: ${result.eslint.errors.length} error(s)`));
306
+ }
307
+ // Assets
308
+ if (result.assets.warnings.length > 0) {
309
+ result.assets.warnings.forEach(warning => {
310
+ console.log(chalk.yellow(` ⚠️ ${warning}`));
311
+ });
312
+ }
313
+ console.log(chalk.gray('─'.repeat(50)));
314
+ if (result.success) {
315
+ console.log(chalk.green.bold(' ✅ Overall: PASSED'));
316
+ }
317
+ else {
318
+ console.log(chalk.red.bold(' ❌ Overall: FAILED - see errors above'));
319
+ }
320
+ console.log('\n');
321
+ }
322
+ //# sourceMappingURL=validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/utils/validator.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "portfolify",
3
+ "version": "2.0.0",
4
+ "description": "Portfolify - Generate stunning, production-ready portfolio websites in seconds with unique themes for developers, designers, photographers, and more",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "portfolify": "dist/index.js"
8
+ },
9
+ "type": "module",
10
+ "scripts": {
11
+ "copy-templates": "node -e \"const fs = require('fs-extra'); fs.copySync('../template', './templates', { filter: (src) => !src.includes('node_modules') && !src.includes('dist') })\"",
12
+ "prebuild": "npm run copy-templates",
13
+ "dev": "tsx src/index.ts",
14
+ "build": "tsc",
15
+ "start": "node dist/index.js",
16
+ "test": "node dist/index.js test-portfolio --yes"
17
+ },
18
+ "files": [
19
+ "dist",
20
+ "templates"
21
+ ],
22
+ "keywords": [
23
+ "portfolio",
24
+ "generator",
25
+ "cli",
26
+ "developer",
27
+ "react",
28
+ "vite",
29
+ "tailwind",
30
+ "dark-mode",
31
+ "themes",
32
+ "mdx",
33
+ "blog"
34
+ ],
35
+ "author": "Sumit <halloffame12>",
36
+ "license": "MIT",
37
+ "repository": {
38
+ "type": "git",
39
+ "url": "https://github.com/halloffame12/portfolify"
40
+ },
41
+ "homepage": "https://github.com/halloffame12/portfolify#readme",
42
+ "bugs": {
43
+ "url": "https://github.com/halloffame12/portfolify/issues"
44
+ },
45
+ "engines": {
46
+ "node": ">=18.0.0"
47
+ },
48
+ "dependencies": {
49
+ "chalk": "^5.3.0",
50
+ "commander": "^11.1.0",
51
+ "inquirer": "^9.2.12",
52
+ "ora": "^7.0.1",
53
+ "ejs": "^3.1.9",
54
+ "fs-extra": "^11.2.0",
55
+ "validate-npm-package-name": "^5.0.0"
56
+ },
57
+ "devDependencies": {
58
+ "@types/node": "^20.10.6",
59
+ "@types/inquirer": "^9.0.7",
60
+ "@types/ejs": "^3.1.5",
61
+ "@types/fs-extra": "^11.0.4",
62
+ "@types/validate-npm-package-name": "^4.0.2",
63
+ "typescript": "^5.3.3",
64
+ "tsx": "^4.7.0"
65
+ }
66
+ }
@@ -0,0 +1,16 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <link rel="icon" type="image/svg+xml" href="/vite.svg" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <link rel="preconnect" href="https://fonts.googleapis.com">
8
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
9
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&display=swap" rel="stylesheet">
10
+ <title>Portfolio</title>
11
+ </head>
12
+ <body>
13
+ <div id="root"></div>
14
+ <script type="module" src="/src/main.tsx"></script>
15
+ </body>
16
+ </html>
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "portfolify-template",
3
+ "private": true,
4
+ "version": "1.0.0",
5
+ "type": "module",
6
+ "author": "Sumit <halloffame12>",
7
+ "scripts": {
8
+ "dev": "vite",
9
+ "build": "tsc && vite build",
10
+ "preview": "vite preview"
11
+ },
12
+ "dependencies": {
13
+ "react": "^18.2.0",
14
+ "react-dom": "^18.2.0",
15
+ "framer-motion": "^10.16.16",
16
+ "lucide-react": "^0.303.0",
17
+ "react-helmet-async": "^2.0.4",
18
+ "class-variance-authority": "^0.7.0",
19
+ "clsx": "^2.1.0",
20
+ "tailwind-merge": "^2.2.0",
21
+ "@mdx-js/react": "^3.0.0",
22
+ "@mdx-js/rollup": "^3.0.0",
23
+ "gray-matter": "^4.0.3",
24
+ "reading-time": "^1.5.0"
25
+ },
26
+ "devDependencies": {
27
+ "@types/react": "^18.2.48",
28
+ "@types/react-dom": "^18.2.18",
29
+ "@types/mdx": "^2.0.10",
30
+ "@vitejs/plugin-react": "^4.2.1",
31
+ "typescript": "^5.3.3",
32
+ "vite": "^5.0.11",
33
+ "tailwindcss": "^3.4.1",
34
+ "autoprefixer": "^10.4.16",
35
+ "postcss": "^8.4.33"
36
+ }
37
+ }