Skip to main content
Glama
addDefaultPropsAndSockets.ts3.42 kB
import _ from "lodash"; import { createObjectProp, createScalarProp, ExpandedPropSpec, } from "../../../spec/props.ts"; import { ExpandedPkgSpec } from "../../../spec/pkgs.ts"; export interface PropUsageMap { createOnly: string[]; updatable: string[]; secrets: { secretKey: string; propPath: string[]; }[]; } export function addDefaultPropsAndSockets( specs: ExpandedPkgSpec[], ): ExpandedPkgSpec[] { const newSpecs = [] as ExpandedPkgSpec[]; for (const spec of specs) { const [schema] = spec.schemas; const [schemaVariant] = schema.variants; const { domain } = schemaVariant; // Extra prop const extraProp = createObjectProp( "extra", domain.metadata.propPath, undefined, true, ); // Create PropUsageMap { const propUsageMapProp = createScalarProp( "PropUsageMap", "string", extraProp.metadata.propPath, false, ); const propUsageMap: PropUsageMap = { createOnly: [], updatable: [], secrets: [], }; const queue: ExpandedPropSpec[] = _.cloneDeep(domain.entries); while (queue.length > 0) { const prop = queue.pop(); if (!prop) break; if (prop.metadata.createOnly) { propUsageMap.createOnly.push(prop.name); } else if (!prop.metadata.readOnly) { propUsageMap.updatable.push(prop.name); } if (prop.kind === "object") { prop.entries.forEach((p) => queue.unshift(p)); } } propUsageMapProp.data.defaultValue = JSON.stringify(propUsageMap); propUsageMapProp.data.hidden = true; extraProp.entries.push(propUsageMapProp); } // Create Region prop { const regionProp = createScalarProp( "Region", "string", extraProp.metadata.propPath, true, ); extraProp.entries.push(regionProp); } // Create AwsResourceType { const typeProp = createScalarProp( "AwsResourceType", "string", extraProp.metadata.propPath, false, ); typeProp.data.defaultValue = schema.name; typeProp.data.hidden = true; extraProp.entries.push(typeProp); } // Create Permissions Map { const permissionsMapProp = createScalarProp( "AwsPermissionsMap", "string", extraProp.metadata.propPath, false, ); permissionsMapProp.data.defaultValue = JSON.stringify( schemaVariant.superSchema.handlers, ); permissionsMapProp.data.hidden = true; extraProp.entries.push(permissionsMapProp); } // Create Credential prop under root/secrets { const credProp = createScalarProp( "AWS Credential", "string", extraProp.metadata.propPath, true, ); credProp.data.widgetKind = "Secret"; credProp.data.widgetOptions = [ { label: "secretKind", value: "AWS Credential", }, ]; if (schemaVariant.secrets.kind !== "object") { console.log( `Could not generate default props and sockets for ${spec.name}: secrets is not object`, ); continue; } schemaVariant.secrets.entries.push(credProp); } // Finalize domain.entries.push(extraProp); newSpecs.push(spec); } return newSpecs; }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/systeminit/si'

If you have feedback or need assistance with the MCP directory API, please join our Discord server