@spaceflow/core 0.1.3 → 0.3.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/dist/index.js +2642 -3247
- package/dist/index.js.map +1 -1
- package/package.json +2 -13
- package/src/config/config-loader.ts +5 -6
- package/src/config/config-reader.service.ts +6 -11
- package/src/config/config-reader.ts +75 -0
- package/src/config/index.ts +4 -1
- package/src/config/load-env.ts +15 -0
- package/src/config/schema-generator.service.ts +0 -2
- package/src/config/spaceflow.config.ts +7 -20
- package/src/extension-system/define-extension.ts +25 -0
- package/src/extension-system/extension.interface.ts +0 -63
- package/src/extension-system/index.ts +5 -0
- package/src/extension-system/types.ts +201 -0
- package/src/index.ts +15 -18
- package/src/shared/claude-setup/claude-setup.service.ts +3 -8
- package/src/shared/claude-setup/index.ts +0 -1
- package/src/shared/feishu-sdk/feishu-sdk.service.ts +33 -21
- package/src/shared/feishu-sdk/fieshu-card.service.ts +9 -11
- package/src/shared/feishu-sdk/index.ts +0 -1
- package/src/shared/git-provider/adapters/gitea.adapter.ts +59 -22
- package/src/shared/git-provider/adapters/github.adapter.spec.ts +2 -1
- package/src/shared/git-provider/adapters/github.adapter.ts +200 -29
- package/src/shared/git-provider/adapters/gitlab.adapter.ts +78 -26
- package/src/shared/git-provider/git-provider.interface.ts +20 -1
- package/src/shared/git-provider/git-provider.service.ts +28 -6
- package/src/shared/git-provider/index.ts +0 -1
- package/src/shared/git-provider/types.ts +27 -0
- package/src/shared/git-sdk/git-sdk.service.ts +0 -2
- package/src/shared/git-sdk/index.ts +0 -1
- package/src/shared/llm-proxy/adapters/claude-code.adapter.spec.ts +15 -32
- package/src/shared/llm-proxy/adapters/claude-code.adapter.ts +5 -6
- package/src/shared/llm-proxy/adapters/open-code.adapter.ts +1 -3
- package/src/shared/llm-proxy/adapters/openai.adapter.spec.ts +7 -21
- package/src/shared/llm-proxy/adapters/openai.adapter.ts +1 -3
- package/src/shared/llm-proxy/index.ts +0 -1
- package/src/shared/llm-proxy/interfaces/config.interface.ts +8 -0
- package/src/shared/llm-proxy/llm-proxy.service.spec.ts +91 -68
- package/src/shared/llm-proxy/llm-proxy.service.ts +5 -8
- package/src/shared/mcp/index.ts +1 -33
- package/src/shared/output/index.ts +0 -1
- package/src/shared/output/output.service.ts +43 -13
- package/src/shared/rspack-config/rspack-config.ts +0 -6
- package/src/shared/storage/index.ts +0 -1
- package/src/shared/storage/storage.service.ts +16 -8
- package/src/shared/storage/types.ts +0 -44
- package/src/shared/verbose/index.ts +15 -0
- package/src/app.module.ts +0 -18
- package/src/config/config-reader.module.ts +0 -16
- package/src/shared/claude-setup/claude-setup.module.ts +0 -8
- package/src/shared/feishu-sdk/feishu-sdk.module.ts +0 -77
- package/src/shared/git-provider/git-provider.module.ts +0 -73
- package/src/shared/git-sdk/git-sdk.module.ts +0 -8
- package/src/shared/llm-proxy/llm-proxy.module.ts +0 -140
- package/src/shared/output/output.module.ts +0 -9
- package/src/shared/storage/storage.module.ts +0 -150
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { Global, Module } from "@nestjs/common";
|
|
2
|
-
import { ConfigReaderService } from "./config-reader.service";
|
|
3
|
-
import { SchemaGeneratorService } from "./schema-generator.service";
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* 配置读取模块
|
|
7
|
-
* 提供插件配置读取服务和 Schema 生成服务
|
|
8
|
-
*
|
|
9
|
-
* 插件的 defaultConfig 通过 getMetadata() 返回,在插件加载时自动注册
|
|
10
|
-
*/
|
|
11
|
-
@Global()
|
|
12
|
-
@Module({
|
|
13
|
-
providers: [ConfigReaderService, SchemaGeneratorService],
|
|
14
|
-
exports: [ConfigReaderService, SchemaGeneratorService],
|
|
15
|
-
})
|
|
16
|
-
export class ConfigReaderModule {}
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
import { DynamicModule, Module } from "@nestjs/common";
|
|
2
|
-
import { ConfigModule, ConfigService } from "@nestjs/config";
|
|
3
|
-
import { EventEmitterModule } from "@nestjs/event-emitter";
|
|
4
|
-
import { FeishuSdkService } from "./feishu-sdk.service";
|
|
5
|
-
import { FeishuCardService } from "./fieshu-card.service";
|
|
6
|
-
import { FeishuModuleOptions, FeishuModuleAsyncOptions, FEISHU_MODULE_OPTIONS } from "./types";
|
|
7
|
-
import { feishuConfig, FeishuConfig } from "../../config";
|
|
8
|
-
|
|
9
|
-
@Module({})
|
|
10
|
-
export class FeishuSdkModule {
|
|
11
|
-
/**
|
|
12
|
-
* 同步注册模块
|
|
13
|
-
*/
|
|
14
|
-
static forRoot(options: FeishuModuleOptions): DynamicModule {
|
|
15
|
-
return {
|
|
16
|
-
module: FeishuSdkModule,
|
|
17
|
-
imports: [EventEmitterModule.forRoot()],
|
|
18
|
-
providers: [
|
|
19
|
-
{
|
|
20
|
-
provide: FEISHU_MODULE_OPTIONS,
|
|
21
|
-
useValue: options,
|
|
22
|
-
},
|
|
23
|
-
FeishuSdkService,
|
|
24
|
-
FeishuCardService,
|
|
25
|
-
],
|
|
26
|
-
exports: [FeishuSdkService, FeishuCardService],
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* 异步注册模块 - 支持从环境变量等动态获取配置
|
|
32
|
-
*/
|
|
33
|
-
static forRootAsync(options: FeishuModuleAsyncOptions): DynamicModule {
|
|
34
|
-
return {
|
|
35
|
-
module: FeishuSdkModule,
|
|
36
|
-
imports: [EventEmitterModule.forRoot()],
|
|
37
|
-
providers: [
|
|
38
|
-
{
|
|
39
|
-
provide: FEISHU_MODULE_OPTIONS,
|
|
40
|
-
useFactory: options.useFactory,
|
|
41
|
-
inject: options.inject || [],
|
|
42
|
-
},
|
|
43
|
-
FeishuSdkService,
|
|
44
|
-
FeishuCardService,
|
|
45
|
-
],
|
|
46
|
-
exports: [FeishuSdkService, FeishuCardService],
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* 使用 ConfigService 注册模块
|
|
52
|
-
*/
|
|
53
|
-
static forFeature(): DynamicModule {
|
|
54
|
-
return {
|
|
55
|
-
module: FeishuSdkModule,
|
|
56
|
-
imports: [ConfigModule.forFeature(feishuConfig), EventEmitterModule.forRoot()],
|
|
57
|
-
providers: [
|
|
58
|
-
{
|
|
59
|
-
provide: FEISHU_MODULE_OPTIONS,
|
|
60
|
-
useFactory: (configService: ConfigService): FeishuModuleOptions => {
|
|
61
|
-
const config = configService.get<FeishuConfig>("feishu");
|
|
62
|
-
return {
|
|
63
|
-
appId: config?.appId || "",
|
|
64
|
-
appSecret: config?.appSecret || "",
|
|
65
|
-
appType: config?.appType,
|
|
66
|
-
domain: config?.domain,
|
|
67
|
-
};
|
|
68
|
-
},
|
|
69
|
-
inject: [ConfigService],
|
|
70
|
-
},
|
|
71
|
-
FeishuSdkService,
|
|
72
|
-
FeishuCardService,
|
|
73
|
-
],
|
|
74
|
-
exports: [FeishuSdkService, FeishuCardService],
|
|
75
|
-
};
|
|
76
|
-
}
|
|
77
|
-
}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import { DynamicModule, Module } from "@nestjs/common";
|
|
2
|
-
import { ConfigModule, ConfigService } from "@nestjs/config";
|
|
3
|
-
import { GitProviderService } from "./git-provider.service";
|
|
4
|
-
import {
|
|
5
|
-
type GitProviderModuleOptions,
|
|
6
|
-
type GitProviderModuleAsyncOptions,
|
|
7
|
-
GIT_PROVIDER_MODULE_OPTIONS,
|
|
8
|
-
} from "./types";
|
|
9
|
-
import { gitProviderConfig, type GitProviderConfig } from "../../config/git-provider.config";
|
|
10
|
-
|
|
11
|
-
@Module({})
|
|
12
|
-
export class GitProviderModule {
|
|
13
|
-
/**
|
|
14
|
-
* 同步注册模块
|
|
15
|
-
*/
|
|
16
|
-
static forRoot(options: GitProviderModuleOptions): DynamicModule {
|
|
17
|
-
return {
|
|
18
|
-
module: GitProviderModule,
|
|
19
|
-
providers: [
|
|
20
|
-
{
|
|
21
|
-
provide: GIT_PROVIDER_MODULE_OPTIONS,
|
|
22
|
-
useValue: options,
|
|
23
|
-
},
|
|
24
|
-
GitProviderService,
|
|
25
|
-
],
|
|
26
|
-
exports: [GitProviderService],
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* 异步注册模块 - 支持从环境变量等动态获取配置
|
|
32
|
-
*/
|
|
33
|
-
static forRootAsync(options: GitProviderModuleAsyncOptions): DynamicModule {
|
|
34
|
-
return {
|
|
35
|
-
module: GitProviderModule,
|
|
36
|
-
providers: [
|
|
37
|
-
{
|
|
38
|
-
provide: GIT_PROVIDER_MODULE_OPTIONS,
|
|
39
|
-
useFactory: options.useFactory,
|
|
40
|
-
inject: options.inject || [],
|
|
41
|
-
},
|
|
42
|
-
GitProviderService,
|
|
43
|
-
],
|
|
44
|
-
exports: [GitProviderService],
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* 使用 ConfigService 注册模块
|
|
50
|
-
*/
|
|
51
|
-
static forFeature(): DynamicModule {
|
|
52
|
-
return {
|
|
53
|
-
module: GitProviderModule,
|
|
54
|
-
imports: [ConfigModule.forFeature(gitProviderConfig)],
|
|
55
|
-
providers: [
|
|
56
|
-
{
|
|
57
|
-
provide: GIT_PROVIDER_MODULE_OPTIONS,
|
|
58
|
-
useFactory: (configService: ConfigService): GitProviderModuleOptions => {
|
|
59
|
-
const config = configService.get<GitProviderConfig>("gitProvider");
|
|
60
|
-
return {
|
|
61
|
-
provider: config?.provider || "gitea",
|
|
62
|
-
baseUrl: config?.serverUrl || "",
|
|
63
|
-
token: config?.token || "",
|
|
64
|
-
};
|
|
65
|
-
},
|
|
66
|
-
inject: [ConfigService],
|
|
67
|
-
},
|
|
68
|
-
GitProviderService,
|
|
69
|
-
],
|
|
70
|
-
exports: [GitProviderService],
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
}
|
|
@@ -1,140 +0,0 @@
|
|
|
1
|
-
import { Module, DynamicModule, Provider, Type } from "@nestjs/common";
|
|
2
|
-
import { LlmProxyService } from "./llm-proxy.service";
|
|
3
|
-
import { ClaudeCodeAdapter } from "./adapters/claude-code.adapter";
|
|
4
|
-
import { OpenAIAdapter } from "./adapters/openai.adapter";
|
|
5
|
-
import { ClaudeSetupModule } from "../claude-setup";
|
|
6
|
-
import type { LlmProxyConfig } from "./interfaces";
|
|
7
|
-
import { OpenCodeAdapter } from "./adapters";
|
|
8
|
-
|
|
9
|
-
export interface LlmProxyModuleOptions extends LlmProxyConfig {}
|
|
10
|
-
|
|
11
|
-
export interface LlmProxyModuleAsyncOptions {
|
|
12
|
-
imports?: any[];
|
|
13
|
-
useFactory?: (...args: any[]) => Promise<LlmProxyConfig> | LlmProxyConfig;
|
|
14
|
-
inject?: any[];
|
|
15
|
-
useClass?: Type<LlmProxyOptionsFactory>;
|
|
16
|
-
useExisting?: Type<LlmProxyOptionsFactory>;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export interface LlmProxyOptionsFactory {
|
|
20
|
-
createLlmProxyOptions(): Promise<LlmProxyConfig> | LlmProxyConfig;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
@Module({})
|
|
24
|
-
export class LlmProxyModule {
|
|
25
|
-
static forRoot(options: LlmProxyModuleOptions): DynamicModule {
|
|
26
|
-
const resolvedOptions = this.resolveOpenCodeConfig(options);
|
|
27
|
-
return {
|
|
28
|
-
module: LlmProxyModule,
|
|
29
|
-
imports: [ClaudeSetupModule],
|
|
30
|
-
providers: [
|
|
31
|
-
{
|
|
32
|
-
provide: "LLM_PROXY_CONFIG",
|
|
33
|
-
useValue: resolvedOptions,
|
|
34
|
-
},
|
|
35
|
-
ClaudeCodeAdapter,
|
|
36
|
-
OpenAIAdapter,
|
|
37
|
-
OpenCodeAdapter,
|
|
38
|
-
LlmProxyService,
|
|
39
|
-
],
|
|
40
|
-
exports: [LlmProxyService, ClaudeCodeAdapter, OpenCodeAdapter, OpenAIAdapter],
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
static forRootAsync(options: LlmProxyModuleAsyncOptions): DynamicModule {
|
|
45
|
-
const asyncProviders = this.createAsyncProviders(options);
|
|
46
|
-
|
|
47
|
-
return {
|
|
48
|
-
module: LlmProxyModule,
|
|
49
|
-
imports: [...(options.imports || []), ClaudeSetupModule],
|
|
50
|
-
providers: [
|
|
51
|
-
...asyncProviders,
|
|
52
|
-
ClaudeCodeAdapter,
|
|
53
|
-
OpenAIAdapter,
|
|
54
|
-
OpenCodeAdapter,
|
|
55
|
-
LlmProxyService,
|
|
56
|
-
],
|
|
57
|
-
exports: [LlmProxyService, ClaudeCodeAdapter, OpenCodeAdapter, OpenAIAdapter],
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
private static createAsyncProviders(options: LlmProxyModuleAsyncOptions): Provider[] {
|
|
62
|
-
if (options.useFactory) {
|
|
63
|
-
const originalFactory = options.useFactory;
|
|
64
|
-
return [
|
|
65
|
-
{
|
|
66
|
-
provide: "LLM_PROXY_CONFIG",
|
|
67
|
-
useFactory: async (...args: any[]) => {
|
|
68
|
-
const config = await originalFactory(...args);
|
|
69
|
-
return this.resolveOpenCodeConfig(config);
|
|
70
|
-
},
|
|
71
|
-
inject: options.inject || [],
|
|
72
|
-
},
|
|
73
|
-
];
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
if (options.useClass) {
|
|
77
|
-
return [
|
|
78
|
-
{
|
|
79
|
-
provide: "LLM_PROXY_CONFIG",
|
|
80
|
-
useFactory: async (optionsFactory: LlmProxyOptionsFactory) =>
|
|
81
|
-
optionsFactory.createLlmProxyOptions(),
|
|
82
|
-
inject: [options.useClass],
|
|
83
|
-
},
|
|
84
|
-
{
|
|
85
|
-
provide: options.useClass,
|
|
86
|
-
useClass: options.useClass,
|
|
87
|
-
},
|
|
88
|
-
];
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
if (options.useExisting) {
|
|
92
|
-
return [
|
|
93
|
-
{
|
|
94
|
-
provide: "LLM_PROXY_CONFIG",
|
|
95
|
-
useFactory: async (optionsFactory: LlmProxyOptionsFactory) =>
|
|
96
|
-
optionsFactory.createLlmProxyOptions(),
|
|
97
|
-
inject: [options.useExisting],
|
|
98
|
-
},
|
|
99
|
-
];
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
return [];
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
private static resolveOpenCodeConfig(config: LlmProxyConfig): LlmProxyConfig {
|
|
106
|
-
if (!config.openCode) {
|
|
107
|
-
return config;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
const providerID = config.openCode.providerID || "openai";
|
|
111
|
-
let apiKey = config.openCode.apiKey;
|
|
112
|
-
let baseUrl = config.openCode.baseUrl;
|
|
113
|
-
let model = config.openCode.model;
|
|
114
|
-
|
|
115
|
-
// 根据 providerID 从对应的 adapter 配置中读取缺失的值
|
|
116
|
-
if (providerID === "openai" && config.openai) {
|
|
117
|
-
if (!apiKey) apiKey = config.openai.apiKey;
|
|
118
|
-
if (!baseUrl) baseUrl = config.openai.baseUrl;
|
|
119
|
-
if (!model) model = config.openai.model;
|
|
120
|
-
} else if (providerID === "anthropic" && config.claudeCode) {
|
|
121
|
-
if (!apiKey) apiKey = config.claudeCode.authToken;
|
|
122
|
-
if (!baseUrl) baseUrl = config.claudeCode.baseUrl;
|
|
123
|
-
if (!model) model = config.claudeCode.model;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
// 如果有任何值需要更新
|
|
127
|
-
if (
|
|
128
|
-
apiKey !== config.openCode.apiKey ||
|
|
129
|
-
baseUrl !== config.openCode.baseUrl ||
|
|
130
|
-
model !== config.openCode.model
|
|
131
|
-
) {
|
|
132
|
-
return {
|
|
133
|
-
...config,
|
|
134
|
-
openCode: { ...config.openCode, apiKey, baseUrl, model },
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
return config;
|
|
139
|
-
}
|
|
140
|
-
}
|
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
import { DynamicModule, Module } from "@nestjs/common";
|
|
2
|
-
import { ConfigModule, ConfigService } from "@nestjs/config";
|
|
3
|
-
import { StorageService } from "./storage.service";
|
|
4
|
-
import { MemoryAdapter } from "./adapters/memory.adapter";
|
|
5
|
-
import { FileAdapter } from "./adapters/file.adapter";
|
|
6
|
-
import { StorageAdapter } from "./adapters/storage-adapter.interface";
|
|
7
|
-
import {
|
|
8
|
-
type StorageModuleOptions,
|
|
9
|
-
type StorageModuleAsyncOptions,
|
|
10
|
-
STORAGE_MODULE_OPTIONS,
|
|
11
|
-
STORAGE_ADAPTER,
|
|
12
|
-
} from "./types";
|
|
13
|
-
import { storageConfig, StorageConfig } from "../../config";
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* 创建适配器实例
|
|
17
|
-
*/
|
|
18
|
-
function createAdapter(options: StorageModuleOptions): StorageAdapter {
|
|
19
|
-
switch (options.adapter) {
|
|
20
|
-
case "file":
|
|
21
|
-
if (!options.filePath) {
|
|
22
|
-
throw new Error("filePath is required for file adapter");
|
|
23
|
-
}
|
|
24
|
-
return new FileAdapter(options.filePath);
|
|
25
|
-
case "memory":
|
|
26
|
-
default:
|
|
27
|
-
return new MemoryAdapter();
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
@Module({})
|
|
32
|
-
export class StorageModule {
|
|
33
|
-
/**
|
|
34
|
-
* 同步注册模块
|
|
35
|
-
*
|
|
36
|
-
* @example
|
|
37
|
-
* ```ts
|
|
38
|
-
* StorageModule.forRoot({
|
|
39
|
-
* adapter: 'memory',
|
|
40
|
-
* defaultTtl: 3600000, // 1 hour
|
|
41
|
-
* })
|
|
42
|
-
* ```
|
|
43
|
-
*
|
|
44
|
-
* @example
|
|
45
|
-
* ```ts
|
|
46
|
-
* StorageModule.forRoot({
|
|
47
|
-
* adapter: 'file',
|
|
48
|
-
* filePath: './data/storage.json',
|
|
49
|
-
* })
|
|
50
|
-
* ```
|
|
51
|
-
*/
|
|
52
|
-
static forRoot(options: StorageModuleOptions): DynamicModule {
|
|
53
|
-
return {
|
|
54
|
-
module: StorageModule,
|
|
55
|
-
providers: [
|
|
56
|
-
{
|
|
57
|
-
provide: STORAGE_MODULE_OPTIONS,
|
|
58
|
-
useValue: options,
|
|
59
|
-
},
|
|
60
|
-
{
|
|
61
|
-
provide: STORAGE_ADAPTER,
|
|
62
|
-
useValue: createAdapter(options),
|
|
63
|
-
},
|
|
64
|
-
StorageService,
|
|
65
|
-
],
|
|
66
|
-
exports: [StorageService],
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* 异步注册模块
|
|
72
|
-
*
|
|
73
|
-
* @example
|
|
74
|
-
* ```ts
|
|
75
|
-
* StorageModule.forRootAsync({
|
|
76
|
-
* useFactory: (configService: ConfigService) => ({
|
|
77
|
-
* adapter: configService.get('STORAGE_ADAPTER') || 'memory',
|
|
78
|
-
* filePath: configService.get('STORAGE_FILE_PATH'),
|
|
79
|
-
* }),
|
|
80
|
-
* inject: [ConfigService],
|
|
81
|
-
* })
|
|
82
|
-
* ```
|
|
83
|
-
*/
|
|
84
|
-
static forRootAsync(options: StorageModuleAsyncOptions): DynamicModule {
|
|
85
|
-
return {
|
|
86
|
-
module: StorageModule,
|
|
87
|
-
providers: [
|
|
88
|
-
{
|
|
89
|
-
provide: STORAGE_MODULE_OPTIONS,
|
|
90
|
-
useFactory: options.useFactory,
|
|
91
|
-
inject: options.inject || [],
|
|
92
|
-
},
|
|
93
|
-
{
|
|
94
|
-
provide: STORAGE_ADAPTER,
|
|
95
|
-
useFactory: (opts: StorageModuleOptions) => createAdapter(opts),
|
|
96
|
-
inject: [STORAGE_MODULE_OPTIONS],
|
|
97
|
-
},
|
|
98
|
-
StorageService,
|
|
99
|
-
],
|
|
100
|
-
exports: [StorageService],
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* 使用 ConfigService 注册模块
|
|
106
|
-
*
|
|
107
|
-
* 环境变量:
|
|
108
|
-
* - STORAGE_ADAPTER: 'memory' | 'file'
|
|
109
|
-
* - STORAGE_FILE_PATH: 文件存储路径
|
|
110
|
-
* - STORAGE_DEFAULT_TTL: 默认过期时间(毫秒)
|
|
111
|
-
* - STORAGE_MAX_KEYS: 最大 key 数量
|
|
112
|
-
*
|
|
113
|
-
* @example
|
|
114
|
-
* ```ts
|
|
115
|
-
* @Module({
|
|
116
|
-
* imports: [StorageModule.forFeature()],
|
|
117
|
-
* })
|
|
118
|
-
* export class AppModule {}
|
|
119
|
-
* ```
|
|
120
|
-
*/
|
|
121
|
-
static forFeature(): DynamicModule {
|
|
122
|
-
return {
|
|
123
|
-
global: true,
|
|
124
|
-
module: StorageModule,
|
|
125
|
-
imports: [ConfigModule.forFeature(storageConfig)],
|
|
126
|
-
providers: [
|
|
127
|
-
{
|
|
128
|
-
provide: STORAGE_MODULE_OPTIONS,
|
|
129
|
-
useFactory: (configService: ConfigService): StorageModuleOptions => {
|
|
130
|
-
const config = configService.get<StorageConfig>("storage");
|
|
131
|
-
return {
|
|
132
|
-
adapter: config?.adapter || "memory",
|
|
133
|
-
filePath: config?.filePath,
|
|
134
|
-
defaultTtl: config?.defaultTtl,
|
|
135
|
-
maxKeys: config?.maxKeys,
|
|
136
|
-
};
|
|
137
|
-
},
|
|
138
|
-
inject: [ConfigService],
|
|
139
|
-
},
|
|
140
|
-
{
|
|
141
|
-
provide: STORAGE_ADAPTER,
|
|
142
|
-
useFactory: (opts: StorageModuleOptions) => createAdapter(opts),
|
|
143
|
-
inject: [STORAGE_MODULE_OPTIONS],
|
|
144
|
-
},
|
|
145
|
-
StorageService,
|
|
146
|
-
],
|
|
147
|
-
exports: [StorageService],
|
|
148
|
-
};
|
|
149
|
-
}
|
|
150
|
-
}
|