UNPKG

@mitre-attack/attack-data-model

Version:

A TypeScript API for the MITRE ATT&CK data model

95 lines (92 loc) 3.46 kB
import { stixSpecVersionSchema } from "./chunk-36L755UT.js"; import { nameSchema, objectMarkingRefsSchema } from "./chunk-Z7F5EWOT.js"; import { externalReferencesSchema, granularMarkingSchema, stixCreatedByRefSchema } from "./chunk-QY7EQ3UO.js"; import { createStixIdValidator } from "./chunk-OM2DJ5DL.js"; import { createStixTypeValidator } from "./chunk-5JU73PGM.js"; // src/schemas/common/extensions.ts import { z } from "zod/v4"; var extensionTypeSchema = z.enum([ "new-sdo", "new-sco", "new-sro", "property-extension", "toplevel-property-extension" ]); var extensionSchema = z.object({ extension_type: extensionTypeSchema // Additional properties depend on extension type - using record for flexibility }).catchall(z.unknown()); var extensionsSchema = z.record(z.string(), z.union([extensionSchema, z.record(z.string(), z.unknown())])).meta({ description: "Specifies any extensions of the object, as a dictionary where keys are extension definition UUIDs" }); var extensionPropertyNameSchema = z.string().min(3, "Extension property names must be at least 3 characters").max(250, "Extension property names must be no longer than 250 characters").regex( /^[a-z0-9_]+$/, "Extension property names must only contain lowercase letters, digits, and underscores" ); var extensionObjectTypeSchema = z.string().min(3, "Extension object type must be at least 3 characters").max(250, "Extension object type must be no longer than 250 characters").regex( /^[a-z0-9-]+$/, "Extension object type must only contain lowercase letters, digits, and hyphens" ).refine( (value) => !value.includes("--"), "Extension object type must not contain consecutive hyphens" ); var extensionDefinitionSchema = z.object({ // Required common properties id: createStixIdValidator("extension-definition"), type: createStixTypeValidator("extension-definition"), spec_version: stixSpecVersionSchema, created: z.iso.datetime(), modified: z.iso.datetime(), created_by_ref: stixCreatedByRefSchema, // Optional common properties revoked: z.boolean().optional(), labels: z.array(z.string()).optional(), external_references: externalReferencesSchema.optional(), object_marking_refs: objectMarkingRefsSchema.optional(), granular_markings: z.array(granularMarkingSchema).optional(), // Extension definition specific properties name: nameSchema, description: z.string({ error: "Description must be a string" }).optional(), schema: z.string({ error: "Schema must be a string" }), version: z.string({ error: "Version must be a string" }).regex(/^\d+\.\d+\.\d+$/, "Version must follow semantic versioning (MAJOR.MINOR.PATCH)"), extension_types: z.array(extensionTypeSchema).min(1, "At least one extension type is required"), extension_properties: z.array(extensionPropertyNameSchema).optional() }).strict().refine( (data) => { if (data.extension_types.includes("toplevel-property-extension")) { return data.extension_properties && data.extension_properties.length > 0; } return true; }, { message: "extension_properties must be provided when extension_types includes toplevel-property-extension" } ).meta({ description: "Extension Definition object allows producers to extend existing STIX objects or create new STIX objects" }); export { extensionTypeSchema, extensionSchema, extensionsSchema, extensionObjectTypeSchema, extensionDefinitionSchema };