@daawoonkim/create-arch-app 0.1.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 (42) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +267 -0
  3. package/TESTING.md +224 -0
  4. package/bin/cli.js +4 -0
  5. package/create-arch-app_mvp_faa8b53b.plan.md +454 -0
  6. package/dist/commands/create.d.ts +2 -0
  7. package/dist/commands/create.d.ts.map +1 -0
  8. package/dist/commands/create.js +63 -0
  9. package/dist/commands/create.js.map +1 -0
  10. package/dist/generators/index.d.ts +3 -0
  11. package/dist/generators/index.d.ts.map +1 -0
  12. package/dist/generators/index.js +221 -0
  13. package/dist/generators/index.js.map +1 -0
  14. package/dist/generators/nextjs.d.ts +3 -0
  15. package/dist/generators/nextjs.d.ts.map +1 -0
  16. package/dist/generators/nextjs.js +253 -0
  17. package/dist/generators/nextjs.js.map +1 -0
  18. package/dist/generators/react.d.ts +3 -0
  19. package/dist/generators/react.d.ts.map +1 -0
  20. package/dist/generators/react.js +210 -0
  21. package/dist/generators/react.js.map +1 -0
  22. package/dist/index.d.ts +3 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +14 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/prompts/projectSetup.d.ts +3 -0
  27. package/dist/prompts/projectSetup.d.ts.map +1 -0
  28. package/dist/prompts/projectSetup.js +110 -0
  29. package/dist/prompts/projectSetup.js.map +1 -0
  30. package/dist/types.d.ts +22 -0
  31. package/dist/types.d.ts.map +1 -0
  32. package/dist/types.js +2 -0
  33. package/dist/types.js.map +1 -0
  34. package/dist/utils/dependencies.d.ts +5 -0
  35. package/dist/utils/dependencies.d.ts.map +1 -0
  36. package/dist/utils/dependencies.js +90 -0
  37. package/dist/utils/dependencies.js.map +1 -0
  38. package/dist/utils/fileSystem.d.ts +5 -0
  39. package/dist/utils/fileSystem.d.ts.map +1 -0
  40. package/dist/utils/fileSystem.js +23 -0
  41. package/dist/utils/fileSystem.js.map +1 -0
  42. package/package.json +51 -0
@@ -0,0 +1,210 @@
1
+ import path from 'path';
2
+ import { ensureDir, createFile } from '../utils/fileSystem.js';
3
+ export async function generateReactProject(config, projectPath) {
4
+ // src 디렉토리 생성
5
+ const srcPath = path.join(projectPath, 'src');
6
+ await ensureDir(srcPath);
7
+ // 아키텍처별 폴더 구조 생성
8
+ await generateArchitectureStructure(config, srcPath);
9
+ // index.html 생성
10
+ await generateIndexHtml(config, projectPath);
11
+ // main.tsx 생성
12
+ await generateMainTsx(config, srcPath);
13
+ // App.tsx 생성
14
+ await generateAppTsx(config, srcPath);
15
+ // vite.config.ts 생성
16
+ await generateViteConfig(projectPath);
17
+ // 스타일 파일 생성
18
+ await generateStyles(config, srcPath);
19
+ }
20
+ async function generateArchitectureStructure(config, srcPath) {
21
+ switch (config.architecture) {
22
+ case 'ddd':
23
+ await ensureDir(path.join(srcPath, 'domain/entities'));
24
+ await ensureDir(path.join(srcPath, 'domain/repositories'));
25
+ await ensureDir(path.join(srcPath, 'domain/services'));
26
+ await ensureDir(path.join(srcPath, 'application/usecases'));
27
+ await ensureDir(path.join(srcPath, 'application/ports'));
28
+ await ensureDir(path.join(srcPath, 'infrastructure/api'));
29
+ await ensureDir(path.join(srcPath, 'infrastructure/persistence'));
30
+ await ensureDir(path.join(srcPath, 'presentation/components'));
31
+ await ensureDir(path.join(srcPath, 'presentation/pages'));
32
+ // Example files
33
+ await createFile(path.join(srcPath, 'domain/entities/README.md'), '# Domain Entities\n\n비즈니스 엔티티를 정의합니다.');
34
+ await createFile(path.join(srcPath, 'application/usecases/README.md'), '# Use Cases\n\n애플리케이션 유스케이스를 구현합니다.');
35
+ break;
36
+ case 'clean':
37
+ await ensureDir(path.join(srcPath, 'core/entities'));
38
+ await ensureDir(path.join(srcPath, 'core/usecases'));
39
+ await ensureDir(path.join(srcPath, 'core/interfaces'));
40
+ await ensureDir(path.join(srcPath, 'features/example/domain'));
41
+ await ensureDir(path.join(srcPath, 'features/example/data'));
42
+ await ensureDir(path.join(srcPath, 'features/example/presentation'));
43
+ await ensureDir(path.join(srcPath, 'shared/components'));
44
+ await ensureDir(path.join(srcPath, 'shared/utils'));
45
+ await createFile(path.join(srcPath, 'core/entities/README.md'), '# Core Entities\n\n핵심 비즈니스 엔티티를 정의합니다.');
46
+ await createFile(path.join(srcPath, 'features/example/README.md'), '# Example Feature\n\n기능별로 도메인, 데이터, 프레젠테이션 레이어를 구성합니다.');
47
+ break;
48
+ case 'atomic':
49
+ await ensureDir(path.join(srcPath, 'components/atoms'));
50
+ await ensureDir(path.join(srcPath, 'components/molecules'));
51
+ await ensureDir(path.join(srcPath, 'components/organisms'));
52
+ await ensureDir(path.join(srcPath, 'components/templates'));
53
+ await ensureDir(path.join(srcPath, 'components/pages'));
54
+ await ensureDir(path.join(srcPath, 'hooks'));
55
+ await ensureDir(path.join(srcPath, 'utils'));
56
+ // Example Button component
57
+ await createFile(path.join(srcPath, 'components/atoms/Button.tsx'), `interface ButtonProps {
58
+ children: React.ReactNode;
59
+ onClick?: () => void;
60
+ variant?: 'primary' | 'secondary';
61
+ }
62
+
63
+ export const Button: React.FC<ButtonProps> = ({
64
+ children,
65
+ onClick,
66
+ variant = 'primary',
67
+ }) => {
68
+ const baseStyles = 'px-4 py-2 rounded font-medium transition-colors';
69
+ const variantStyles = variant === 'primary'
70
+ ? 'bg-blue-500 hover:bg-blue-600 text-white'
71
+ : 'bg-gray-200 hover:bg-gray-300 text-gray-800';
72
+
73
+ return (
74
+ <button
75
+ onClick={onClick}
76
+ className={\`\${baseStyles} \${variantStyles}\`}
77
+ >
78
+ {children}
79
+ </button>
80
+ );
81
+ };
82
+ `);
83
+ await createFile(path.join(srcPath, 'components/atoms/README.md'), '# Atoms\n\n가장 작은 UI 컴포넌트 단위입니다. (Button, Input, Label 등)');
84
+ break;
85
+ case 'default':
86
+ default:
87
+ await ensureDir(path.join(srcPath, 'components'));
88
+ await ensureDir(path.join(srcPath, 'hooks'));
89
+ await ensureDir(path.join(srcPath, 'utils'));
90
+ await ensureDir(path.join(srcPath, 'types'));
91
+ await createFile(path.join(srcPath, 'components/README.md'), '# Components\n\nReact 컴포넌트를 작성합니다.');
92
+ break;
93
+ }
94
+ // 공통 타입 디렉토리
95
+ await ensureDir(path.join(srcPath, 'types'));
96
+ }
97
+ async function generateIndexHtml(config, projectPath) {
98
+ const content = `<!DOCTYPE html>
99
+ <html lang="ko">
100
+ <head>
101
+ <meta charset="UTF-8" />
102
+ <link rel="icon" type="image/svg+xml" href="/vite.svg" />
103
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
104
+ <title>${config.projectName}</title>
105
+ </head>
106
+ <body>
107
+ <div id="root"></div>
108
+ <script type="module" src="/src/main.tsx"></script>
109
+ </body>
110
+ </html>
111
+ `;
112
+ await createFile(path.join(projectPath, 'index.html'), content);
113
+ }
114
+ async function generateMainTsx(config, srcPath) {
115
+ const imports = ["import React from 'react'", "import ReactDOM from 'react-dom/client'"];
116
+ if (config.styling === 'tailwind') {
117
+ imports.push("import './index.css'");
118
+ }
119
+ else {
120
+ imports.push("import './index.css'");
121
+ }
122
+ imports.push("import App from './App'");
123
+ const content = `${imports.join('\n')}
124
+
125
+ ReactDOM.createRoot(document.getElementById('root')!).render(
126
+ <React.StrictMode>
127
+ <App />
128
+ </React.StrictMode>,
129
+ )
130
+ `;
131
+ await createFile(path.join(srcPath, 'main.tsx'), content);
132
+ }
133
+ async function generateAppTsx(config, srcPath) {
134
+ let componentPath = './components';
135
+ if (config.architecture === 'ddd') {
136
+ componentPath = './presentation/components';
137
+ }
138
+ else if (config.architecture === 'clean') {
139
+ componentPath = './shared/components';
140
+ }
141
+ else if (config.architecture === 'atomic') {
142
+ componentPath = './components/atoms';
143
+ }
144
+ const content = `function App() {
145
+ return (
146
+ <div className="min-h-screen flex items-center justify-center bg-gray-100">
147
+ <div className="text-center">
148
+ <h1 className="text-4xl font-bold text-gray-900 mb-4">
149
+ ${config.projectName}
150
+ </h1>
151
+ <p className="text-lg text-gray-600 mb-8">
152
+ Created with create-arch-app
153
+ </p>
154
+ <div className="space-y-2 text-sm text-gray-500">
155
+ <p>Framework: React with Vite</p>
156
+ <p>Architecture: ${config.architecture}</p>
157
+ <p>Styling: ${config.styling}</p>
158
+ </div>
159
+ </div>
160
+ </div>
161
+ )
162
+ }
163
+
164
+ export default App
165
+ `;
166
+ await createFile(path.join(srcPath, 'App.tsx'), content);
167
+ }
168
+ async function generateViteConfig(projectPath) {
169
+ const content = `import { defineConfig } from 'vite'
170
+ import react from '@vitejs/plugin-react'
171
+
172
+ // https://vitejs.dev/config/
173
+ export default defineConfig({
174
+ plugins: [react()],
175
+ })
176
+ `;
177
+ await createFile(path.join(projectPath, 'vite.config.ts'), content);
178
+ }
179
+ async function generateStyles(config, srcPath) {
180
+ let content;
181
+ if (config.styling === 'tailwind') {
182
+ content = `@tailwind base;
183
+ @tailwind components;
184
+ @tailwind utilities;
185
+ `;
186
+ }
187
+ else {
188
+ content = `* {
189
+ margin: 0;
190
+ padding: 0;
191
+ box-sizing: border-box;
192
+ }
193
+
194
+ body {
195
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
196
+ 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
197
+ sans-serif;
198
+ -webkit-font-smoothing: antialiased;
199
+ -moz-osx-font-smoothing: grayscale;
200
+ }
201
+
202
+ code {
203
+ font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
204
+ monospace;
205
+ }
206
+ `;
207
+ }
208
+ await createFile(path.join(srcPath, 'index.css'), content);
209
+ }
210
+ //# sourceMappingURL=react.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.js","sourceRoot":"","sources":["../../src/generators/react.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { createProject } from './commands/create.js';
4
+ const program = new Command();
5
+ program
6
+ .name('create-arch-app')
7
+ .description('CLI tool to scaffold React/Next.js projects with architectural patterns')
8
+ .version('0.1.0')
9
+ .argument('[project-name]', 'name of the project')
10
+ .action(async (projectName) => {
11
+ await createProject(projectName);
12
+ });
13
+ program.parse();
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,iBAAiB,CAAC;KACvB,WAAW,CAAC,yEAAyE,CAAC;KACtF,OAAO,CAAC,OAAO,CAAC;KAChB,QAAQ,CAAC,gBAAgB,EAAE,qBAAqB,CAAC;KACjD,MAAM,CAAC,KAAK,EAAE,WAAoB,EAAE,EAAE;IACrC,MAAM,aAAa,CAAC,WAAW,CAAC,CAAC;AACnC,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { ProjectConfig } from '../types.js';
2
+ export declare function promptProjectSetup(projectName?: string): Promise<ProjectConfig>;
3
+ //# sourceMappingURL=projectSetup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectSetup.d.ts","sourceRoot":"","sources":["../../src/prompts/projectSetup.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAA+F,MAAM,aAAa,CAAC;AAczI,wBAAsB,kBAAkB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CA4GrF"}
@@ -0,0 +1,110 @@
1
+ import inquirer from 'inquirer';
2
+ export async function promptProjectSetup(projectName) {
3
+ const answers = await inquirer.prompt([
4
+ {
5
+ type: 'input',
6
+ name: 'projectName',
7
+ message: '프로젝트 이름을 입력하세요:',
8
+ default: 'my-app',
9
+ when: !projectName,
10
+ validate: (input) => {
11
+ if (!input.trim()) {
12
+ return '프로젝트 이름은 필수입니다.';
13
+ }
14
+ if (!/^[a-z0-9-_]+$/.test(input)) {
15
+ return '프로젝트 이름은 소문자, 숫자, 하이픈, 언더스코어만 사용 가능합니다.';
16
+ }
17
+ return true;
18
+ }
19
+ },
20
+ {
21
+ type: 'list',
22
+ name: 'framework',
23
+ message: '프레임워크를 선택하세요:',
24
+ choices: [
25
+ { name: 'React (with Vite)', value: 'react' },
26
+ { name: 'Next.js', value: 'nextjs' }
27
+ ]
28
+ },
29
+ {
30
+ type: 'list',
31
+ name: 'nextjsVersion',
32
+ message: 'Next.js 버전을 선택하세요:',
33
+ choices: [
34
+ { name: 'Latest (최신 버전, 권장)', value: 'latest' },
35
+ { name: 'Next.js 15.x', value: '15' },
36
+ { name: 'Next.js 14.x', value: '14' },
37
+ { name: 'Next.js 13.x', value: '13' }
38
+ ],
39
+ default: 'latest',
40
+ when: (answers) => answers.framework === 'nextjs'
41
+ },
42
+ {
43
+ type: 'list',
44
+ name: 'router',
45
+ message: 'Next.js 라우터를 선택하세요:',
46
+ choices: [
47
+ { name: 'App Router (권장)', value: 'app' },
48
+ { name: 'Pages Router', value: 'pages' }
49
+ ],
50
+ when: (answers) => answers.framework === 'nextjs'
51
+ },
52
+ {
53
+ type: 'list',
54
+ name: 'architecture',
55
+ message: '아키텍처 패턴을 선택하세요:',
56
+ choices: [
57
+ { name: 'DDD (Domain-Driven Design) - 엔터프라이즈급', value: 'ddd' },
58
+ { name: 'Clean Architecture - 레이어 분리 중심', value: 'clean' },
59
+ { name: 'Atomic Design - UI 컴포넌트 중심', value: 'atomic' },
60
+ { name: 'Default - 기본 구조', value: 'default' }
61
+ ]
62
+ },
63
+ {
64
+ type: 'list',
65
+ name: 'styling',
66
+ message: '스타일링 도구를 선택하세요:',
67
+ choices: [
68
+ { name: 'Tailwind CSS', value: 'tailwind' },
69
+ { name: 'CSS Modules', value: 'css-modules' }
70
+ ]
71
+ },
72
+ {
73
+ type: 'list',
74
+ name: 'stateManagement',
75
+ message: '상태관리 라이브러리를 선택하세요:',
76
+ choices: [
77
+ { name: 'Zustand (권장)', value: 'zustand' },
78
+ { name: 'Context API', value: 'context' },
79
+ { name: 'None', value: 'none' }
80
+ ]
81
+ },
82
+ {
83
+ type: 'list',
84
+ name: 'formLibrary',
85
+ message: '폼 라이브러리를 선택하세요:',
86
+ choices: [
87
+ { name: 'React Hook Form (권장)', value: 'react-hook-form' },
88
+ { name: 'None', value: 'none' }
89
+ ]
90
+ },
91
+ {
92
+ type: 'confirm',
93
+ name: 'testing',
94
+ message: '테스팅 도구를 포함하시겠습니까? (Vitest + Testing Library)',
95
+ default: true
96
+ }
97
+ ]);
98
+ return {
99
+ projectName: projectName || answers.projectName || 'my-app',
100
+ framework: answers.framework,
101
+ router: answers.router,
102
+ nextjsVersion: answers.nextjsVersion,
103
+ architecture: answers.architecture,
104
+ styling: answers.styling,
105
+ stateManagement: answers.stateManagement,
106
+ formLibrary: answers.formLibrary,
107
+ testing: answers.testing,
108
+ };
109
+ }
110
+ //# sourceMappingURL=projectSetup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectSetup.js","sourceRoot":"","sources":["../../src/prompts/projectSetup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export type Framework = 'react' | 'nextjs';
2
+ export type NextJsRouter = 'app' | 'pages';
3
+ export type NextJsVersion = 'latest' | '15' | '14' | '13';
4
+ export type Architecture = 'ddd' | 'clean' | 'atomic' | 'default';
5
+ export type Styling = 'tailwind' | 'css-modules';
6
+ export type StateManagement = 'zustand' | 'context' | 'none';
7
+ export type FormLibrary = 'react-hook-form' | 'none';
8
+ export interface ProjectConfig {
9
+ projectName: string;
10
+ framework: Framework;
11
+ router?: NextJsRouter;
12
+ nextjsVersion?: NextJsVersion;
13
+ architecture: Architecture;
14
+ styling: Styling;
15
+ stateManagement: StateManagement;
16
+ formLibrary: FormLibrary;
17
+ testing: boolean;
18
+ }
19
+ export interface TemplateData extends ProjectConfig {
20
+ projectPath: string;
21
+ }
22
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;AAC3C,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,OAAO,CAAC;AAC3C,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAC1D,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;AAClE,MAAM,MAAM,OAAO,GAAG,UAAU,GAAG,aAAa,CAAC;AACjD,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;AAC7D,MAAM,MAAM,WAAW,GAAG,iBAAiB,GAAG,MAAM,CAAC;AAErD,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,YAAY,EAAE,YAAY,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,eAAe,CAAC;IACjC,WAAW,EAAE,WAAW,CAAC;IACzB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,YAAa,SAAQ,aAAa;IACjD,WAAW,EAAE,MAAM,CAAC;CACrB"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ import { ProjectConfig } from '../types.js';
2
+ export declare function getDependencies(config: ProjectConfig): Record<string, string>;
3
+ export declare function getDevDependencies(config: ProjectConfig): Record<string, string>;
4
+ export declare function getScripts(config: ProjectConfig): Record<string, string>;
5
+ //# sourceMappingURL=dependencies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependencies.d.ts","sourceRoot":"","sources":["../../src/utils/dependencies.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAyC7E;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAmChF;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAoBxE"}
@@ -0,0 +1,90 @@
1
+ export function getDependencies(config) {
2
+ const deps = {};
3
+ // Framework
4
+ if (config.framework === 'react') {
5
+ deps.react = '^18.2.0';
6
+ deps['react-dom'] = '^18.2.0';
7
+ }
8
+ else if (config.framework === 'nextjs') {
9
+ // Next.js 버전 설정
10
+ const nextjsVersion = config.nextjsVersion || 'latest';
11
+ switch (nextjsVersion) {
12
+ case 'latest':
13
+ deps.next = 'latest';
14
+ break;
15
+ case '15':
16
+ deps.next = '^15.0.0';
17
+ break;
18
+ case '14':
19
+ deps.next = '^14.0.0';
20
+ break;
21
+ case '13':
22
+ deps.next = '^13.0.0';
23
+ break;
24
+ default:
25
+ deps.next = 'latest';
26
+ }
27
+ deps.react = '^18.2.0';
28
+ deps['react-dom'] = '^18.2.0';
29
+ }
30
+ // State Management
31
+ if (config.stateManagement === 'zustand') {
32
+ deps.zustand = '^4.4.7';
33
+ }
34
+ // Form Library
35
+ if (config.formLibrary === 'react-hook-form') {
36
+ deps['react-hook-form'] = '^7.49.3';
37
+ }
38
+ return deps;
39
+ }
40
+ export function getDevDependencies(config) {
41
+ const devDeps = {
42
+ typescript: '^5.3.3',
43
+ '@types/react': '^18.2.48',
44
+ '@types/react-dom': '^18.2.18',
45
+ };
46
+ // React with Vite
47
+ if (config.framework === 'react') {
48
+ devDeps.vite = '^5.0.11';
49
+ devDeps['@vitejs/plugin-react'] = '^4.2.1';
50
+ }
51
+ // Next.js
52
+ if (config.framework === 'nextjs') {
53
+ devDeps['@types/node'] = '^20.11.5';
54
+ }
55
+ // Tailwind CSS
56
+ if (config.styling === 'tailwind') {
57
+ devDeps.tailwindcss = '^3.4.1';
58
+ devDeps.autoprefixer = '^10.4.16';
59
+ devDeps.postcss = '^8.4.33';
60
+ }
61
+ // Testing
62
+ if (config.testing) {
63
+ devDeps.vitest = '^1.2.0';
64
+ devDeps['@testing-library/react'] = '^14.1.2';
65
+ devDeps['@testing-library/jest-dom'] = '^6.2.0';
66
+ devDeps['@testing-library/user-event'] = '^14.5.2';
67
+ devDeps['jsdom'] = '^23.2.0';
68
+ }
69
+ return devDeps;
70
+ }
71
+ export function getScripts(config) {
72
+ const scripts = {};
73
+ if (config.framework === 'react') {
74
+ scripts.dev = 'vite';
75
+ scripts.build = 'tsc && vite build';
76
+ scripts.preview = 'vite preview';
77
+ }
78
+ else if (config.framework === 'nextjs') {
79
+ scripts.dev = 'next dev';
80
+ scripts.build = 'next build';
81
+ scripts.start = 'next start';
82
+ scripts.lint = 'next lint';
83
+ }
84
+ if (config.testing) {
85
+ scripts.test = 'vitest';
86
+ scripts['test:ui'] = 'vitest --ui';
87
+ }
88
+ return scripts;
89
+ }
90
+ //# sourceMappingURL=dependencies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependencies.js","sourceRoot":"","sources":["../../src/utils/dependencies.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function copyTemplate(templateName: string, destinationPath: string): Promise<void>;
2
+ export declare function writeJson(filePath: string, data: any): Promise<void>;
3
+ export declare function ensureDir(dirPath: string): Promise<void>;
4
+ export declare function createFile(filePath: string, content: string): Promise<void>;
5
+ //# sourceMappingURL=fileSystem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileSystem.d.ts","sourceRoot":"","sources":["../../src/utils/fileSystem.ts"],"names":[],"mappings":"AAOA,wBAAsB,YAAY,CAChC,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,IAAI,CAAC,CAQf;AAED,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,GAAG,GACR,OAAO,CAAC,IAAI,CAAC,CAEf;AAED,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE9D;AAED,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAGf"}
@@ -0,0 +1,23 @@
1
+ import fs from 'fs-extra';
2
+ import path from 'path';
3
+ import { fileURLToPath } from 'url';
4
+ const __filename = fileURLToPath(import.meta.url);
5
+ const __dirname = path.dirname(__filename);
6
+ export async function copyTemplate(templateName, destinationPath) {
7
+ const templatePath = path.join(__dirname, '../../templates', templateName);
8
+ if (!(await fs.pathExists(templatePath))) {
9
+ throw new Error(`Template not found: ${templateName}`);
10
+ }
11
+ await fs.copy(templatePath, destinationPath);
12
+ }
13
+ export async function writeJson(filePath, data) {
14
+ await fs.writeJson(filePath, data, { spaces: 2 });
15
+ }
16
+ export async function ensureDir(dirPath) {
17
+ await fs.ensureDir(dirPath);
18
+ }
19
+ export async function createFile(filePath, content) {
20
+ await fs.ensureDir(path.dirname(filePath));
21
+ await fs.writeFile(filePath, content, 'utf-8');
22
+ }
23
+ //# sourceMappingURL=fileSystem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileSystem.js","sourceRoot":"","sources":["../../src/utils/fileSystem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,YAAoB,EACpB,eAAuB;IAEvB,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,EAAE,YAAY,CAAC,CAAC;IAE3E,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,uBAAuB,YAAY,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,QAAgB,EAChB,IAAS;IAET,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAe;IAC7C,MAAM,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,QAAgB,EAChB,OAAe;IAEf,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;AACjD,CAAC"}
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "@daawoonkim/create-arch-app",
3
+ "version": "0.1.0",
4
+ "description": "CLI tool to scaffold React/Next.js projects with DDD, Clean Architecture, and Atomic Design patterns",
5
+ "type": "module",
6
+ "bin": {
7
+ "create-arch-app": "./bin/cli.js"
8
+ },
9
+ "scripts": {
10
+ "build": "tsc",
11
+ "dev": "tsc --watch",
12
+ "prepublishOnly": "npm run build"
13
+ },
14
+ "keywords": [
15
+ "react",
16
+ "nextjs",
17
+ "ddd",
18
+ "clean-architecture",
19
+ "atomic-design",
20
+ "boilerplate",
21
+ "cli",
22
+ "scaffold",
23
+ "typescript"
24
+ ],
25
+ "author": "daawoonkim",
26
+ "license": "MIT",
27
+ "repository": {
28
+ "type": "git",
29
+ "url": "git@github.com:hec8897/create-arch-app.git"
30
+ },
31
+ "bugs": {
32
+ "url": "https://github.com/hec8897/create-arch-app/issues"
33
+ },
34
+ "homepage": "https://github.com/hec8897/create-arch-app#readme",
35
+ "dependencies": {
36
+ "commander": "^11.1.0",
37
+ "inquirer": "^9.2.12",
38
+ "fs-extra": "^11.2.0",
39
+ "chalk": "^5.3.0",
40
+ "ora": "^8.0.1"
41
+ },
42
+ "devDependencies": {
43
+ "@types/node": "^20.10.6",
44
+ "@types/fs-extra": "^11.0.4",
45
+ "@types/inquirer": "^9.0.7",
46
+ "typescript": "^5.3.3"
47
+ },
48
+ "engines": {
49
+ "node": ">=18.0.0"
50
+ }
51
+ }