Skip to main content
Glama
createCredential.ts4.21 kB
import _ from "lodash"; import { FuncSpec } from "../../../bindings/FuncSpec.ts"; import { ExpandedPkgSpec } from "../../../spec/pkgs.ts"; import { createDefaultPropFromJsonSchema, OnlyProperties, } from "../../../spec/props.ts"; import { createAuthenticationFuncSpec, createDefaultFuncSpec, createLeafFuncSpec, FuncSpecInfo, } from "../../../spec/funcs.ts"; import { makeModule } from "../../generic/index.ts"; import { HetznerSchema } from "../schema.ts"; import { hetznerProviderConfig } from "./../provider.ts"; import { CfProperty } from "../../types.ts"; export function generateCredentialModule(specs: ExpandedPkgSpec[]) { const credential: HetznerSchema = { typeName: "Hetzner::Credential::ApiToken", description: "A Hetzner cloud credential connection", requiredProperties: new Set([]), }; const properties: Record<string, CfProperty> = { HetznerApiToken: { type: "string" }, }; const onlyProperties: OnlyProperties = { createOnly: [], readOnly: [], writeOnly: [], primaryIdentifier: [], }; const credentialSpec = createCredentialSpec( credential, properties, onlyProperties, ); specs.push(credentialSpec); return specs; } function createCredentialSpec( credential: HetznerSchema, properties: Record<string, CfProperty>, onlyProperties: OnlyProperties, ): ExpandedPkgSpec { const spec = makeModule( credential, credential.description, onlyProperties, hetznerProviderConfig, properties, {}, ); const [schema] = spec.schemas; const [schemaVariant] = schema.variants; const funcs = spec.funcs; const leafFuncs = schemaVariant.leafFunctions; const authFuncs = schemaVariant.authFuncs; // Create the secret definition manually since it needs special handling const secretDefinition = createDefaultPropFromJsonSchema( "secret_definition", properties, credential, onlyProperties, hetznerProviderConfig.functions.createDocLink, hetznerProviderConfig, ); schemaVariant.secretDefinition = secretDefinition; if (schemaVariant.secretDefinition.kind === "object") { const apiTokenProp = schemaVariant.secretDefinition.entries.find( (p) => p.name === "HetznerApiToken", ); if (apiTokenProp) { apiTokenProp.data.widgetKind = "Password"; apiTokenProp.data.widgetOptions = [ { label: "secretKind", value: "HetznerApiToken", }, ]; } } for (const func of createQualificationFuncs(schemaVariant.domain.uniqueId!)) { funcs.push(func); leafFuncs.push( createLeafFuncSpec("qualification", func.uniqueId, ["domain", "code"]), ); } for (const func of createAuthenticationFuncs()) { funcs.push(func); authFuncs.push(createAuthenticationFuncSpec("authenticate", func.uniqueId)); } return spec; } export function createQualificationFuncs(domain_id: string): FuncSpec[] { return Object.entries(QUALIFICATION_FUNC_SPECS).map(([func, spec]) => createDefaultFuncSpec(func, spec, [ { name: "domain", kind: "object", elementKind: null, uniqueId: domain_id, deleted: false, }, ]) ); } export function createAuthenticationFuncs() { return Object.entries(AUTHENTICATION_FUNC_SPECS).map(([func, spec]) => createDefaultFuncSpec(func, spec, []) ); } export const AUTHENTICATION_FUNC_SPECS = { "Hetzner Authentication": { id: "d63c1360e3b82a50d2c391b613c930fd1323dd064f0340142d962c4712e930af", displayName: "Authentication with Hetzner Cloud", path: "./src/pipelines/hetzner/funcs/authentication/authenticateHetzner.ts", backendKind: "jsAuthentication", responseType: "void", }, } as const satisfies Record<string, FuncSpecInfo>; export const QUALIFICATION_FUNC_SPECS = { "Hetzner Authentication Qualification": { id: "f594dc6ebe7597027203a39f2bef0307f2c09d97067c1a4e1a4fb9f7f3b9d379", displayName: "Qualify Credentials with Hetzner Cloud", path: "./src/pipelines/hetzner/funcs/qualifications/credentialQualification.ts", backendKind: "jsAttribute", responseType: "qualification", }, } as const as Record<string, FuncSpecInfo>;

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