export const PLUGIN_GUID = 'asc.{2D6D6CB6-F6FC-45B7-8EC7-0CC1940F1A6F}';
|
export const PLUGIN_VERSION = '0.1.0';
|
export const PLUGIN_BIZ_MODULE = 'eln.template';
|
export const PLUGIN_BIZ_SCENE = 'eln.template.annotate';
|
|
export interface PluginContext {
|
apiBaseUrl: string;
|
bizDataId: string;
|
bizModule: typeof PLUGIN_BIZ_MODULE;
|
bizScene: typeof PLUGIN_BIZ_SCENE;
|
canAnnotate: boolean;
|
documentId: string;
|
pluginVersion: typeof PLUGIN_VERSION;
|
}
|
|
function isRecord(value: unknown): value is Record<string, unknown> {
|
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
}
|
|
function isNonEmptyString(value: unknown): value is string {
|
return typeof value === 'string' && value.trim().length > 0;
|
}
|
|
function isHttpUrl(value: unknown): value is string {
|
if (!isNonEmptyString(value)) return false;
|
try {
|
const parsed = new URL(value);
|
return ['http:', 'https:'].includes(parsed.protocol) && !parsed.username && !parsed.password && !parsed.search && !parsed.hash;
|
} catch {
|
return false;
|
}
|
}
|
|
export function parsePluginContext(options: unknown): PluginContext {
|
if (!isRecord(options)) {
|
throw new Error('插件运行上下文无效');
|
}
|
|
const value = options;
|
if (
|
!isNonEmptyString(value.documentId) ||
|
!isHttpUrl(value.apiBaseUrl) ||
|
!isNonEmptyString(value.bizDataId) ||
|
value.bizModule !== PLUGIN_BIZ_MODULE ||
|
value.bizScene !== PLUGIN_BIZ_SCENE ||
|
value.pluginVersion !== PLUGIN_VERSION ||
|
typeof value.canAnnotate !== 'boolean'
|
) {
|
throw new Error('插件运行上下文无效');
|
}
|
|
return {
|
apiBaseUrl: value.apiBaseUrl.replace(/\/+$/u, ''),
|
documentId: value.documentId,
|
bizDataId: value.bizDataId,
|
bizModule: value.bizModule,
|
bizScene: value.bizScene,
|
pluginVersion: value.pluginVersion,
|
canAnnotate: value.canAnnotate,
|
};
|
}
|