subaya 1.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.
- package/README.md +156 -0
- package/dist/commands/api/OrpcGeneratorCommand.d.ts +16 -0
- package/dist/commands/api/OrpcGeneratorCommand.d.ts.map +1 -0
- package/dist/commands/api/OrpcGeneratorCommand.js +100 -0
- package/dist/commands/api/OrpcGeneratorCommand.js.map +1 -0
- package/dist/commands/api/generators/ApiMethodGenerator.d.ts +22 -0
- package/dist/commands/api/generators/ApiMethodGenerator.d.ts.map +1 -0
- package/dist/commands/api/generators/ApiMethodGenerator.js +73 -0
- package/dist/commands/api/generators/ApiMethodGenerator.js.map +1 -0
- package/dist/commands/api/generators/QueryStringGenerator.d.ts +7 -0
- package/dist/commands/api/generators/QueryStringGenerator.d.ts.map +1 -0
- package/dist/commands/api/generators/QueryStringGenerator.js +34 -0
- package/dist/commands/api/generators/QueryStringGenerator.js.map +1 -0
- package/dist/commands/api/generators/SchemaGenerator.d.ts +5 -0
- package/dist/commands/api/generators/SchemaGenerator.d.ts.map +1 -0
- package/dist/commands/api/generators/SchemaGenerator.js +61 -0
- package/dist/commands/api/generators/SchemaGenerator.js.map +1 -0
- package/dist/commands/api/services/ApiFileWriter.d.ts +9 -0
- package/dist/commands/api/services/ApiFileWriter.d.ts.map +1 -0
- package/dist/commands/api/services/ApiFileWriter.js +112 -0
- package/dist/commands/api/services/ApiFileWriter.js.map +1 -0
- package/dist/commands/api/services/DependencyChecker.d.ts +6 -0
- package/dist/commands/api/services/DependencyChecker.d.ts.map +1 -0
- package/dist/commands/api/services/DependencyChecker.js +63 -0
- package/dist/commands/api/services/DependencyChecker.js.map +1 -0
- package/dist/commands/api/utils/CommentGenerator.d.ts +6 -0
- package/dist/commands/api/utils/CommentGenerator.d.ts.map +1 -0
- package/dist/commands/api/utils/CommentGenerator.js +52 -0
- package/dist/commands/api/utils/CommentGenerator.js.map +1 -0
- package/dist/commands/api/utils/ParameterExtractor.d.ts +10 -0
- package/dist/commands/api/utils/ParameterExtractor.d.ts.map +1 -0
- package/dist/commands/api/utils/ParameterExtractor.js +29 -0
- package/dist/commands/api/utils/ParameterExtractor.js.map +1 -0
- package/dist/commands/api/utils/ResponseTypeExtractor.d.ts +9 -0
- package/dist/commands/api/utils/ResponseTypeExtractor.d.ts.map +1 -0
- package/dist/commands/api/utils/ResponseTypeExtractor.js +36 -0
- package/dist/commands/api/utils/ResponseTypeExtractor.js.map +1 -0
- package/dist/commands/api/utils/TypeResolver.d.ts +6 -0
- package/dist/commands/api/utils/TypeResolver.d.ts.map +1 -0
- package/dist/commands/api/utils/TypeResolver.js +38 -0
- package/dist/commands/api/utils/TypeResolver.js.map +1 -0
- package/dist/commands/axios/AxiosGeneratorCommand.d.ts +5 -0
- package/dist/commands/axios/AxiosGeneratorCommand.d.ts.map +1 -0
- package/dist/commands/axios/AxiosGeneratorCommand.js +56 -0
- package/dist/commands/axios/AxiosGeneratorCommand.js.map +1 -0
- package/dist/commands/env/EnvGeneratorCommand.d.ts +8 -0
- package/dist/commands/env/EnvGeneratorCommand.d.ts.map +1 -0
- package/dist/commands/env/EnvGeneratorCommand.js +62 -0
- package/dist/commands/env/EnvGeneratorCommand.js.map +1 -0
- package/dist/commands/icon/IconGenerateCommand.d.ts +6 -0
- package/dist/commands/icon/IconGenerateCommand.d.ts.map +1 -0
- package/dist/commands/icon/IconGenerateCommand.js +103 -0
- package/dist/commands/icon/IconGenerateCommand.js.map +1 -0
- package/dist/commands/image/BackgroundRemoveCommand.d.ts +7 -0
- package/dist/commands/image/BackgroundRemoveCommand.d.ts.map +1 -0
- package/dist/commands/image/BackgroundRemoveCommand.js +89 -0
- package/dist/commands/image/BackgroundRemoveCommand.js.map +1 -0
- package/dist/commands/image/ImageOptimizeCommand.d.ts +8 -0
- package/dist/commands/image/ImageOptimizeCommand.d.ts.map +1 -0
- package/dist/commands/image/ImageOptimizeCommand.js +161 -0
- package/dist/commands/image/ImageOptimizeCommand.js.map +1 -0
- package/dist/commands/image/ImageResizeCommand.d.ts +5 -0
- package/dist/commands/image/ImageResizeCommand.d.ts.map +1 -0
- package/dist/commands/image/ImageResizeCommand.js +64 -0
- package/dist/commands/image/ImageResizeCommand.js.map +1 -0
- package/dist/commands/index.d.ts +4 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +4 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/localstorage/LocalstorageGeneratorCommand.d.ts +5 -0
- package/dist/commands/localstorage/LocalstorageGeneratorCommand.d.ts.map +1 -0
- package/dist/commands/localstorage/LocalstorageGeneratorCommand.js +45 -0
- package/dist/commands/localstorage/LocalstorageGeneratorCommand.js.map +1 -0
- package/dist/commands/provider/ProviderGeneratorCommand.d.ts +5 -0
- package/dist/commands/provider/ProviderGeneratorCommand.d.ts.map +1 -0
- package/dist/commands/provider/ProviderGeneratorCommand.js +54 -0
- package/dist/commands/provider/ProviderGeneratorCommand.js.map +1 -0
- package/dist/commands/route/NextRouteGeneratorCommand.d.ts +12 -0
- package/dist/commands/route/NextRouteGeneratorCommand.d.ts.map +1 -0
- package/dist/commands/route/NextRouteGeneratorCommand.js +126 -0
- package/dist/commands/route/NextRouteGeneratorCommand.js.map +1 -0
- package/dist/commands/share/ShareGeneratorCommand.d.ts +5 -0
- package/dist/commands/share/ShareGeneratorCommand.d.ts.map +1 -0
- package/dist/commands/share/ShareGeneratorCommand.js +44 -0
- package/dist/commands/share/ShareGeneratorCommand.js.map +1 -0
- package/dist/commands/state/StateGeneratorCommand.d.ts +10 -0
- package/dist/commands/state/StateGeneratorCommand.d.ts.map +1 -0
- package/dist/commands/state/StateGeneratorCommand.js +99 -0
- package/dist/commands/state/StateGeneratorCommand.js.map +1 -0
- package/dist/commands/supabase/SupabaseCommand.d.ts +7 -0
- package/dist/commands/supabase/SupabaseCommand.d.ts.map +1 -0
- package/dist/commands/supabase/SupabaseCommand.js +140 -0
- package/dist/commands/supabase/SupabaseCommand.js.map +1 -0
- package/dist/config/defaultConfig.d.ts +4 -0
- package/dist/config/defaultConfig.d.ts.map +1 -0
- package/dist/config/defaultConfig.js +15 -0
- package/dist/config/defaultConfig.js.map +1 -0
- package/dist/config/initial.d.ts +5 -0
- package/dist/config/initial.d.ts.map +1 -0
- package/dist/config/initial.js +32 -0
- package/dist/config/initial.js.map +1 -0
- package/dist/core/BaseCommand.d.ts +10 -0
- package/dist/core/BaseCommand.d.ts.map +1 -0
- package/dist/core/BaseCommand.js +36 -0
- package/dist/core/BaseCommand.js.map +1 -0
- package/dist/core/CommandRegistry.d.ts +15 -0
- package/dist/core/CommandRegistry.d.ts.map +1 -0
- package/dist/core/CommandRegistry.js +58 -0
- package/dist/core/CommandRegistry.js.map +1 -0
- package/dist/core/ConfigManager.d.ts +11 -0
- package/dist/core/ConfigManager.d.ts.map +1 -0
- package/dist/core/ConfigManager.js +42 -0
- package/dist/core/ConfigManager.js.map +1 -0
- package/dist/core/EnsureSystem.d.ts +10 -0
- package/dist/core/EnsureSystem.d.ts.map +1 -0
- package/dist/core/EnsureSystem.js +118 -0
- package/dist/core/EnsureSystem.js.map +1 -0
- package/dist/core/FileSystemService.d.ts +20 -0
- package/dist/core/FileSystemService.d.ts.map +1 -0
- package/dist/core/FileSystemService.js +97 -0
- package/dist/core/FileSystemService.js.map +1 -0
- package/dist/core/FrameworkDetector.d.ts +7 -0
- package/dist/core/FrameworkDetector.d.ts.map +1 -0
- package/dist/core/FrameworkDetector.js +33 -0
- package/dist/core/FrameworkDetector.js.map +1 -0
- package/dist/core/ProviderBuilder.d.ts +25 -0
- package/dist/core/ProviderBuilder.d.ts.map +1 -0
- package/dist/core/ProviderBuilder.js +227 -0
- package/dist/core/ProviderBuilder.js.map +1 -0
- package/dist/core/index.d.ts +7 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +7 -0
- package/dist/core/index.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +105 -0
- package/dist/index.js.map +1 -0
- package/dist/template/api/gen/httpClient.d.ts +2 -0
- package/dist/template/api/gen/httpClient.d.ts.map +1 -0
- package/dist/template/api/gen/httpClient.js +177 -0
- package/dist/template/api/gen/httpClient.js.map +1 -0
- package/dist/template/api/gen/queryApiClient.d.ts +2 -0
- package/dist/template/api/gen/queryApiClient.d.ts.map +1 -0
- package/dist/template/api/gen/queryApiClient.js +27 -0
- package/dist/template/api/gen/queryApiClient.js.map +1 -0
- package/dist/template/api/gen/queryReactQueryClient.d.ts +13 -0
- package/dist/template/api/gen/queryReactQueryClient.d.ts.map +1 -0
- package/dist/template/api/gen/queryReactQueryClient.js +159 -0
- package/dist/template/api/gen/queryReactQueryClient.js.map +1 -0
- package/dist/template/api/type/httpClientType.d.ts +2 -0
- package/dist/template/api/type/httpClientType.d.ts.map +1 -0
- package/dist/template/api/type/httpClientType.js +2 -0
- package/dist/template/api/type/httpClientType.js.map +1 -0
- package/dist/template/axios/instance.d.ts +2 -0
- package/dist/template/axios/instance.d.ts.map +1 -0
- package/dist/template/axios/instance.js +91 -0
- package/dist/template/axios/instance.js.map +1 -0
- package/dist/template/axios/refresh.d.ts +2 -0
- package/dist/template/axios/refresh.d.ts.map +1 -0
- package/dist/template/axios/refresh.js +81 -0
- package/dist/template/axios/refresh.js.map +1 -0
- package/dist/template/imageAsNext.d.ts +2 -0
- package/dist/template/imageAsNext.d.ts.map +1 -0
- package/dist/template/imageAsNext.js +104 -0
- package/dist/template/imageAsNext.js.map +1 -0
- package/dist/template/localstorage/LocalStorageManager.d.ts +2 -0
- package/dist/template/localstorage/LocalStorageManager.d.ts.map +1 -0
- package/dist/template/localstorage/LocalStorageManager.js +64 -0
- package/dist/template/localstorage/LocalStorageManager.js.map +1 -0
- package/dist/template/localstorage/localStorage.d.ts +2 -0
- package/dist/template/localstorage/localStorage.d.ts.map +1 -0
- package/dist/template/localstorage/localStorage.js +9 -0
- package/dist/template/localstorage/localStorage.js.map +1 -0
- package/dist/template/localstorage/localStorageType.d.ts +2 -0
- package/dist/template/localstorage/localStorageType.d.ts.map +1 -0
- package/dist/template/localstorage/localStorageType.js +6 -0
- package/dist/template/localstorage/localStorageType.js.map +1 -0
- package/dist/template/localstorage/useSharedStorage.d.ts +2 -0
- package/dist/template/localstorage/useSharedStorage.d.ts.map +1 -0
- package/dist/template/localstorage/useSharedStorage.js +24 -0
- package/dist/template/localstorage/useSharedStorage.js.map +1 -0
- package/dist/template/logger/api-logger.d.ts +2 -0
- package/dist/template/logger/api-logger.d.ts.map +1 -0
- package/dist/template/logger/api-logger.js +44 -0
- package/dist/template/logger/api-logger.js.map +1 -0
- package/dist/template/logger/styled-console.d.ts +2 -0
- package/dist/template/logger/styled-console.d.ts.map +1 -0
- package/dist/template/logger/styled-console.js +27 -0
- package/dist/template/logger/styled-console.js.map +1 -0
- package/dist/template/provider/defaultProvider.tsx +6 -0
- package/dist/template/provider/providerTemplates.d.ts +9 -0
- package/dist/template/provider/providerTemplates.d.ts.map +1 -0
- package/dist/template/provider/providerTemplates.js +40 -0
- package/dist/template/provider/providerTemplates.js.map +1 -0
- package/dist/template/provider/providerTemplates.ts +47 -0
- package/dist/template/share/copyText.d.ts +2 -0
- package/dist/template/share/copyText.d.ts.map +1 -0
- package/dist/template/share/copyText.js +12 -0
- package/dist/template/share/copyText.js.map +1 -0
- package/dist/template/share/sharer.d.ts +2 -0
- package/dist/template/share/sharer.d.ts.map +1 -0
- package/dist/template/share/sharer.js +211 -0
- package/dist/template/share/sharer.js.map +1 -0
- package/dist/template/share/useSharer.d.ts +2 -0
- package/dist/template/share/useSharer.d.ts.map +1 -0
- package/dist/template/share/useSharer.js +78 -0
- package/dist/template/share/useSharer.js.map +1 -0
- package/dist/template/state/zustand-persist.d.ts +2 -0
- package/dist/template/state/zustand-persist.d.ts.map +1 -0
- package/dist/template/state/zustand-persist.js +53 -0
- package/dist/template/state/zustand-persist.js.map +1 -0
- package/dist/template/state/zustand-provider-store.d.ts +2 -0
- package/dist/template/state/zustand-provider-store.d.ts.map +1 -0
- package/dist/template/state/zustand-provider-store.js +19 -0
- package/dist/template/state/zustand-provider-store.js.map +1 -0
- package/dist/template/state/zustand-provider.d.ts +2 -0
- package/dist/template/state/zustand-provider.d.ts.map +1 -0
- package/dist/template/state/zustand-provider.js +46 -0
- package/dist/template/state/zustand-provider.js.map +1 -0
- package/dist/template/state/zustand.d.ts +2 -0
- package/dist/template/state/zustand.d.ts.map +1 -0
- package/dist/template/state/zustand.js +38 -0
- package/dist/template/state/zustand.js.map +1 -0
- package/dist/template/supabase/actions/supabaseAdmin.d.ts +2 -0
- package/dist/template/supabase/actions/supabaseAdmin.d.ts.map +1 -0
- package/dist/template/supabase/actions/supabaseAdmin.js +21 -0
- package/dist/template/supabase/actions/supabaseAdmin.js.map +1 -0
- package/dist/template/supabase/actions/supabaseCrud.d.ts +3 -0
- package/dist/template/supabase/actions/supabaseCrud.d.ts.map +1 -0
- package/dist/template/supabase/actions/supabaseCrud.js +72 -0
- package/dist/template/supabase/actions/supabaseCrud.js.map +1 -0
- package/dist/template/supabase/actions/supabaseCrudWithAdmin.d.ts +2 -0
- package/dist/template/supabase/actions/supabaseCrudWithAdmin.d.ts.map +1 -0
- package/dist/template/supabase/actions/supabaseCrudWithAdmin.js +57 -0
- package/dist/template/supabase/actions/supabaseCrudWithAdmin.js.map +1 -0
- package/dist/template/supabase/supabaseAdminLayout.d.ts +2 -0
- package/dist/template/supabase/supabaseAdminLayout.d.ts.map +1 -0
- package/dist/template/supabase/supabaseAdminLayout.js +7 -0
- package/dist/template/supabase/supabaseAdminLayout.js.map +1 -0
- package/dist/template/supabase/supabaseAdminLoginLayout.d.ts +2 -0
- package/dist/template/supabase/supabaseAdminLoginLayout.d.ts.map +1 -0
- package/dist/template/supabase/supabaseAdminLoginLayout.js +121 -0
- package/dist/template/supabase/supabaseAdminLoginLayout.js.map +1 -0
- package/dist/template/supabase/supabaseProxy.d.ts +2 -0
- package/dist/template/supabase/supabaseProxy.d.ts.map +1 -0
- package/dist/template/supabase/supabaseProxy.js +42 -0
- package/dist/template/supabase/supabaseProxy.js.map +1 -0
- package/dist/template/supabase/utilBase.d.ts +3 -0
- package/dist/template/supabase/utilBase.d.ts.map +1 -0
- package/dist/template/supabase/utilBase.js +29 -0
- package/dist/template/supabase/utilBase.js.map +1 -0
- package/dist/types/BaseExtensionCommands.d.ts +38 -0
- package/dist/types/BaseExtensionCommands.d.ts.map +1 -0
- package/dist/types/BaseExtensionCommands.js +20 -0
- package/dist/types/BaseExtensionCommands.js.map +1 -0
- package/dist/types/config.d.ts +19 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +2 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/env.d.ts +7 -0
- package/dist/types/env.d.ts.map +1 -0
- package/dist/types/env.js +5 -0
- package/dist/types/env.js.map +1 -0
- package/dist/types/index.d.ts +31 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/PathSearcher.d.ts +8 -0
- package/dist/utils/PathSearcher.d.ts.map +1 -0
- package/dist/utils/PathSearcher.js +40 -0
- package/dist/utils/PathSearcher.js.map +1 -0
- package/dist/utils/askInput.d.ts +10 -0
- package/dist/utils/askInput.d.ts.map +1 -0
- package/dist/utils/askInput.js +12 -0
- package/dist/utils/askInput.js.map +1 -0
- package/dist/utils/askSections.d.ts +13 -0
- package/dist/utils/askSections.d.ts.map +1 -0
- package/dist/utils/askSections.js +14 -0
- package/dist/utils/askSections.js.map +1 -0
- package/dist/utils/coverHyphenToQuotes.d.ts +2 -0
- package/dist/utils/coverHyphenToQuotes.d.ts.map +1 -0
- package/dist/utils/coverHyphenToQuotes.js +4 -0
- package/dist/utils/coverHyphenToQuotes.js.map +1 -0
- package/dist/utils/pathToAlias.d.ts +2 -0
- package/dist/utils/pathToAlias.d.ts.map +1 -0
- package/dist/utils/pathToAlias.js +4 -0
- package/dist/utils/pathToAlias.js.map +1 -0
- package/dist/utils/showSubaya.d.ts +2 -0
- package/dist/utils/showSubaya.d.ts.map +1 -0
- package/dist/utils/showSubaya.js +14 -0
- package/dist/utils/showSubaya.js.map +1 -0
- package/dist/utils/validateConfig.d.ts +3 -0
- package/dist/utils/validateConfig.d.ts.map +1 -0
- package/dist/utils/validateConfig.js +45 -0
- package/dist/utils/validateConfig.js.map +1 -0
- package/package.json +66 -0
package/README.md
ADDED
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
# IOG (Image Optimization Generator)
|
|
2
|
+
|
|
3
|
+
프론트엔드 개발을 위한 CLI 도구 라이브러리입니다. 이미지 최적화, 상태 관리, API 설정 등을 자동화합니다.
|
|
4
|
+
|
|
5
|
+
## 프로젝트 구조
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
src/
|
|
9
|
+
├── core/ # 코어 시스템
|
|
10
|
+
│ ├── BaseCommand.ts # 모든 커맨드의 베이스 클래스
|
|
11
|
+
│ ├── BaseExtensionCommands.ts # API, State, Route 커맨드 베이스
|
|
12
|
+
│ ├── CommandRegistry.ts # 커맨드 등록 및 관리
|
|
13
|
+
│ ├── ConfigManager.ts # 설정 관리 (Singleton)
|
|
14
|
+
│ ├── FileSystemService.ts # 파일 시스템 유틸리티
|
|
15
|
+
│ └── FrameworkDetector.ts # 프레임워크 감지
|
|
16
|
+
│
|
|
17
|
+
├── commands/ # 커맨드 구현
|
|
18
|
+
│ ├── image/
|
|
19
|
+
│ │ ├── ImageOptimizeCommand.ts # 이미지 최적화
|
|
20
|
+
│ │ ├── ImageResizeCommand.ts # 이미지 리사이즈
|
|
21
|
+
│ │ └── BackgroundRemoveCommand.ts # 배경 제거
|
|
22
|
+
│ ├── api/ # (향후 확장) axios, orpc
|
|
23
|
+
│ ├── state/ # (향후 확장) zustand, redux
|
|
24
|
+
│ └── route/ # (향후 확장) route 생성
|
|
25
|
+
│
|
|
26
|
+
├── utils/ # 유틸리티
|
|
27
|
+
│ └── PathSearcher.ts # 파일 검색
|
|
28
|
+
│
|
|
29
|
+
├── types/ # 타입 정의
|
|
30
|
+
│ └── index.ts
|
|
31
|
+
│
|
|
32
|
+
├── config/ # 기본 설정
|
|
33
|
+
│ └── index.ts
|
|
34
|
+
│
|
|
35
|
+
├── template/ # 템플릿
|
|
36
|
+
│ └── nextImage.ts
|
|
37
|
+
│
|
|
38
|
+
└── index.ts # CLI 진입점
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## 아키텍처
|
|
42
|
+
|
|
43
|
+
### 1. Core Layer
|
|
44
|
+
- **BaseCommand**: 모든 커맨드가 상속받는 추상 클래스
|
|
45
|
+
- **CommandRegistry**: 커맨드 등록 및 디스패칭
|
|
46
|
+
- **ConfigManager**: Singleton 패턴으로 설정 관리
|
|
47
|
+
- **FileSystemService**: 파일 시스템 작업 추상화
|
|
48
|
+
- **FrameworkDetector**: Next.js/React 자동 감지
|
|
49
|
+
|
|
50
|
+
### 2. Command Pattern
|
|
51
|
+
각 커맨드는 `ICommand` 인터페이스를 구현하며 `execute()` 메서드를 통해 실행됩니다.
|
|
52
|
+
|
|
53
|
+
```typescript
|
|
54
|
+
export interface ICommand {
|
|
55
|
+
execute(): Promise<void>
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export abstract class BaseCommand implements ICommand {
|
|
59
|
+
protected async getContext(): Promise<CommandContext>
|
|
60
|
+
abstract execute(): Promise<void>
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### 3. 확장 가능한 구조
|
|
65
|
+
새로운 기능 추가 시:
|
|
66
|
+
|
|
67
|
+
1. `commands/` 디렉토리에 새 커맨드 클래스 작성
|
|
68
|
+
2. `BaseCommand` 또는 `BaseApiCommand` 등을 상속
|
|
69
|
+
3. `CommandRegistry`에 등록
|
|
70
|
+
4. `types/index.ts`에 필요한 타입 추가
|
|
71
|
+
5. `config/index.ts`에 기본 설정 추가
|
|
72
|
+
|
|
73
|
+
## 사용법
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
# 설치
|
|
77
|
+
npm install -g image-optimization-generator
|
|
78
|
+
|
|
79
|
+
# 이미지 최적화
|
|
80
|
+
iog image optimize
|
|
81
|
+
|
|
82
|
+
# 이미지 리사이즈
|
|
83
|
+
iog image resize
|
|
84
|
+
|
|
85
|
+
# 배경 제거
|
|
86
|
+
iog image removebg
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## 설정 파일
|
|
90
|
+
|
|
91
|
+
프로젝트 루트에 `iog.config.js` 생성:
|
|
92
|
+
|
|
93
|
+
```javascript
|
|
94
|
+
export default {
|
|
95
|
+
image: {
|
|
96
|
+
inputImageDir: "public/images",
|
|
97
|
+
optimize: {
|
|
98
|
+
outputDir: "public/webp",
|
|
99
|
+
filePath: "src/generated/path/image.ts",
|
|
100
|
+
componentsPath: "src/components",
|
|
101
|
+
maxWidth: {
|
|
102
|
+
bg: 1920,
|
|
103
|
+
mbg: 1080,
|
|
104
|
+
thumb: 1080,
|
|
105
|
+
icon: 128,
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
removebg: {
|
|
109
|
+
removebgApiKey: null, // 또는 API 키
|
|
110
|
+
},
|
|
111
|
+
resize: {
|
|
112
|
+
maxWidth: 1920,
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
// 향후 확장
|
|
116
|
+
api: {
|
|
117
|
+
baseUrl: "https://api.example.com",
|
|
118
|
+
outputDir: "src/api",
|
|
119
|
+
},
|
|
120
|
+
state: {
|
|
121
|
+
type: "zustand",
|
|
122
|
+
outputDir: "src/store",
|
|
123
|
+
},
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## 향후 확장 계획
|
|
128
|
+
|
|
129
|
+
### API 관련
|
|
130
|
+
- Axios 인스턴스 자동 생성
|
|
131
|
+
- oRPC (tRPC 대체) 설정 생성
|
|
132
|
+
- API 라우트 자동 생성
|
|
133
|
+
|
|
134
|
+
### State 관리
|
|
135
|
+
- Zustand store 생성
|
|
136
|
+
- Redux toolkit 설정
|
|
137
|
+
- Jotai/Recoil 지원
|
|
138
|
+
|
|
139
|
+
### Route 관리
|
|
140
|
+
- Next.js App Router 자동 생성
|
|
141
|
+
- React Router 설정
|
|
142
|
+
|
|
143
|
+
## 개발
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
# 빌드
|
|
147
|
+
npm run build
|
|
148
|
+
|
|
149
|
+
# 로컬 테스트
|
|
150
|
+
npm link
|
|
151
|
+
iog image optimize
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## 라이선스
|
|
155
|
+
|
|
156
|
+
ISC
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { BaseApiCommand } from "../../types/BaseExtensionCommands.js";
|
|
2
|
+
import type { DefaultConfigType } from "../../types/config.js";
|
|
3
|
+
export declare class OrpcGeneratorCommand extends BaseApiCommand {
|
|
4
|
+
protected validateApiConfig(config: DefaultConfigType): {
|
|
5
|
+
hasBaseUrl: boolean;
|
|
6
|
+
};
|
|
7
|
+
generateAllApiAndQueries(paths: Record<string, any>, enumTypesContent: string): Promise<string>;
|
|
8
|
+
private writeAllApiFiles;
|
|
9
|
+
generateHttpClient(): Promise<void>;
|
|
10
|
+
generateReactQueryTypes(): Promise<void>;
|
|
11
|
+
generateApiClass(content: string): Promise<void>;
|
|
12
|
+
createApiClass(schemas: Record<string, any>): Promise<string>;
|
|
13
|
+
private checkDependencies;
|
|
14
|
+
execute(): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=OrpcGeneratorCommand.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OrpcGeneratorCommand.d.ts","sourceRoot":"","sources":["../../../src/commands/api/OrpcGeneratorCommand.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAA;AACrE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAc9D,qBAAa,oBAAqB,SAAQ,cAAc;IACtD,SAAS,CAAC,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG;QAAE,UAAU,EAAE,OAAO,CAAA;KAAE;IAMzE,wBAAwB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAwCvF,gBAAgB;IAOxB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;IAInC,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIxC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;YAIrD,iBAAiB;IAgBzB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAwB/B"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import fs from "fs-extra";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import { FileSystemService } from "../../core/FileSystemService.js";
|
|
4
|
+
import { BaseApiCommand } from "../../types/BaseExtensionCommands.js";
|
|
5
|
+
import { ProviderGeneratorCommand } from "../provider/ProviderGeneratorCommand.js";
|
|
6
|
+
import { ApiMethodGenerator } from "./generators/ApiMethodGenerator.js";
|
|
7
|
+
import { SchemaGenerator } from "./generators/SchemaGenerator.js";
|
|
8
|
+
import { ApiFileWriter } from "./services/ApiFileWriter.js";
|
|
9
|
+
import { DependencyChecker } from "./services/DependencyChecker.js";
|
|
10
|
+
export class OrpcGeneratorCommand extends BaseApiCommand {
|
|
11
|
+
validateApiConfig(config) {
|
|
12
|
+
return {
|
|
13
|
+
hasBaseUrl: !!config?.api?.baseUrl,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
async generateAllApiAndQueries(paths, enumTypesContent) {
|
|
17
|
+
const categorizedQueries = {};
|
|
18
|
+
let allEnumTypes = enumTypesContent;
|
|
19
|
+
for (const [pathName, methods] of Object.entries(paths)) {
|
|
20
|
+
for (const [method, data] of Object.entries(methods)) {
|
|
21
|
+
try {
|
|
22
|
+
const result = ApiMethodGenerator.generate(pathName, method, data);
|
|
23
|
+
allEnumTypes += result.enumTypes;
|
|
24
|
+
const tags = data.tags || [];
|
|
25
|
+
for (const tag of tags) {
|
|
26
|
+
if (!categorizedQueries[tag]) {
|
|
27
|
+
categorizedQueries[tag] = {
|
|
28
|
+
queries: [],
|
|
29
|
+
importTypeArr: [],
|
|
30
|
+
methods: [],
|
|
31
|
+
errorTypeArr: [],
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
categorizedQueries[tag].queries.push(result.methodOutput);
|
|
35
|
+
categorizedQueries[tag].importTypeArr.push(...result.importTypeArr);
|
|
36
|
+
categorizedQueries[tag].methods.push(result.methodInfo);
|
|
37
|
+
if (result.errorTypes.length > 0) {
|
|
38
|
+
const filteredErrorTypes = result.errorTypes.filter((t) => !t.includes("Record"));
|
|
39
|
+
categorizedQueries[tag].errorTypeArr.push(...filteredErrorTypes);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
await this.writeAllApiFiles(categorizedQueries);
|
|
49
|
+
return allEnumTypes;
|
|
50
|
+
}
|
|
51
|
+
async writeAllApiFiles(categorizedQueries) {
|
|
52
|
+
for (const [tag, data] of Object.entries(categorizedQueries)) {
|
|
53
|
+
await ApiFileWriter.writeApiClient(tag, data.queries, data.importTypeArr);
|
|
54
|
+
await ApiFileWriter.writeReactQueryHooks(tag, data.methods, data.errorTypeArr);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async generateHttpClient() {
|
|
58
|
+
await ApiFileWriter.writeHttpClient();
|
|
59
|
+
}
|
|
60
|
+
async generateReactQueryTypes() {
|
|
61
|
+
await ApiFileWriter.writeReactQueryTypes();
|
|
62
|
+
}
|
|
63
|
+
async generateApiClass(content) {
|
|
64
|
+
await ApiFileWriter.writeDataContracts(content);
|
|
65
|
+
}
|
|
66
|
+
async createApiClass(schemas) {
|
|
67
|
+
return SchemaGenerator.generate(schemas);
|
|
68
|
+
}
|
|
69
|
+
async checkDependencies() {
|
|
70
|
+
const axiosDir = path.join(FileSystemService.getOutputPath("configs"), "axios");
|
|
71
|
+
const storeDir = FileSystemService.getOutputPath("store");
|
|
72
|
+
const configsDir = FileSystemService.getOutputPath("configs");
|
|
73
|
+
await DependencyChecker.checkAndGenerateAxios(axiosDir);
|
|
74
|
+
const hasAxiosInstance = await FileSystemService.hasFile(axiosDir, "instance.ts");
|
|
75
|
+
await DependencyChecker.checkAndGenerateStorage(storeDir, !hasAxiosInstance);
|
|
76
|
+
await DependencyChecker.checkAndGenerateEnv(configsDir);
|
|
77
|
+
await new ProviderGeneratorCommand().execute(["reactquery"]);
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
async execute() {
|
|
81
|
+
await this.getContext();
|
|
82
|
+
const config = this.getConfig();
|
|
83
|
+
await fs.ensureDir(FileSystemService.getOutputPath("generated"));
|
|
84
|
+
const { hasBaseUrl } = this.validateApiConfig(config);
|
|
85
|
+
if (!hasBaseUrl || !config.api.baseUrl) {
|
|
86
|
+
console.warn("⚠️ oRPC baseUrl is not set.");
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
await this.checkDependencies();
|
|
90
|
+
const response = await fetch(config.api.baseUrl);
|
|
91
|
+
const data = await response.json();
|
|
92
|
+
await this.generateHttpClient();
|
|
93
|
+
await this.generateReactQueryTypes();
|
|
94
|
+
const schemaContent = await this.createApiClass(data.components.schemas);
|
|
95
|
+
const finalContent = await this.generateAllApiAndQueries(data.paths, schemaContent);
|
|
96
|
+
await this.generateApiClass(finalContent);
|
|
97
|
+
console.log("✅ oRPC configuration generated successfully");
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=OrpcGeneratorCommand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OrpcGeneratorCommand.js","sourceRoot":"","sources":["../../../src/commands/api/OrpcGeneratorCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAA;AACzB,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAA;AAErE,OAAO,EAAE,wBAAwB,EAAE,MAAM,yCAAyC,CAAA;AAClF,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAA;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AASnE,MAAM,OAAO,oBAAqB,SAAQ,cAAc;IAC5C,iBAAiB,CAAC,MAAyB;QACnD,OAAO;YACL,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO;SACnC,CAAA;IACH,CAAC;IAED,KAAK,CAAC,wBAAwB,CAAC,KAA0B,EAAE,gBAAwB;QACjF,MAAM,kBAAkB,GAAuC,EAAE,CAAA;QACjE,IAAI,YAAY,GAAG,gBAAgB,CAAA;QAEnC,KAAK,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACxD,KAAK,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBACrD,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAW,CAAC,CAAA;oBACzE,YAAY,IAAI,MAAM,CAAC,SAAS,CAAA;oBAEhC,MAAM,IAAI,GAAI,IAAY,CAAC,IAAI,IAAI,EAAE,CAAA;oBACrC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;wBACvB,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;4BAC7B,kBAAkB,CAAC,GAAG,CAAC,GAAG;gCACxB,OAAO,EAAE,EAAE;gCACX,aAAa,EAAE,EAAE;gCACjB,OAAO,EAAE,EAAE;gCACX,YAAY,EAAE,EAAE;6BACjB,CAAA;wBACH,CAAC;wBAED,kBAAkB,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;wBACzD,kBAAkB,CAAC,GAAG,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,aAAa,CAAC,CAAA;wBACnE,kBAAkB,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;wBAEvD,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;4BACjC,MAAM,kBAAkB,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAA;4BACjF,kBAAkB,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,CAAA;wBAClE,CAAC;oBACH,CAAC;gBACH,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,SAAQ;gBACV,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,CAAA;QAC/C,OAAO,YAAY,CAAA;IACrB,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,kBAAsD;QACnF,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAC7D,MAAM,aAAa,CAAC,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,CAAA;YACzE,MAAM,aAAa,CAAC,oBAAoB,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,CAAA;QAChF,CAAC;IACH,CAAC;IAED,KAAK,CAAC,kBAAkB;QACtB,MAAM,aAAa,CAAC,eAAe,EAAE,CAAA;IACvC,CAAC;IAED,KAAK,CAAC,uBAAuB;QAC3B,MAAM,aAAa,CAAC,oBAAoB,EAAE,CAAA;IAC5C,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,OAAe;QACpC,MAAM,aAAa,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAA;IACjD,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,OAA4B;QAC/C,OAAO,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IAC1C,CAAC;IAEO,KAAK,CAAC,iBAAiB;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,CAAA;QAC/E,MAAM,QAAQ,GAAG,iBAAiB,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;QACzD,MAAM,UAAU,GAAG,iBAAiB,CAAC,aAAa,CAAC,SAAS,CAAC,CAAA;QAE7D,MAAM,iBAAiB,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAA;QAEvD,MAAM,gBAAgB,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAA;QAEjF,MAAM,iBAAiB,CAAC,uBAAuB,CAAC,QAAQ,EAAE,CAAC,gBAAgB,CAAC,CAAA;QAC5E,MAAM,iBAAiB,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAA;QACvD,MAAM,IAAI,wBAAwB,EAAE,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAA;QAE5D,OAAO,IAAI,CAAA;IACb,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAA;QAC/B,MAAM,EAAE,CAAC,SAAS,CAAC,iBAAiB,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAA;QAEhE,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAA;QACrD,IAAI,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACvC,OAAO,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAA;YAC3C,OAAM;QACR,CAAC;QAED,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAA;QAE9B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QAChD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;QAElC,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAA;QAC/B,MAAM,IAAI,CAAC,uBAAuB,EAAE,CAAA;QACpC,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;QACxE,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,KAAK,EAAE,aAAa,CAAC,CAAA;QACnF,MAAM,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAA;QAEzC,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAA;IAC5D,CAAC;CACF"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface ApiMethodInfo {
|
|
2
|
+
operationId: string;
|
|
3
|
+
method: string;
|
|
4
|
+
hasQuery: boolean;
|
|
5
|
+
hasPathParams: boolean;
|
|
6
|
+
responseType: string;
|
|
7
|
+
errorType: string;
|
|
8
|
+
comments: string[];
|
|
9
|
+
isInfinite: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface ApiMethodResult {
|
|
12
|
+
methodOutput: string;
|
|
13
|
+
enumTypes: string;
|
|
14
|
+
importTypeArr: string[];
|
|
15
|
+
errorTypes: string[];
|
|
16
|
+
methodInfo: ApiMethodInfo;
|
|
17
|
+
}
|
|
18
|
+
export declare class ApiMethodGenerator {
|
|
19
|
+
static generate(pathName: string, method: string, data: any): ApiMethodResult;
|
|
20
|
+
private static buildMethodSignature;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=ApiMethodGenerator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApiMethodGenerator.d.ts","sourceRoot":"","sources":["../../../../src/commands/api/generators/ApiMethodGenerator.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,OAAO,CAAA;IACjB,aAAa,EAAE,OAAO,CAAA;IACtB,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,UAAU,EAAE,OAAO,CAAA;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,EAAE,CAAA;IACvB,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,UAAU,EAAE,aAAa,CAAA;CAC1B;AAED,qBAAa,kBAAkB;IAC7B,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,eAAe;IAyD7E,OAAO,CAAC,MAAM,CAAC,oBAAoB;CAsCpC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { pascalCase } from "change-case";
|
|
2
|
+
import { CommentGenerator } from "../utils/CommentGenerator.js";
|
|
3
|
+
import { ParameterExtractor } from "../utils/ParameterExtractor.js";
|
|
4
|
+
import { ResponseTypeExtractor } from "../utils/ResponseTypeExtractor.js";
|
|
5
|
+
import { TypeResolver } from "../utils/TypeResolver.js";
|
|
6
|
+
import { QueryStringGenerator } from "./QueryStringGenerator.js";
|
|
7
|
+
export class ApiMethodGenerator {
|
|
8
|
+
static generate(pathName, method, data) {
|
|
9
|
+
const importTypeArr = [];
|
|
10
|
+
const errorTypes = [];
|
|
11
|
+
if (!data.tags || data.tags.length === 0) {
|
|
12
|
+
throw new Error("No tags found");
|
|
13
|
+
}
|
|
14
|
+
const tags = data.tags;
|
|
15
|
+
const operationId = data.operationId || `${method}_${pathName.replace(/[^a-zA-Z0-9]/g, "_")}`;
|
|
16
|
+
const pascalOpId = pascalCase(operationId);
|
|
17
|
+
const camelOpId = pascalOpId.charAt(0).toLowerCase() + pascalOpId.slice(1);
|
|
18
|
+
const comments = CommentGenerator.collectApiComments(data, tags, pascalOpId, method, pathName);
|
|
19
|
+
let methodOutput = CommentGenerator.generate(comments);
|
|
20
|
+
const { pathParams, queryParams, hasBody, bodyType } = ParameterExtractor.extract(data);
|
|
21
|
+
const { responseType, errorType, errorTypes: extractedErrorTypes } = ResponseTypeExtractor.extract(data.responses);
|
|
22
|
+
errorTypes.push(...extractedErrorTypes);
|
|
23
|
+
const args = [...pathParams];
|
|
24
|
+
const { queryString, enumTypes } = QueryStringGenerator.generate(queryParams, camelOpId, importTypeArr);
|
|
25
|
+
if (queryString) {
|
|
26
|
+
args.push(queryString);
|
|
27
|
+
}
|
|
28
|
+
if (hasBody) {
|
|
29
|
+
args.push(`data: ${bodyType}`);
|
|
30
|
+
}
|
|
31
|
+
args.push("params?: RequestParams");
|
|
32
|
+
const templatePath = pathName.replace(/\{([^}]+)\}/g, (_, p1) => `\${variables?.${p1}}`);
|
|
33
|
+
args.forEach((arg) => TypeResolver.addImportType(arg, importTypeArr));
|
|
34
|
+
TypeResolver.addImportType(responseType, importTypeArr);
|
|
35
|
+
extractedErrorTypes.forEach((t) => TypeResolver.addImportType(t, importTypeArr));
|
|
36
|
+
methodOutput += this.buildMethodSignature(camelOpId, args, responseType, errorType, templatePath, method, queryParams, hasBody, data.security);
|
|
37
|
+
const methodInfo = {
|
|
38
|
+
operationId,
|
|
39
|
+
method,
|
|
40
|
+
hasQuery: queryParams.length > 0,
|
|
41
|
+
hasPathParams: pathParams.length > 0,
|
|
42
|
+
isInfinite: queryParams.some((q) => q.name === "offset"),
|
|
43
|
+
responseType,
|
|
44
|
+
errorType,
|
|
45
|
+
comments,
|
|
46
|
+
};
|
|
47
|
+
return { methodOutput, enumTypes, importTypeArr, errorTypes, methodInfo };
|
|
48
|
+
}
|
|
49
|
+
static buildMethodSignature(camelOpId, args, responseType, errorType, templatePath, method, queryParams, hasBody, isSecure) {
|
|
50
|
+
let output = "";
|
|
51
|
+
output += ` ${camelOpId} = (${args.length > 0 ? `variables?: {\n${args.map((a) => " " + a).join(",\n")}\n },\n` : ""}) =>\n`;
|
|
52
|
+
output += ` this.request<${responseType}, ${errorType}>({\n`;
|
|
53
|
+
output += ` path: \`${templatePath}\`,\n`;
|
|
54
|
+
output += ` method: "${method.toUpperCase()}",\n`;
|
|
55
|
+
if (queryParams.length > 0) {
|
|
56
|
+
output += " query: variables?.query,\n";
|
|
57
|
+
}
|
|
58
|
+
if (hasBody) {
|
|
59
|
+
output += " body: variables?.data,\n";
|
|
60
|
+
output += " type: ContentType.Json,\n";
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
output += ' format: "json",\n';
|
|
64
|
+
}
|
|
65
|
+
if (isSecure) {
|
|
66
|
+
output += " secure: true,\n";
|
|
67
|
+
}
|
|
68
|
+
output += " ...variables?.params,\n";
|
|
69
|
+
output += " })";
|
|
70
|
+
return output;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=ApiMethodGenerator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApiMethodGenerator.js","sourceRoot":"","sources":["../../../../src/commands/api/generators/ApiMethodGenerator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QueryStringGenerator.d.ts","sourceRoot":"","sources":["../../../../src/commands/api/generators/QueryStringGenerator.ts"],"names":[],"mappings":"AAGA,qBAAa,oBAAoB;IAC/B,MAAM,CAAC,QAAQ,CACb,WAAW,EAAE,GAAG,EAAE,EAClB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EAAE,GACtB;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;CAiC9C"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { pascalCase } from "change-case";
|
|
2
|
+
import { TypeResolver } from "../utils/TypeResolver.js";
|
|
3
|
+
export class QueryStringGenerator {
|
|
4
|
+
static generate(queryParams, camelOpId, importTypeArr) {
|
|
5
|
+
if (queryParams.length === 0) {
|
|
6
|
+
return { queryString: "", enumTypes: "" };
|
|
7
|
+
}
|
|
8
|
+
const isQueryRequired = queryParams.some((q) => q.required);
|
|
9
|
+
let queryStr = `query${isQueryRequired ? "" : "?"}: {\n`;
|
|
10
|
+
let enumTypes = "";
|
|
11
|
+
for (const q of queryParams) {
|
|
12
|
+
if (q.description) {
|
|
13
|
+
queryStr += ` /** ${q.description.replace(/\n/g, " ")} */\n`;
|
|
14
|
+
}
|
|
15
|
+
if (q.schema?.format) {
|
|
16
|
+
queryStr += ` /** @format ${q.schema.format} */\n`;
|
|
17
|
+
}
|
|
18
|
+
const qType = TypeResolver.resolve(q.schema || q, "", q.name);
|
|
19
|
+
if (q?.schema?.enum || q?.schema?.items?.enum) {
|
|
20
|
+
const enumArr = q?.schema?.enum || q?.schema?.items?.enum;
|
|
21
|
+
const target = pascalCase(camelOpId + "Params" + qType);
|
|
22
|
+
queryStr += ` ${q.name}${q.required ? "" : "?"}: ${target};\n`;
|
|
23
|
+
enumTypes += `export type ${target} = ${enumArr.map((e) => `'${e}'`).join(" | ")};\n\n`;
|
|
24
|
+
TypeResolver.addImportType(target, importTypeArr);
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
queryStr += ` ${q.name}${q.required ? "" : "?"}: ${qType};\n`;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
queryStr += " }";
|
|
31
|
+
return { queryString: queryStr, enumTypes };
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=QueryStringGenerator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QueryStringGenerator.js","sourceRoot":"","sources":["../../../../src/commands/api/generators/QueryStringGenerator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAEvD,MAAM,OAAO,oBAAoB;IAC/B,MAAM,CAAC,QAAQ,CACb,WAAkB,EAClB,SAAiB,EACjB,aAAuB;QAEvB,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAA;QAC3C,CAAC;QAED,MAAM,eAAe,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;QAC3D,IAAI,QAAQ,GAAG,QAAQ,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,OAAO,CAAA;QACxD,IAAI,SAAS,GAAG,EAAE,CAAA;QAElB,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;YAC5B,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;gBAClB,QAAQ,IAAI,eAAe,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,OAAO,CAAA;YACrE,CAAC;YACD,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;gBACrB,QAAQ,IAAI,uBAAuB,CAAC,CAAC,MAAM,CAAC,MAAM,OAAO,CAAA;YAC3D,CAAC;YAED,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAA;YAE7D,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;gBAC9C,MAAM,OAAO,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAA;gBACzD,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,GAAG,QAAQ,GAAG,KAAK,CAAC,CAAA;gBACvD,QAAQ,IAAI,WAAW,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,KAAK,CAAA;gBACrE,SAAS,IAAI,eAAe,MAAM,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAA;gBAC/F,YAAY,CAAC,aAAa,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;YACnD,CAAC;iBAAM,CAAC;gBACN,QAAQ,IAAI,WAAW,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,KAAK,CAAA;YACtE,CAAC;QACH,CAAC;QAED,QAAQ,IAAI,SAAS,CAAA;QACrB,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAA;IAC7C,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SchemaGenerator.d.ts","sourceRoot":"","sources":["../../../../src/commands/api/generators/SchemaGenerator.ts"],"names":[],"mappings":"AAIA,qBAAa,eAAe;IAC1B,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM;IAkDrD,OAAO,CAAC,MAAM,CAAC,gBAAgB;CAqBhC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { CommentGenerator } from "../utils/CommentGenerator.js";
|
|
2
|
+
import { TypeResolver } from "../utils/TypeResolver.js";
|
|
3
|
+
import { coverHyphenToQuotes } from "../../../utils/coverHyphenToQuotes.js";
|
|
4
|
+
export class SchemaGenerator {
|
|
5
|
+
static generate(schemas) {
|
|
6
|
+
let output = "";
|
|
7
|
+
const enums = {};
|
|
8
|
+
for (const [schemaName, schema] of Object.entries(schemas)) {
|
|
9
|
+
output += `export interface ${schemaName}Type {\n`;
|
|
10
|
+
const properties = schema.properties || {};
|
|
11
|
+
const requiredProps = schema.required || [];
|
|
12
|
+
for (const [propName, prop] of Object.entries(properties)) {
|
|
13
|
+
const comments = CommentGenerator.collectPropertyComments(prop);
|
|
14
|
+
if (comments.length > 0) {
|
|
15
|
+
output += CommentGenerator.generate(comments);
|
|
16
|
+
}
|
|
17
|
+
const isRequired = requiredProps.includes(propName);
|
|
18
|
+
const isReadOnly = prop.readOnly;
|
|
19
|
+
const isNullable = prop.nullable;
|
|
20
|
+
let propType = TypeResolver.resolve(prop, schemaName, propName);
|
|
21
|
+
if (isNullable) {
|
|
22
|
+
propType += " | null";
|
|
23
|
+
}
|
|
24
|
+
const modifier = isReadOnly ? "readonly " : "";
|
|
25
|
+
const optionalMark = isRequired ? "" : "?";
|
|
26
|
+
output += ` ${modifier}${coverHyphenToQuotes(propName)}${optionalMark}: ${propType};\n`;
|
|
27
|
+
const enumPropName = `${schemaName}${propName.charAt(0).toUpperCase()}${propName.slice(1)}Type`;
|
|
28
|
+
const propObj = prop;
|
|
29
|
+
if (propObj.enum?.length > 0 && !enums[enumPropName]) {
|
|
30
|
+
enums[enumPropName] = this.generateEnumType(propObj, enumPropName);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
output += "}\n\n";
|
|
34
|
+
}
|
|
35
|
+
output += "\n\n";
|
|
36
|
+
for (const enumOutput of Object.values(enums)) {
|
|
37
|
+
output += `${enumOutput}\n\n`;
|
|
38
|
+
}
|
|
39
|
+
return output.trim() + "\n\n";
|
|
40
|
+
}
|
|
41
|
+
static generateEnumType(prop, enumPropName) {
|
|
42
|
+
let enumOutput = "";
|
|
43
|
+
if (prop.description) {
|
|
44
|
+
const enumComments = prop.description.split("\n");
|
|
45
|
+
enumOutput = CommentGenerator.generate(enumComments);
|
|
46
|
+
}
|
|
47
|
+
if (prop["x-enumNames"]?.length > 0 && prop["x-enumNames"].length === prop.enum.length) {
|
|
48
|
+
enumOutput += `export type ${enumPropName} = keyof typeof ${enumPropName}Map;
|
|
49
|
+
export const ${enumPropName}Map = {
|
|
50
|
+
${prop.enum.map((e, index) => `${coverHyphenToQuotes(e)}: '${prop["x-enumNames"][index]}'`).join(",\n ")},
|
|
51
|
+
} as const;`;
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
enumOutput += `export type ${enumPropName}Map = {
|
|
55
|
+
${prop.enum.map((e) => `${e}`).join(" | ")},
|
|
56
|
+
};`;
|
|
57
|
+
}
|
|
58
|
+
return enumOutput;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=SchemaGenerator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SchemaGenerator.js","sourceRoot":"","sources":["../../../../src/commands/api/generators/SchemaGenerator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ApiMethodInfo } from "../generators/ApiMethodGenerator.js";
|
|
2
|
+
export declare class ApiFileWriter {
|
|
3
|
+
static writeApiClient(tag: string, queries: string[], importTypeArr: string[]): Promise<void>;
|
|
4
|
+
static writeReactQueryHooks(tag: string, methods: ApiMethodInfo[], errorTypeArr: string[]): Promise<void>;
|
|
5
|
+
static writeHttpClient(): Promise<void>;
|
|
6
|
+
static writeReactQueryTypes(): Promise<void>;
|
|
7
|
+
static writeDataContracts(content: string): Promise<void>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=ApiFileWriter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApiFileWriter.d.ts","sourceRoot":"","sources":["../../../../src/commands/api/services/ApiFileWriter.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAA;AAExE,qBAAa,aAAa;WACX,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;WAYtF,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;WAYlG,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;WAUhC,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;WAkErC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAShE"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { pascalCase } from "change-case";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import { FileSystemService } from "../../../core/FileSystemService.js";
|
|
4
|
+
import { genApiHttpClient } from "../../../template/api/gen/httpClient.js";
|
|
5
|
+
import { genQueryApiClient } from "../../../template/api/gen/queryApiClient.js";
|
|
6
|
+
import { genQueryReactQueryClient } from "../../../template/api/gen/queryReactQueryClient.js";
|
|
7
|
+
export class ApiFileWriter {
|
|
8
|
+
static async writeApiClient(tag, queries, importTypeArr) {
|
|
9
|
+
const name = pascalCase(tag);
|
|
10
|
+
const outputDir = path.join("src", "generated", "api", name);
|
|
11
|
+
await FileSystemService.writeFileOrSkip({
|
|
12
|
+
dir: outputDir,
|
|
13
|
+
generateType: "overwrite",
|
|
14
|
+
file: `${name}.api`,
|
|
15
|
+
content: genQueryApiClient(name, queries, importTypeArr),
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
static async writeReactQueryHooks(tag, methods, errorTypeArr) {
|
|
19
|
+
const name = pascalCase(tag);
|
|
20
|
+
const outputDir = path.join("src", "generated", "api", name);
|
|
21
|
+
await FileSystemService.writeFileOrSkip({
|
|
22
|
+
dir: outputDir,
|
|
23
|
+
generateType: "overwrite",
|
|
24
|
+
file: `${name}.query`,
|
|
25
|
+
content: genQueryReactQueryClient(name, methods, errorTypeArr),
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
static async writeHttpClient() {
|
|
29
|
+
const outputDir = path.join("src", "generated", "api", "@http-client");
|
|
30
|
+
await FileSystemService.writeFileOrSkip({
|
|
31
|
+
dir: outputDir,
|
|
32
|
+
generateType: "overwrite",
|
|
33
|
+
file: "index",
|
|
34
|
+
content: genApiHttpClient,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
static async writeReactQueryTypes() {
|
|
38
|
+
const content = `import {
|
|
39
|
+
DefaultError,
|
|
40
|
+
InfiniteData,
|
|
41
|
+
QueryKey,
|
|
42
|
+
UseInfiniteQueryOptions,
|
|
43
|
+
UseMutationOptions,
|
|
44
|
+
UseQueryOptions,
|
|
45
|
+
} from "@tanstack/react-query"
|
|
46
|
+
import { AxiosError } from 'axios'
|
|
47
|
+
|
|
48
|
+
export type QueryHookParams<
|
|
49
|
+
T extends CustomRequestFn,
|
|
50
|
+
Error = AxiosError<any>,
|
|
51
|
+
Data = RequestFnReturn<T>,
|
|
52
|
+
Variables = Parameter<T>
|
|
53
|
+
> = {
|
|
54
|
+
options?: Omit<UseQueryOptions<Data, Error>, 'queryKey' | 'queryFn'>
|
|
55
|
+
} & OptionalVariables<Variables>
|
|
56
|
+
|
|
57
|
+
export type InfiniteQueryHookParams<TQueryFnData, TError = DefaultError, TPageParam = number> = {
|
|
58
|
+
variables: any
|
|
59
|
+
options?: Omit<
|
|
60
|
+
UseInfiniteQueryOptions<
|
|
61
|
+
TQueryFnData,
|
|
62
|
+
TError,
|
|
63
|
+
InfiniteData<TQueryFnData, TPageParam>,
|
|
64
|
+
QueryKey,
|
|
65
|
+
TPageParam
|
|
66
|
+
>,
|
|
67
|
+
"queryKey" | "queryFn" | "initialPageParam" | "getNextPageParam" | "getPreviousPageParam"
|
|
68
|
+
>
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export type MutationHookParams<
|
|
72
|
+
T extends CustomRequestFn,
|
|
73
|
+
Error = AxiosError<any>,
|
|
74
|
+
Data = RequestFnReturn<T>,
|
|
75
|
+
Variables = Parameter<T>
|
|
76
|
+
> = {
|
|
77
|
+
options?: Omit<UseMutationOptions<Data, Error, Variables>, 'mutationFn' | 'mutationKey'>
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export type OptionalVariables<T> = undefined extends T
|
|
81
|
+
? {
|
|
82
|
+
variables?: T
|
|
83
|
+
}
|
|
84
|
+
: {
|
|
85
|
+
variables: T
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export type Parameter<T> = T extends (param: infer U) => any ? U : never
|
|
89
|
+
|
|
90
|
+
export type CustomRequestFn = (variables?: any) => Promise<any>
|
|
91
|
+
|
|
92
|
+
export type RequestFnReturn<T extends CustomRequestFn> = Awaited<ReturnType<T>>
|
|
93
|
+
`;
|
|
94
|
+
const outputDir = path.join("src", "generated", "api", "@types");
|
|
95
|
+
await FileSystemService.writeFileOrSkip({
|
|
96
|
+
dir: outputDir,
|
|
97
|
+
generateType: "overwrite",
|
|
98
|
+
file: "react-query-type",
|
|
99
|
+
content,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
static async writeDataContracts(content) {
|
|
103
|
+
const outputDir = path.join("src", "generated", "api", "@types");
|
|
104
|
+
await FileSystemService.writeFileOrSkip({
|
|
105
|
+
dir: outputDir,
|
|
106
|
+
file: "data-contracts",
|
|
107
|
+
generateType: "overwrite",
|
|
108
|
+
content,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=ApiFileWriter.js.map
|