@ docupace/ ihub- config
重新使用 GraphQL 配置扩展并提取独立服务器 Docupace GraphQL 服务器 .
本地运行
pnpm install
要将软件包作为独立的 GraphQL 服务器运行, 请复制
.env.example 改为 .env,填入所需的值,然后启动 dev
服务器 :
cp .env.example .env
pnpm start:dev
独立服务器监听 http://localhost:4000/api/graphql。 。 。 .
在另一服务器中用作扩展名
import { getConfigExtension } from '@docupace/ihub-config';
然后将返回的扩展添加到主机服务器的扩展数组 :
const configExtension = await getConfigExtension();
const serverInfo: ServerConfig = {
instanceConfig: instanceConfig,
extensions: [docupaceExtension, configExtension],
port: 4000,
createContext,
};
以指定域的提供者,解析器等扩展配置扩展 .
import { getConfigExtension } from '@docupace/ihub-config';
import {
DashboardPageConfigProvider,
TablePageConfigProvider,
AnyPageConfigProvider,
DetailsPageConfigProvider,
} from './your-host-config-providers.js';
import { configResolvers } from './your-host-config-resolvers.js';
const APPLICATION_PREFERENCE_PREFIX = 'applicationPreference';
const applicationPreferenceResolver = async (keys, context) => {
const data = await loadApplicationPreferences(keys, context);
const result: Record<string, string | undefined> = {};
keys.forEach((key) => (result[key] = undefined));
data.records.forEach((record: { name: string; value: string }) => {
result[record.name] = record.value;
});
return result;
};
const configExtension = await getConfigExtension({
configInjectorResolvers: {
[APPLICATION_PREFERENCE_PREFIX]: applicationPreferenceResolver,
},
providers: {
DashboardPage: DashboardPageConfigProvider,
TablePage: TablePageConfigProvider,
AnyPage: AnyPageConfigProvider,
DetailsPage: DetailsPageConfigProvider,
},
resolvers: configResolvers,
});
configInjectorResolvers
使用 configInjectorResolvers 以解析嵌入到配置中的模板表达式
值,例如:
$${applicationPreference:timezone}
每个键入 configInjectorResolvers 是模板前缀,每个值都是
使用此形状的async 解析器函数 :
type ResolverFunction = (
keys: string[],
context: any,
) => Promise<Record<string, any>>;
当配置处理遇到时 $${prefix:key},它寻找解决者
那个 prefix,批次请求的密钥,并用
已解析值。 这是连接特定主机数据源的正确地点
例如应用程序偏好、租户设置或用户范围值.
providers
使用 providers 来注册配置处理器 __typename。一个提供者运行
已装入嵌入的配置值和模板表达式之后
解析后,可以重塑或丰富最终的配置对象
已经返回.
providers: {
DashboardPage: DashboardPageConfigProvider,
TablePage: TablePageConfigProvider,
AnyPage: AnyPageConfigProvider,
DetailsPage: DetailsPageConfigProvider,
}
每个提供者必须是具有 processConfig 方法 :
interface ConfigProvider {
processConfig(config: any, configService: ConfigService, context: any): any;
}
这对于特定页面的后处理有用,例如使碎片正常化, 重写引用, 或为特定页面类型生成额外字段 . 内建供应商被保留,主机供应商被合并到顶上.
resolvers
使用 resolvers 以扩展配置扩展所暴露的 GraphQL API .
解析器作为工厂提供,以便接收初始化的
configService 实例:
const configResolvers = {
query: ({ configService }) => ({
pages: () => ({
myCustomPage: async (obj: { path: string }, context: any) => {
return await configService.getDirectConfig(obj.path, context);
},
}),
}),
mutation: ({ configService }) => ({
pages: () => ({
refreshCustomConfig: async () => {
await configService.init();
return true;
},
}),
}),
};
主机查询和突变解析器被内置配置所深置 解析器, 这样您就可以添加新字段而不重新声明整个解析器 树。 如果在两地都存在同一个字段,则主机解析器获胜.
如果您想要通过配置存储程序而不是通过
环境变量, getConfigExtension 还接受 configStores (通常只用于测试).
环境变量
配置存储从环境变量中发现, 以前缀分类
作为 STANDARD 或者说 SITE数字 :
<PREFIX>_CONFIG_LOCAL_PATH<PREFIX>_CONFIG_REMOTE_PATH<PREFIX>_CONFIG_REMOTE_BRANCH<PREFIX>_CONFIG_PRIORITY<PREFIX>_CONFIG_NAME
<PREFIX>_CONFIG_PRIORITY 每个配置的商店都需要.
CONFIG_LOCAL_PATH_ROOT 当
<PREFIX>_CONFIG_LOCAL_PATH 被省略,但商店仍然需要足够的
要发现的配置 .