43 lines
1.3 KiB
TypeScript
43 lines
1.3 KiB
TypeScript
export interface Tool {
|
|
name: string;
|
|
type?: 'software' | 'method' | 'concept';
|
|
projectUrl?: string | null;
|
|
license?: string;
|
|
knowledgebase?: boolean;
|
|
domains?: string[];
|
|
phases?: string[];
|
|
platforms?: string[];
|
|
skillLevel?: string;
|
|
description?: string;
|
|
tags?: string[];
|
|
related_concepts?: string[];
|
|
}
|
|
|
|
export function createToolSlug(toolName: string): string {
|
|
if (!toolName || typeof toolName !== 'string') {
|
|
console.warn('[toolHelpers] Invalid toolName provided to createToolSlug:', toolName);
|
|
return '';
|
|
}
|
|
|
|
return toolName.toLowerCase()
|
|
.replace(/[^a-z0-9\s-]/g, '') // Remove special characters
|
|
.replace(/\s+/g, '-') // Replace spaces with hyphens
|
|
.replace(/-+/g, '-') // Remove duplicate hyphens
|
|
.replace(/^-|-$/g, ''); // Remove leading/trailing hyphens
|
|
}
|
|
|
|
export function findToolByIdentifier(tools: Tool[], identifier: string): Tool | undefined {
|
|
if (!identifier || !Array.isArray(tools)) return undefined;
|
|
|
|
return tools.find(tool =>
|
|
tool.name === identifier ||
|
|
createToolSlug(tool.name) === identifier.toLowerCase()
|
|
);
|
|
}
|
|
|
|
export function isToolHosted(tool: Tool): boolean {
|
|
return tool.projectUrl !== undefined &&
|
|
tool.projectUrl !== null &&
|
|
tool.projectUrl !== "" &&
|
|
tool.projectUrl.trim() !== "";
|
|
} |