@mitre-attack/attack-data-model
Version:
A TypeScript API for the MITRE ATT&CK data model
48 lines (45 loc) • 1.84 kB
JavaScript
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
};