UNPKG

@mitre-attack/attack-data-model

Version:

A TypeScript API for the MITRE ATT&CK data model

48 lines (45 loc) 1.84 kB
import { attackIdPatterns, getAttackIdExample, stixTypeToAttackIdMapping } from "./chunk-7KWVJAJG.js"; import { nonEmptyRequiredString } from "./chunk-GS2OERHB.js"; // src/schemas/common/property-schemas/stix-external-references.ts import z from "zod"; var externalReferenceSchema = z.object({ source_name: nonEmptyRequiredString, description: nonEmptyRequiredString.optional(), url: z.url({ error: (issue) => issue.input === null ? "URL cannot be null" : "Invalid URL format. Please provide a valid URL" }).optional(), external_id: nonEmptyRequiredString.optional() }); var externalReferencesSchema = z.array(externalReferenceSchema).min(1).meta({ description: "A list of external references which refers to non-STIX information" }); var createAttackExternalReferencesSchema = (stixType) => { return z.array(externalReferenceSchema).min(1, "At least one external reference is required").refine((refs) => !!refs[0]?.external_id, { message: "ATT&CK ID must be defined in the first external_references entry.", path: [0, "external_id"] }).refine( (refs) => { if (!refs[0]?.external_id) return true; const attackIdType = stixTypeToAttackIdMapping[stixType]; if (attackIdType === "technique") { return attackIdPatterns["technique"].test(refs[0].external_id) || attackIdPatterns["subtechnique"].test(refs[0].external_id); } return attackIdPatterns[attackIdType].test(refs[0].external_id); }, { message: `The first external_reference must match the ATT&CK ID format ${getAttackIdExample(stixType)}.`, path: [0, "external_id"] } ).meta({ description: "A list of external references with the first containing a valid ATT&CK ID" }); }; export { externalReferenceSchema, externalReferencesSchema, createAttackExternalReferencesSchema };