UNPKG

@viewdo/dxp-story-cli

Version:

DXP Story Management CLI

1,411 lines 50.5 kB
{ "$schema": "http://json-schema.org/draft-07/schema#", "defaultProperties": [], "definitions": { "ActionTemplate": { "defaultProperties": [], "properties": { "action": { "$ref": "#/definitions/StoryAction" }, "description": { "type": "string" }, "name": { "type": "string" }, "organization_requirements": { "$ref": "#/definitions/OrganizationConfiguration" }, "story_requirements": { "$ref": "#/definitions/StoryConfiguration" } }, "required": [ "action", "description", "name", "organization_requirements", "story_requirements" ], "type": "object" }, "ActionType": { "enum": [ "SendEmail", "SendSMS", "SendMMS", "SendNotification", "ConnectCall", "CreateExternalRecord", "WebHook", "SendToStory", "SyncToStory", "SetExperienceData", "SetExperienceCompleted", "SetExperienceConverted", "SetExperienceEpisode", "StopExperienceActions", "FireAction", "AddToSuppressionList", "RemoveFromSuppressionList", "RecordEvent", "RecordInboundLink", "SetExperienceChildEntity", "ExecuteFunction" ], "type": "string" }, "ConfigurationSource": { "defaultProperties": [], "properties": { "modelKey": { "description": "The owning model key.\n'iVX' if the sourceType is Global", "type": "string" }, "serviceKey": { "description": "The service key identifier.", "type": "string" }, "sourceType": { "$ref": "#/definitions/ConfigurationSourceType", "description": "Which model type owns the configuration.\nGlobal | Organization" } }, "required": [ "modelKey", "serviceKey", "sourceType" ], "type": "object" }, "ConfigurationSourceType": { "enum": [ "Global", "Organization" ], "type": "string" }, "ContentType": { "enum": [ "Text", "HTML", "LIQUID", "JS", "JSON", "XML", "CSS", "LESS", "CS", "CSV", "MD", "VTT" ], "type": "string" }, "DataPoint": { "defaultProperties": [], "properties": { "attributes": { "additionalProperties": { "type": "string" }, "defaultProperties": [], "description": "An whose name and values are assigned to the underlying HTML input.", "type": "object" }, "dataTree": { "anyOf": [ { "$ref": "#/definitions/DataTree", "description": "An object that describes a set of cascading options." }, { "type": "null" } ], "default": null }, "description": { "description": "The description to show along with the name when presenting this on a form.", "type": "string" }, "display": { "$ref": "#/definitions/DisplayType", "description": "The display-type when presenting this input on a page" }, "key": { "description": "The input key.", "pattern": "^[A-Za-z0-9-_]{1,30}$", "type": "string" }, "name": { "description": "The input name (shown on DXP forms)", "type": "string" }, "options": { "default": [], "description": "If the display-type is Options, these are the list of values the user will select from.", "items": { "$ref": "#/definitions/OptionItem" }, "type": "array" }, "required": { "default": false, "description": "Mark this true to force this value be set when creating an experience.", "type": "boolean" }, "tip": { "description": "The tooltip to display when presenting on a form.", "type": [ "string", "null" ] }, "value": { "description": "This is the default value if no other value is input.", "type": [ "string", "number", "boolean" ] } }, "required": [ "display", "key", "name", "required" ], "type": "object" }, "DataTree": { "defaultProperties": [], "properties": { "isStatic": { "default": false, "description": "Should all of the lists be visible? Defaults to hiding until needed.", "type": "boolean" }, "items": { "default": [], "description": "The data tree object of the cascading lists. We should have a tree of values as deep as the label-count.\nThis level is the options for the first label.", "items": { "$ref": "#/definitions/DataTreeItem" }, "type": "array" }, "labels": { "default": [], "description": "These are the top level labels. Three labels means, three select lists and the items below must also have three sets.", "items": { "type": "string" }, "type": "array" } }, "required": [ "isStatic", "items", "labels" ], "type": "object" }, "DataTreeItem": { "defaultProperties": [], "properties": { "items": { "items": { "$ref": "#/definitions/DataTreeItem" }, "type": "array" }, "key": { "description": "The data key for this segment of the composite input.", "pattern": "^[A-Za-z0-9-_~]{1,30}$", "type": "string" }, "name": { "description": "The value of this element", "type": "string" } }, "required": [ "items", "key", "name" ], "type": "object" }, "DataType": { "enum": [ "String", "Number", "Boolean", "Object", "DateTime" ], "type": "string" }, "DayOfWeek": { "enum": [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ], "type": "string" }, "DisplayType": { "enum": [ "CascadingOptions", "Checkbox", "Color", "ComboBox", "Date", "DateTime", "Email", "Html", "Image", "Json", "Number", "Options", "Password", "RadioGroup", "Secret", "Telephone", "TextArea", "TextLarge", "TextMedium", "TextShort", "Toggle", "Unknown", "Url" ], "type": "string" }, "EmailTemplate": { "defaultProperties": [], "properties": { "file": { "type": "string" }, "key": { "description": "The unique id for this item", "pattern": "^[A-Za-z0-9-_]{1,30}$", "type": "string" }, "name": { "description": "Friendly name", "type": "string" }, "path": { "type": "string" }, "type": { "$ref": "#/definitions/ContentType" } }, "required": [ "file", "key", "name", "path", "type" ], "type": "object" }, "EnabledForType": { "enum": [ "New", "All" ], "type": "string" }, "EpisodeConfiguration": { "defaultProperties": [], "properties": { "description": { "description": "Description for this episode", "type": "string" }, "isEnabled": { "default": true, "description": "Should this episode be active and available.", "type": "boolean" }, "key": { "description": "Episode key", "pattern": "^[A-Za-z0-9-_]{1,30}$", "type": "string" }, "name": { "description": "Episode friendly name", "type": "string" } }, "required": [ "isEnabled", "key", "name" ], "type": "object" }, "EventType": { "enum": [ "OnCreated", "OnSent", "OnOpened", "OnBounced", "OnOptedOut", "OnStarted", "OnMilestone", "OnStoryEvent", "OnChanged", "OnDataChanged", "OnFinished", "OnCompleted", "OnConverted", "OnDemand", "OnExternalEvent", "OnRepersonalized", "OnInboundLink", "OnOutboundLink", "OnRehydrated" ], "type": "string" }, "FlashboardConfiguration": { "defaultProperties": [], "description": "DXP ORGANIZATION FLASHBOARD CONFIG:\n-----------------------------------------------------\nThis file defines configurable organization flashboard settings hosted in the DXP platform.", "properties": { "key": { "description": "The key for this model in the DXP platform (read-only)", "pattern": "^[A-Za-z0-9-_]{1,30}$", "type": "string" }, "metrics": { "default": [], "items": { "$ref": "#/definitions/Metric" }, "type": "array" }, "name": { "description": "The name of this flashboard", "type": "string" } }, "required": [ "key", "name" ], "type": "object" }, "GroupingOperatorType": { "enum": [ "And", "Or", "Not" ], "type": "string" }, "Input": { "defaultProperties": [], "properties": { "attributes": { "additionalProperties": { "type": "string" }, "defaultProperties": [], "description": "An whose name and values are assigned to the underlying HTML input.", "type": "object" }, "dataTree": { "anyOf": [ { "$ref": "#/definitions/DataTree", "description": "An object that describes a set of cascading options." }, { "type": "null" } ], "default": null }, "description": { "description": "The description to show along with the name when presenting this on a form.", "type": "string" }, "display": { "$ref": "#/definitions/DisplayType", "description": "The display-type when presenting this input on a page" }, "isIdentifier": { "default": false, "type": "boolean" }, "key": { "description": "The input key.", "pattern": "^[A-Za-z0-9-_]{1,30}$", "type": "string" }, "locked": { "default": false, "type": "boolean" }, "name": { "description": "The input name (shown on DXP forms)", "type": "string" }, "options": { "default": [], "description": "If the display-type is Options, these are the list of values the user will select from.", "items": { "$ref": "#/definitions/OptionItem" }, "type": "array" }, "required": { "default": false, "description": "Mark this true to force this value be set when creating an experience.", "type": "boolean" }, "source": { "default": "Experience", "type": "string" }, "tip": { "description": "The tooltip to display when presenting on a form.", "type": [ "string", "null" ] }, "value": { "description": "This is the default value if no other value is input.", "type": [ "string", "number", "boolean" ] }, "visibleInReport": { "default": false, "type": "boolean" } }, "required": [ "display", "isIdentifier", "key", "locked", "name", "required", "source", "visibleInReport" ], "type": "object" }, "KpiSourceType": { "enum": [ "Standard", "Custom", "Link", "StoryEvent", "ExternalEvent" ], "type": "string" }, "LatencyStrategyType": { "enum": [ "Allow", "Reschedule", "Cancel" ], "type": "string" }, "Metric": { "defaultProperties": [], "properties": { "kpiKey": { "type": "string" }, "order": { "type": "number" }, "storyKey": { "type": "string" }, "type": { "$ref": "#/definitions/KpiSourceType" } }, "required": [ "kpiKey", "order", "storyKey", "type" ], "type": "object" }, "OptionItem": { "defaultProperties": [], "properties": { "display": { "description": "Option display" }, "value": { "description": "Option value" } }, "required": [ "display", "value" ], "type": "object" }, "OrganizationConfiguration": { "defaultProperties": [], "description": "DXP ORGANIZATION CONFIG:\n-----------------------------------------------------\nThis file defines configurable organization settings hosted in the DXP platform.", "properties": { "apiVersion": { "default": "api.view.do/v1", "description": "API version, model location (read-only)", "type": "string" }, "dataPoints": { "default": [], "description": "These are extra data points that can live with the organization and be used across stories.\nNote that they can differ by child entities.", "items": { "$ref": "#/definitions/DataPoint" }, "type": "array" }, "entities": { "default": [], "description": "Organizations can have sub-divisions that have alternative data-points. You can define child entities\nhere along with any data changes.", "items": { "$ref": "#/definitions/OrganizationEntity" }, "type": "array" }, "flashboards": { "default": null, "description": "These are the flashboards configured for the organization. Note** the metric keys must be tied to an\nexisting story tied to the organization.", "items": { "$ref": "#/definitions/FlashboardConfiguration" }, "type": "array" }, "key": { "description": "The key for this model in the DXP platform (read-only)", "pattern": "^[A-Za-z0-9-_]{1,30}$", "type": "string" }, "kind": { "default": "Organization", "description": "DXP model-type (read-only)", "type": "string" }, "name": { "description": "The name of this organization", "type": "string" }, "scheduledDataSync": { "default": false, "type": "boolean" }, "secrets": { "default": [], "description": "These are secrets available to this organization. They can be used in Service configurations for example.", "items": { "type": "string" }, "type": "array" }, "services": { "default": [], "description": "These are the services configured for the organization.\nThe keys here are what you use in the story.actions configuration.", "items": { "$ref": "#/definitions/OrganizationService" }, "type": "array" }, "suppressionLists": { "default": [], "description": "These are the services configured for the organization. These are read-only, as services must be\nconfigured in the administration app. The keys here are what you use in the story.actions configuration.", "items": { "$ref": "#/definitions/OrganizationSuppressionList" }, "type": "array" }, "url": { "description": "The URL for this organization", "type": "string" } }, "required": [ "apiVersion", "key", "kind", "name", "scheduledDataSync", "url" ], "type": "object" }, "OrganizationEntity": { "defaultProperties": [], "properties": { "data": { "additionalProperties": true, "description": "The data map of the values of the dataPoints defined at the organization.", "properties": {}, "type": "object" }, "key": { "description": "Entity key (used in the experience and preview model)", "pattern": "^[A-Za-z0-9-_]{1,30}$", "type": "string" }, "name": { "description": "Entity name", "type": "string" } }, "required": [ "data", "key", "name" ], "type": "object" }, "OrganizationService": { "defaultProperties": [], "properties": { "data": { "additionalProperties": true, "description": "Services parameters for actions across all stories", "properties": {}, "type": "object" }, "key": { "description": "Service key used in actions for all org stories", "pattern": "^[A-Za-z0-9-_]{1,30}$", "type": "string" }, "serviceProvider": { "$ref": "#/definitions/ServiceProviderType", "description": "Services provider type" } }, "required": [ "data", "key", "serviceProvider" ], "type": "object" }, "OrganizationSuppressionList": { "defaultProperties": [], "properties": { "key": { "description": "SuppressionList unique key used for adding and removing values (e.g. email address)", "pattern": "^[A-Za-z0-9-_]{1,16}$", "type": "string" }, "name": { "additionalProperties": true, "description": "SuppressionList User Friendly Name", "properties": {}, "type": "object" }, "storyKeys": { "description": "Stories that this list should suppress contact events (e.g. send emails). None specified will apply this list to all organization stories.", "items": { "type": "string" }, "type": "array" } }, "required": [ "key", "name", "storyKeys" ], "type": "object" }, "RuleType": { "enum": [ "Progress", "Event", "Data", "CreatedDate", "CampaignKey", "BatchKey", "StoryVersion", "CreatedAnonymously", "Episode" ], "type": "string" }, "ScheduleWindow": { "defaultProperties": [], "properties": { "daysOfWeek": { "default": [], "description": "Which days are okay to send? Provide an array of DayOfWeek types.", "items": { "$ref": "#/definitions/DayOfWeek" }, "type": "array" }, "endTime": { "description": "The local time-window stop time for this action to fire within.", "type": "string" }, "latencyStrategy": { "$ref": "#/definitions/LatencyStrategyType", "description": "How should we handle late fires?" }, "startTime": { "description": "The local time-window start time for this action to fire within.", "type": "string" }, "timeZone": { "description": "The local time zone to use: http://www.xiirus.net/articles/article-_net-convert-datetime-from-one-timezone-to-another-7e44y.aspx", "type": "string" } }, "required": [ "daysOfWeek", "endTime", "latencyStrategy", "startTime", "timeZone" ], "type": "object" }, "ServiceProviderType": { "enum": [ "DXP", "SMTP", "HipChat", "Slack", "Postmark", "LeadExec", "Twilio", "SparkPost", "SendGrid" ], "type": "string" }, "StoryAction": { "defaultProperties": [], "properties": { "actionType": { "$ref": "#/definitions/ActionType", "description": "Action to fire" }, "configurationModifier": { "description": "Configuration Modifier Script", "type": [ "string", "null" ] }, "configurationSource": { "$ref": "#/definitions/ConfigurationSource", "description": "The model that holds the configuration" }, "enabled": { "description": "Enabled", "type": "boolean" }, "enabledFor": { "$ref": "#/definitions/EnabledForType", "description": "Enabled for new only or ALL experiences" }, "eventData": { "description": "Action conditional trigger data (for certain events with certain data, usually a key)", "type": [ "string", "null" ] }, "eventType": { "$ref": "#/definitions/EventType", "description": "Action triggering event" }, "executionWindow": { "anyOf": [ { "$ref": "#/definitions/ScheduleWindow", "description": "The time window this action is safe to fire within" }, { "type": "null" } ] }, "fireMultiple": { "default": false, "description": "Should this fire each time the event is triggered?", "type": "boolean" }, "groupingOperator": { "$ref": "#/definitions/GroupingOperatorType", "description": "Rule grouping method (And vs Or)" }, "isDeliveryAction": { "description": "If this is the first email that delivers the XID", "type": "boolean" }, "key": { "description": "Action key, also used in aid parameter tracking", "pattern": "^[A-Za-z0-9-_]{1,30}$", "type": "string" }, "name": { "description": "Action friendly name", "type": "string" }, "onDemand": { "description": "Should we be able to fire this action from the experience grid?", "type": "boolean" }, "parameters": { "additionalProperties": { "type": [ "string", "number", "boolean" ] }, "defaultProperties": [], "description": "Action parameters. These vary by action and provider.", "type": "object" }, "responseModifier": { "description": "Response Modifier Script", "type": [ "string", "null" ] }, "rules": { "default": [], "description": "A list of rules that have to be satisfied before this action will fire.", "items": { "$ref": "#/definitions/StoryActionRule" }, "type": "array" }, "serviceProvider": { "$ref": "#/definitions/ServiceProviderType", "description": "Service provider for this action" }, "visibleInReport": { "description": "Should we record this action results in analytics? Makes queries slower.", "type": "boolean" }, "wait": { "$ref": "#/definitions/WaitType", "default": "None", "description": "Wait/delay after event?" }, "waitValue": { "default": 0, "description": "The units to delay before firing when WaitType is not None", "type": "number" } }, "required": [ "actionType", "configurationSource", "enabled", "enabledFor", "eventType", "fireMultiple", "groupingOperator", "isDeliveryAction", "key", "name", "onDemand", "parameters", "rules", "serviceProvider", "visibleInReport", "wait", "waitValue" ], "type": "object" }, "StoryActionRule": { "defaultProperties": [], "properties": { "key": { "type": "string" }, "member": { "type": "string" }, "memberType": { "$ref": "#/definitions/DataType" }, "operator": { "enum": [ "Contains", "DoesNotContain", "DoesNotEndWith", "DoesNotEqual", "DoesNotStartWit", "EndsWith", "Equal", "Equals", "GreaterThan", "GreaterThanOrEqual", "HasFired", "HasNotFired", "IsFalse", "IsNotNull", "IsNull", "IsTrue", "LessThan", "LessThanOrEqual", "StartsWith" ], "type": "string" }, "type": { "$ref": "#/definitions/RuleType" }, "value": { "type": "string" } }, "required": [ "key", "memberType", "operator", "type" ], "type": "object" }, "StoryConfiguration": { "defaultProperties": [], "description": "STORY CONFIG:\n-----------------------------------------------------\nThis file defines configurable story settings hosted in the DXP platform.", "properties": { "actions": { "default": [], "description": "A list of configured actions that are triggered via events fired during the lifetime of an experience.\n\nThese actions use services configured with the organization-configuration.", "items": { "$ref": "#/definitions/StoryAction" }, "type": "array" }, "apiVersion": { "default": "api.view.do/v1", "description": "API version, model location (read-only)", "type": "string" }, "customKpis": { "default": [], "description": "A list of story KPIs counters that can be incremented with published web-hooks.", "items": { "$ref": "#/definitions/StoryCustomKpi" }, "type": "array" }, "customLinks": { "default": [], "description": "A list of story custom links to distribute trackable redirection URLs.", "items": { "$ref": "#/definitions/StoryCustomLink" }, "type": "array" }, "description": { "type": "string" }, "emailTemplates": { "default": [], "description": "A list of story email templates, usable in Actions", "items": { "$ref": "#/definitions/EmailTemplate" }, "type": "array" }, "episodes": { "default": [], "description": "A list of alternative story data, css and js sets that have the same data inputs and contacts.", "items": { "$ref": "#/definitions/EpisodeConfiguration" }, "type": "array" }, "events": { "default": [], "description": "A list of story events that can be raised during the experience.", "items": { "$ref": "#/definitions/StoryEvent" }, "type": "array" }, "externalEvents": { "default": [], "description": "A list of external events that can be raised using our published web-hooks.", "items": { "$ref": "#/definitions/StoryExternalEvent" }, "type": "array" }, "funnelEnabled": { "description": "Toggle to allow anonymous experiences", "type": "boolean" }, "host": { "default": "Hosted", "description": "The host-type this story is meant for.\nHosted for NENT-based stories served from the platform, otherwise\nWebsite for stories served from a website.", "enum": [ "Hosted", "Website" ], "type": "string" }, "htmlTemplates": { "default": [], "description": "A list of story HTML templates that will be hosted and rendered using DXP tokens.", "items": { "$ref": "#/definitions/TemplateMeta" }, "type": "array" }, "inputMaps": { "default": [], "description": "A set of maps usable in actions or in the XAPI to translate input keys to external keys.", "items": { "$ref": "#/definitions/StoryInputMap" }, "type": "array" }, "inputs": { "default": [], "description": "A list of story inputs, used to define the story database.", "items": { "$ref": "#/definitions/Input" }, "type": "array" }, "key": { "description": "The key for this model in the DXP platform (readonly)", "pattern": "^[A-Za-z0-9-_]{1,18}$", "type": "string" }, "kind": { "default": "Story", "description": "DXP model-type (read-only)", "type": "string" }, "milestones": { "default": [], "description": "A list of story milestones, in order.", "items": { "pattern": "^[A-Za-z0-9-_\\s]{1,30}$" }, "type": "array" }, "name": { "type": "string" }, "organization": { "$ref": "#/definitions/OrganizationConfiguration", "description": "Optional (but encouraged) org model to be used during validateOnly story pushes" }, "organizationKey": { "type": "string" }, "preventDuplicates": { "description": "Set this value to true to prevent duplicates\nin public-created experiences. Be sure to\nannotate which contact-experiences is the\nidentifier to check.", "type": "boolean" }, "publicKey": { "description": "The key for this model in the DXP platform (readonly)", "pattern": "^[A-Za-z0-9-_]{1,18}$", "type": "string" }, "stripoRootDirectory": { "default": "{{org-key}}/production", "description": "Root directory where email templates are stored in Stripo.", "type": "string" }, "textTemplates": { "default": [], "description": "A list of story text templates usable in Actions or in the story as a URL reference.", "items": { "$ref": "#/definitions/TemplateMeta" }, "type": "array" }, "url": { "description": "Hosted URL for the story.\nIf set manually, overrides default convention-based URL.", "type": "string" }, "vanityUrl": { "description": "Hosted production-facing URL for the story.\nIf set manually, overrides default convention-based production URL.", "type": "string" } }, "required": [ "actions", "apiVersion", "customKpis", "customLinks", "emailTemplates", "episodes", "events", "externalEvents", "funnelEnabled", "host", "htmlTemplates", "inputMaps", "inputs", "key", "kind", "milestones", "name", "organization", "organizationKey", "preventDuplicates", "publicKey", "stripoRootDirectory", "textTemplates", "url", "vanityUrl" ], "type": "object" }, "StoryCustomKpi": { "defaultProperties": [], "properties": { "key": { "description": "The id for this KPI", "pattern": "^[A-Za-z0-9-]{1,16}$", "type": "string" }, "name": { "type": "string" }, "slug": { "type": "string" } }, "required": [ "key", "name" ], "type": "object" }, "StoryCustomLink": { "defaultProperties": [], "properties": { "isKpi": { "default": true, "description": "True if we should capture the counts and report on them.", "type": "boolean" }, "key": { "description": "The unique id for this item", "pattern": "^[A-Za-z0-9-_]{1,30}$", "type": "string" }, "name": { "description": "Friendly name", "type": "string" }, "targetUrl": { "description": "The external url to redirect the browser after clicking.", "type": "string" } }, "required": [ "isKpi", "key", "name", "targetUrl" ], "type": "object" }, "StoryEvent": { "defaultProperties": [], "properties": { "key": { "description": "The unique id for this item", "pattern": "^[A-Za-z0-9-_]{1,30}$", "type": "string" }, "name": { "description": "Friendly name", "type": "string" } }, "required": [ "key", "name" ], "type": "object" }, "StoryExternalEvent": { "defaultProperties": [], "properties": { "key": { "pattern": "^[A-Za-z0-9-_]{1,30}$", "type": "string" }, "name": { "type": "string" } }, "required": [ "key", "name" ], "type": "object" }, "StoryInputMap": { "defaultProperties": [], "properties": { "key": { "description": "The unique id for this item", "pattern": "^[A-Za-z0-9-_]{1,30}$", "type": "string" }, "map": { "additionalProperties": { "type": "string" }, "defaultProperties": [], "description": "A map of input keys with their translations.", "examples": [ "local-key: foreign-key" ], "type": "object" }, "name": { "description": "Friendly name", "type": "string" } }, "required": [ "key", "map", "name" ], "type": "object" }, "TemplateMeta": { "defaultProperties": [], "properties": { "file": { "type": "string" }, "key": { "description": "The unique id for this item", "pattern": "^[A-Za-z0-9-_]{1,30}$", "type": "string" }, "name": { "description": "Friendly name", "type": "string" }, "path": { "type": "string" }, "type": { "$ref": "#/definitions/ContentType" } }, "required": [ "file", "key", "name", "path", "type" ], "type": "object" }, "WaitType": { "enum": [ "None", "Minutes", "Hours", "Days" ], "type": "string" } }, "properties": { "action_templates": { "items": { "$ref": "#/definitions/ActionTemplate" }, "type": "array" }, "apiVersion": { "default": "api.view.do/v1", "description": "API version, model location (read-only)", "type": "string" }, "description": { "description": "The description for this template", "type": "string" }, "key": { "description": "The key for this template", "type": "string" }, "kind": { "default": "ActionTemplate", "description": "DXP model-type (read-only)", "type": "string" }, "name": { "description": "The key for this template", "type": "string" }, "organization_configuration": { "$ref": "#/definitions/OrganizationConfiguration" }, "parameter_templates": { "additionalProperties": { "defaultProperties": [], "properties": { "content": { "type": "string" }, "key": { "type": "string" }, "name": { "type": "string" }, "supportFiles": { "items": { "type": "string" }, "type": "array" }, "type": { "type": "string" } }, "required": [ "content", "key", "name", "supp