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