diff --git a/.circleci/config.yml b/.circleci/config.yml index e1a29c8f15..0fc1a21247 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -40,6 +40,39 @@ jobs: name: Lint command: npm run lint + incompatibility-check: + docker: + # specify the version you desire here + - image: circleci/node:7.10 + + # Specify service dependencies here if necessary + # CircleCI maintains a library of pre-built images + # documented at https://circleci.com/docs/2.0/circleci-images/ + # - image: circleci/mongo:3.4.4 + + working_directory: ~/repo + + steps: + - checkout + + # Download and cache dependencies + - restore_cache: + keys: + - v1-dependencies-{{ checksum "package.json" }} + # fallback to using the latest cache if no exact match is found + - v1-dependencies- + + - run: npm install + + - save_cache: + paths: + - node_modules + key: v1-dependencies-{{ checksum "package.json" }} + + # incompatibility-check + - run: npm run incompatibility-check + + build: docker: # specify the version you desire here @@ -119,9 +152,11 @@ workflows: build: jobs: - lint-json + - incompatibility-check - build: requires: - lint-json + - incompatibility-check - generate-docs: filters: branches: diff --git a/bin/incompatibility-check.js b/bin/incompatibility-check.js new file mode 100644 index 0000000000..94c3d03f95 --- /dev/null +++ b/bin/incompatibility-check.js @@ -0,0 +1,139 @@ +#!/usr/bin/env node + +/* +1.The script will check breaking changes as mentioned below and throw out errors to fail the build if needed +-when an existing schema file got removed (rename a file will be breaking change in this case). +-when an field got removed from the schema +-when a field's data type got changed +-when the value of $ref is changed +-when a $ref got removed from allOf + +2.The script will only generate warning messages for cases below. +-when the meta:extends does not match allOf +*/ + +const fs = require('fs'); +const glob = require("glob"); +const shell = require('shelljs'); +const diff = require('deep-diff'); +const masterCopyLoc = "../tempmaster/"; +const masterSchemaFolder = masterCopyLoc + "schemas"; +const masterExtensionFolder = masterCopyLoc + "extensions"; + +shell.rm("-rf", masterCopyLoc); //start +if (shell.exec('git clone https://github.com/adobe/xdm.git ' + masterCopyLoc).code !== 0) { + shell.echo('Error: Git clone master branch failed'); + shell.exit(1); +} + +var jsonDataTypes = ["string", "number", "integer", "array", "object", "boolean"]; +var schemaFiles = glob.sync(masterSchemaFolder + "/**/*.schema.json"); +schemaFiles = schemaFiles.concat(glob.sync(masterExtensionFolder + "/**/*.schema.json")); + +checkBreakingChanges(schemaFiles); +shell.rm("-rf", masterCopyLoc); //done + +function checkBreakingChanges(files) { + files.forEach(function (file) { + var err; + console.log('Check breaking changes -->' + file); + var originalSchema = JSON.parse(fs.readFileSync(file).toString()); + var workingFile = file.replace("tempmaster/", ""); + + try { //check if schema file got removed + var newSchema = JSON.parse(fs.readFileSync(workingFile).toString()); + } catch (err) { + if (err.code = "ENOENT" && err.message.indexOf("ENOENT: no such file or directory") != -1) + createError("Breaking changes found!!! --> " + workingFile.replace("../", "") + " can not be removed"); + else + createError(err) //raise other validation errors + } + + var allOfCheck = isAllOfBroken(originalSchema["allOf"], newSchema["allOf"]); //check deleted allOfs + if (originalSchema["allOf"] && allOfCheck.isBroken) { + createError('Breaking changes found!!! {"$ref": "' + allOfCheck["$ref"] + '"} inside "allOf" can not be removed.'); + } + + if (newSchema["meta:extends"] && Array.isArray(newSchema["meta:extends"]) && isMetaExtendsBroken(newSchema["meta:extends"], newSchema["allOf"])) { //check meta:extends against allOf + console.log('Warning: Incompatible "meta:extends" vs "allOf" found!!! The schemas inside "meta:extends" did not match those in "allOf".') + } + + var differences = diff(originalSchema, newSchema); + var brokenProperty = {}; + if (differences && isPropertyRemoved(differences, brokenProperty)) { //check removed properties + createError('Breaking changes found!!! Property "' + brokenProperty.name + '" can not be removed.'); + } + + if (differences && isFieldTypeChanged(differences, brokenProperty)) { //check changed data types + createError('Breaking changes found!!! Data type of property "' + brokenProperty.name + '" can not be changed.'); + } + + }); +} + +function isAllOfBroken(origAllOf, newAllOf) { + var isBroken; + for (var i in origAllOf) { + isBroken = true; + for (var j in newAllOf) { + if (JSON.stringify(origAllOf[i]) == JSON.stringify(newAllOf[j])) isBroken = false; + } + if (isBroken) + return { + "isBroken": true, + "$ref": origAllOf[i]["$ref"] + } + } + + return { + "isBroken": false + } +} + +function isMetaExtendsBroken(metaExtends, newAllOf) { + var allOfSchemas = []; + for (var i in newAllOf) { + if (newAllOf[i]["$ref"] && newAllOf[i]["$ref"].indexOf("#/definitions/") != 0 && newAllOf[i]["$ref"].indexOf("http") == 0) + allOfSchemas.push(newAllOf[i]["$ref"]) + } + + if (diff(metaExtends.sort(), allOfSchemas.sort())) { + //console.log(diff(metaExtends.sort(), allOfSchemas.sort())) + return true + } else + return false + +} + +function isPropertyRemoved(differences, brokenProperty) { + for (var i in differences) { + if (differences[i].kind == "D") { + if (differences[i].path.indexOf("properties") != -1) { + brokenProperty.name = differences[i].path.join("/").replace("../", ""); + return true; + } + } + } + return false; +} + +function isFieldTypeChanged(differences, brokenProperty) { + for (var i in differences) { + if (differences[i].kind == "E") { + if ((differences[i].path[differences[i].path.length - 1] == '$ref' && differences[i].path.indexOf("allOf") == -1) || + (differences[i].path[differences[i].path.length - 1] == 'type' && jsonDataTypes.indexOf(differences[i].lhs.toLowerCase() != -1))) { + brokenProperty.name = differences[i].path.join("/").replace("../", ""); + return true; + } + + } + } + return false; + +} + + +function createError(err) { + shell.rm("-rf", masterCopyLoc); + throw (err); +} \ No newline at end of file diff --git a/extensions/adobe/experience/aam-experienceevent.example.1.json b/extensions/adobe/experience/aam-experienceevent.example.1.json new file mode 100644 index 0000000000..a60d1c180e --- /dev/null +++ b/extensions/adobe/experience/aam-experienceevent.example.1.json @@ -0,0 +1,103 @@ +{ + "@id": "https://data.adobe.io/experienceid-123456", + "xdm:dataSource": { + "@id": "https://data.adobe.io/datasources/datasource-123", + "xdm:code": "DataSourceIntegrationCode-123" + }, + "xdm:timestamp": "2017-09-26T15:52:25+00:00", + "xdm:identityMap": { + "https://data.adobe.io/entities/namespace/4": [ + { + "xdm:id": "92312748749128" + } + ], + "https://data.adobe.io/entities/namespace/10": [ + { + "xdm:id": "2394509340-30453470347" + } + ], + "https://data.adobe.io/entities/namespace/9": [ + { + "xdm:id": "1233ce17-20e0-4a2c-8198-2a77fd60cf4d" + } + ] + }, + "xdm:environment": { + "xdm:type": "browser", + "xdm:browserDetails": { + "xdm:name": "Chrome", + "xdm:version": "63.0.3239", + "xdm:acceptLanguage": "en", + "xdm:cookiesEnabled": true, + "xdm:javaScriptEnabled": true, + "xdm:javaScriptVersion": "1.8.5", + "xdm:javaEnabled": true, + "xdm:javaVersion": "Java SE 8", + "xdm:viewportHeight": 900, + "xdm:viewportWidth": 1680 + }, + "xdm:operatingSystem": "MAC OS", + "xdm:operatingSystemVersion": "10.13", + "xdm:connectionType": "cable" + }, + "xdm:placeContext": { + "xdm:localTime": "2017-09-26T15:52:25+13:00", + "xdm:geo": { + "@id": "https://data.adobe.io/entities/geo/tokyo", + "xdm:countryCode": "JP", + "xdm:stateProvince": "JP-13", + "xdm:city": "Tōkyō", + "xdm:postalCode": "141-0032", + "schema:latitude": 35.6185, + "schema:longitude": 139.73237 + } + }, + "xdm:profileStitch": [ + { + "xdm:profileStitchID": { + "@id": "https://data.adobe.io/entities/profileStitchIdentity/1", + "xdm:namespace": { + "xdm:code": "AAM" + } + }, + "xdm:version": "1.0", + "xdm:identityMap": { + "ECID": [ + { + "xdm:id": "https://data.adobe.io/entities/identity/92312748749128" + }, + { + "xdm:id": "https://data.adobe.io/entities/identity/62312748749321" + }, + { + "xdm:id": "https://data.adobe.io/entities/identity/49312748749132" + } + ] + } + } + ], + "xdm:segmentMemberships": [ + { + "xdm:segmentID": { + "@id": "https://data.adobe.io/entities/identity/92312748749128", + "xdm:namespace": { + "xdm:code": "AAM" + } + }, + "xdm:profileStitchID": { + "@id": "https://data.adobe.io/entities/profileStitchIdentity/1", + "xdm:namespace": { + "xdm:code": "AAM" + }, + "xdm:lastQualificationTime": "2017-09-26T15:52:25+00:00", + "xdm:version": "1.0", + "xdm:validUntil": "2017-12-26T15:52:25+00:00", + "xdm:status": "realized" + } + } + ], + "xdm:signals": { + "pageTagCloud": ["analytics", "bigdata"], + "pagelinkshovered": ["http://abcxyzabcxyz.com", "http://abcxyzabcxyz1.com"] + } +} diff --git a/extensions/adobe/experience/aam-experienceevent.schema.json b/extensions/adobe/experience/aam-experienceevent.schema.json new file mode 100644 index 0000000000..184530f4a7 --- /dev/null +++ b/extensions/adobe/experience/aam-experienceevent.schema.json @@ -0,0 +1,45 @@ +{ + "meta:license": [ + "Copyright 2018 Adobe Systems Incorporated. All rights reserved.", + "This work is licensed under a Creative Commons Attribution 4.0 International (CC BY 4.0) license", + "you may not use this file except in compliance with the License. You may obtain a copy", + "of the License at https://creativecommons.org/licenses/by/4.0/" + ], + "$id": "https://ns.adobe.com/experience/aam-experienceevent", + "$schema": "http://json-schema.org/draft-06/schema#", + "title": "Adobe Audience Manager Template Mixin", + "type": "object", + "description": "Adobe Audience Manager Mixin for use with Schemas for Solution data ingestion. Includes the core/standard ExperienceEvent as well as the other required Core mixins.", + "meta:extensible": true, + "meta:abstract": true, + "meta:intendedToExtend": ["https://ns.adobe.com/xdm/context/experienceevent"], + "meta:extends": [ + "https://ns.adobe.com/xdm/context/experienceevent-segmentmembership", + "https://ns.adobe.com/xdm/context/experienceevent-environment-details", + "https://ns.adobe.com/xdm/context/experienceevent-profile-stitch", + "https://ns.adobe.com/experience/audiencemanager/experienceevent-all" + ], + "definitions": { + "aam-experienceevent": { + "properties": {} + } + }, + "allOf": [ + { + "$ref": "https://ns.adobe.com/xdm/context/experienceevent-segmentmembership" + }, + { + "$ref": "https://ns.adobe.com/xdm/context/experienceevent-environment-details" + }, + { + "$ref": "https://ns.adobe.com/xdm/context/experienceevent-profile-stitch" + }, + { + "$ref": "https://ns.adobe.com/experience/audiencemanager/experienceevent-all" + }, + { + "$ref": "#/definitions/aam-experienceevent" + } + ], + "meta:status": "experimental" +} diff --git a/extensions/adobe/experience/adcloud-experienceevent.schema.json b/extensions/adobe/experience/adcloud-experienceevent.schema.json index ceee1f8c99..ba14855086 100644 --- a/extensions/adobe/experience/adcloud-experienceevent.schema.json +++ b/extensions/adobe/experience/adcloud-experienceevent.schema.json @@ -31,7 +31,7 @@ "https://ns.adobe.com/experience/target/experienceevent-shared", "https://ns.adobe.com/experience/profile/experienceevent-shared", "https://ns.adobe.com/experience/implementations-ext", - "https://ns.adobe.com/xdm/context/experienceevent-enduserids-deprecated" + "https://ns.adobe.com/xdm/context/experienceevent-enduserids" ], "definitions": { "adcloud-experienceevent": { @@ -94,7 +94,7 @@ "$ref": "https://ns.adobe.com/experience/implementations-ext" }, { - "$ref": "https://ns.adobe.com/xdm/context/experienceevent-enduserids-deprecated" + "$ref": "https://ns.adobe.com/xdm/context/experienceevent-enduserids" }, { "$ref": "#/definitions/adcloud-experienceevent" diff --git a/extensions/adobe/experience/adcloud/experienceevent-all.schema.json b/extensions/adobe/experience/adcloud/experienceevent-all.schema.json index dce3daadee..e3118e59d8 100644 --- a/extensions/adobe/experience/adcloud/experienceevent-all.schema.json +++ b/extensions/adobe/experience/adcloud/experienceevent-all.schema.json @@ -35,6 +35,11 @@ "title": "Ad Asset Details", "$ref": "https://ns.adobe.com/experience/adcloud/advertisement", "description": "Digital advertisement details" + }, + "https://ns.adobe.com/experience/adcloud/stitchId": { + "title": "Stitch ID Chosen", + "type": "string", + "description": "ID from the Ad Servers through AdCloud STATS to track click-through conversion on browsers that block third party cookies" } } } diff --git a/extensions/adobe/experience/analytics-experienceevent.schema.json b/extensions/adobe/experience/analytics-experienceevent.schema.json index 9bd2b3e03f..6ff21f0689 100644 --- a/extensions/adobe/experience/analytics-experienceevent.schema.json +++ b/extensions/adobe/experience/analytics-experienceevent.schema.json @@ -31,7 +31,7 @@ "https://ns.adobe.com/experience/target/experienceevent-shared", "https://ns.adobe.com/experience/profile/experienceevent-shared", "https://ns.adobe.com/experience/implementations-ext", - "https://ns.adobe.com/xdm/context/experienceevent-enduserids-deprecated" + "https://ns.adobe.com/xdm/context/experienceevent-enduserids" ], "definitions": { "analytics-experienceevent": { @@ -94,7 +94,7 @@ "$ref": "https://ns.adobe.com/experience/implementations-ext" }, { - "$ref": "https://ns.adobe.com/xdm/context/experienceevent-enduserids-deprecated" + "$ref": "https://ns.adobe.com/xdm/context/experienceevent-enduserids" }, { "$ref": "#/definitions/analytics-experienceevent" diff --git a/extensions/adobe/experience/audiencemanager/experienceevent-all.schema.json b/extensions/adobe/experience/audiencemanager/experienceevent-all.schema.json new file mode 100644 index 0000000000..c942521182 --- /dev/null +++ b/extensions/adobe/experience/audiencemanager/experienceevent-all.schema.json @@ -0,0 +1,38 @@ +{ + "meta:license": [ + "Copyright 2017 Adobe Systems Incorporated. All rights reserved.", + "This work is licensed under a Creative Commons Attribution 4.0 International (CC BY 4.0) license", + "you may not use this file except in compliance with the License. You may obtain a copy", + "of the License at https://creativecommons.org/licenses/by/4.0/" + ], + "$id": "https://ns.adobe.com/experience/audiencemanager/experienceevent-all", + "$schema": "http://json-schema.org/draft-06/schema#", + "title": "Adobe Audience Manager ExperienceEvent Full Extension", + "type": "object", + "meta:extensible": true, + "meta:abstract": true, + "meta:intendedToExtend": ["https://ns.adobe.com/xdm/context/experienceevent"], + "description": "Adobe Audience Manager ExperienceEvent Full Extension. Contains all Solution added fields.", + "definitions": { + "experienceevent": { + "properties": { + "xdm:signals": { + "type": "object", + "meta:xdmType": "map", + "additionalProperties": { + "type": "array", + "items": { + "type": "string", + "description": "Value of the parameter" + } + } + } + } + } + }, + "allOf": [ + { + "$ref": "#/definitions/experienceevent" + } + ] +} diff --git a/extensions/adobe/experience/campaign-experienceevent.schema.json b/extensions/adobe/experience/campaign-experienceevent.schema.json index b9c8134d51..4219941e70 100644 --- a/extensions/adobe/experience/campaign-experienceevent.schema.json +++ b/extensions/adobe/experience/campaign-experienceevent.schema.json @@ -31,7 +31,7 @@ "https://ns.adobe.com/experience/target/experienceevent-shared", "https://ns.adobe.com/experience/profile/experienceevent-shared", "https://ns.adobe.com/experience/implementations-ext", - "https://ns.adobe.com/xdm/context/experienceevent-enduserids-deprecated" + "https://ns.adobe.com/xdm/context/experienceevent-enduserids" ], "definitions": { "campaign-experienceevent": { @@ -94,7 +94,7 @@ "$ref": "https://ns.adobe.com/experience/implementations-ext" }, { - "$ref": "https://ns.adobe.com/xdm/context/experienceevent-enduserids-deprecated" + "$ref": "https://ns.adobe.com/xdm/context/experienceevent-enduserids" }, { "$ref": "#/definitions/campaign-experienceevent" diff --git a/extensions/adobe/experience/campaign/experienceevent-all.schema.json b/extensions/adobe/experience/campaign/experienceevent-all.schema.json index 73dad72e40..e003148d7b 100755 --- a/extensions/adobe/experience/campaign/experienceevent-all.schema.json +++ b/extensions/adobe/experience/campaign/experienceevent-all.schema.json @@ -28,10 +28,10 @@ "type": "number", "description": "Identifier of the message." }, - "xdm:profile": { - "title": "Profile", - "$ref": "https://ns.adobe.com/xdm/context/profile", - "description": "The recipient of the message. This property is primarily used to link the message to a Profile using the `EndCustomerID` but it can also be used to freeze some properties of the profile at the time the message was sent." + "xdm:profileSnapshot": { + "title": "Profile Snapshot", + "$ref": "https://ns.adobe.com/experience/campaign/profile-snapshot", + "description": "Profile Snapshot contains the recipient of the message. This property is primarily used to link the message to a Profile using the `IdentityMap` but it can also be used to freeze some properties of the profile at the time the message was sent." }, "xdm:variant": { "title": "Content Variant", diff --git a/extensions/adobe/experience/campaign/profile-snapshot.example.1.json b/extensions/adobe/experience/campaign/profile-snapshot.example.1.json new file mode 100644 index 0000000000..39d7a3f163 --- /dev/null +++ b/extensions/adobe/experience/campaign/profile-snapshot.example.1.json @@ -0,0 +1,86 @@ +{ + "xdm:person": { + "xdm:name": { + "xdm:firstName": "Jane", + "xdm:middleName": "F", + "xdm:lastName": "Doe", + "xdm:fullName": "Jane F. Doe" + }, + "xdm:birthDayAndMonth": "01-03", + "xdm:gender": "female" + }, + "xdm:directMarketingPhone": { + "xdm:primary": true, + "xdm:number": "1-408-888-8888", + "xdm:status": "active", + "xdm:errorCount": 0 + }, + "xdm:directMarketingAddress": { + "@id": "https://data.adobe.io/entities/address/123", + "xdm:primary": false, + "xdm:street1": "345 Park Ave", + "xdm:city": "San Jose", + "xdm:stateProvince": "US-CA", + "xdm:postalCode": "95110", + "xdm:country": "United States", + "xdm:countryCode": "US", + "schema:latitude": 37.3382, + "schema:longitude": 121.8863, + "xdm:status": "active", + "xdm:lastVerifiedDate": "2018-01-02", + "xdm:errorCount": 0, + "xdm:quality": "Fully-recognized street" + }, + "xdm:directMarketingEmail": { + "xdm:primary": false, + "xdm:address": "jsmith@xyzinc.com", + "xdm:label": "John Smith", + "xdm:type": "work", + "xdm:status": "active", + "xdm:errorCount": 0 + }, + "xdm:pushNotificationTokens": [ + { + "xdm:token": "ABC123DEFG", + "xdm:registrationDate": "2017-09-26T15:52:25+00:00", + "xdm:environment": { + "xdm:type": "browser", + "xdm:browserDetails": { + "xdm:name": "Chrome", + "xdm:version": "63.0.3239", + "xdm:acceptLanguage": "en", + "xdm:cookiesEnabled": true, + "xdm:javaScriptEnabled": true, + "xdm:javaScriptVersion": "1.8.5", + "xdm:javaEnabled": true, + "xdm:javaVersion": "Java SE 8", + "xdm:viewportHeight": 600, + "xdm:viewportWidth": 300 + }, + "xdm:operatingSystem": "iOS", + "xdm:operatingSystemVersion": "11.2.1", + "xdm:connectionType": "mobile" + }, + "xdm:device": { + "xdm:typeId": "TypeIdentifier-111", + "xdm:typeIdService": "deviceAtlas", + "xdm:type": "mobile", + "xdm:manufacturer": "Apple", + "xdm:model": "iPhone 6", + "xdm:modelNumber": "A1586", + "xdm:screenHeight": 667, + "xdm:screenWidth": 375, + "xdm:colorDepth": 16777216 + }, + "xdm:application": { + "xdm:id": "Abc123", + "xdm:name": "facebook", + "xdm:version": "153.0" + }, + "xdm:channel": { + "@id": "https://ns.adobe.com/xdm/channels/facebook-feed", + "@type": "https://ns.adobe.com/xdm/channel-types/social" + } + } + ] +} diff --git a/extensions/adobe/experience/campaign/profile-snapshot.schema.json b/extensions/adobe/experience/campaign/profile-snapshot.schema.json new file mode 100644 index 0000000000..b541dca553 --- /dev/null +++ b/extensions/adobe/experience/campaign/profile-snapshot.schema.json @@ -0,0 +1,53 @@ +{ + "meta:license": [ + "Copyright 2018 Adobe Systems Incorporated. All rights reserved.", + "This work is licensed under a Creative Commons Attribution 4.0 International (CC BY 4.0) license", + "you may not use this file except in compliance with the License. You may obtain a copy", + "of the License at https://creativecommons.org/licenses/by/4.0/" + ], + "$id": "https://ns.adobe.com/experience/campaign/profile-snapshot", + "$schema": "http://json-schema.org/draft-06/schema#", + "title": "Adobe Campaign Profile Snapshot", + "type": "object", + "description": "Adobe Campaign Profile Snapshot contains the recipient of the message. This property is primarily used to link the message to a Profile using the `IdentityMap` but it can also be used to freeze some properties of the profile at the time the message was sent.", + "definitions": { + "profile-snapshot": { + "properties": { + "xdm:person": { + "title": "Person", + "$ref": "https://ns.adobe.com/xdm/context/person", + "description": "An individual actor, contact, or owner." + }, + "xdm:directMarketingAddress": { + "title": "Direct Marketing Address", + "$ref": "https://ns.adobe.com/xdm/context/directmarketing-address", + "description": "Direct Marketing postal address." + }, + "xdm:directMarketingEmail": { + "title": "Direct Marketing Email", + "$ref": "https://ns.adobe.com/xdm/context/directmarketing-emailaddress", + "description": "Direct Marketing email address." + }, + "xdm:directMarketingPhone": { + "title": "Direct Marketing Phone", + "$ref": "https://ns.adobe.com/xdm/context/directmarketing-phonenumber", + "description": "Direct Marketing phone number." + }, + "xdm:pushNotificationTokens": { + "title": "Push Notification Tokens", + "type": "array", + "description": "Push notification tokens are used to communicate with applications that are installed on devices or SaaS application accounts.", + "items": { + "$ref": "https://ns.adobe.com/xdm/context/pushnotificationtoken" + } + } + } + } + }, + "allOf": [ + { + "$ref": "#/definitions/profile-snapshot" + } + ], + "meta:status": "experimental" +} diff --git a/extensions/adobe/experience/target-experienceevent.schema.json b/extensions/adobe/experience/target-experienceevent.schema.json index 244aa7a512..f7f840b99d 100644 --- a/extensions/adobe/experience/target-experienceevent.schema.json +++ b/extensions/adobe/experience/target-experienceevent.schema.json @@ -30,7 +30,7 @@ "https://ns.adobe.com/experience/target/experienceevent-all", "https://ns.adobe.com/experience/profile/experienceevent-shared", "https://ns.adobe.com/experience/implementations-ext", - "https://ns.adobe.com/xdm/context/experienceevent-enduserids-deprecated" + "https://ns.adobe.com/xdm/context/experienceevent-enduserids" ], "definitions": { "target-experienceevent": { @@ -90,7 +90,7 @@ "$ref": "https://ns.adobe.com/experience/implementations-ext" }, { - "$ref": "https://ns.adobe.com/xdm/context/experienceevent-enduserids-deprecated" + "$ref": "https://ns.adobe.com/xdm/context/experienceevent-enduserids" }, { "$ref": "#/definitions/target-experienceevent" diff --git a/package.json b/package.json index d7b4459ff2..84d5f42c42 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "aem_user": "packageUser", "aem_password": "override me securely", "markdown-importer-version": "0.0.4", - "schemas": 241 + "schemas": 246 }, "scripts": { "clean": "rm -rf docs/reference", @@ -20,7 +20,8 @@ "upload:prod": "curl -u \"$npm_package_config_aem_user:$npm_package_config_aem_password\" -F file=\"@xdm-docs.zip\" -F name=\"xdm-docs\" -F force=true -F install=true https://author-adobeio-prod.adobemsbasic.com/crx/packmgr/service.jsp", "activate": "curl -u \"$npm_package_config_aem_user:$npm_package_config_aem_password\" -F cmd=activate -F ignoredeactivated=true -F onlymodified=true -F path=/content/udp/en/open/standards/xdm/docs https://author-adobeio-stage.adobemsbasic.com/etc/replication/treeactivation.html", "activate:prod": "curl -u \"$npm_package_config_aem_user:$npm_package_config_aem_password\" -F cmd=activate -F ignoredeactivated=true -F onlymodified=true -F path=/content/udp/en/open/standards/xdm/docs https://author-adobeio-prod.adobemsbasic.com/etc/replication/treeactivation.html", - "stability-check": "node bin/show-stablization-candidates.js" + "stability-check": "node bin/show-stablization-candidates.js", + "incompatibility-check": "cd bin; node incompatibility-check.js" }, "repository": { "type": "git", @@ -33,10 +34,11 @@ "devDependencies": { "@adobe/jsonschema2md": "1.1.0", "ajv": "5.5.0", - "prettier": "1.15.3", - "pretty-quick": "^1.4.1", + "deep-diff": "^1.0.2", "mocha": "^5.0.1", "mocha-junit-reporter": "^1.17.0", + "prettier": "1.15.3", + "pretty-quick": "^1.4.1", "shelljs": "^0.8.3", "shx": "^0.3.2" } diff --git a/schemas/common/auditable.schema.json b/schemas/common/auditable.schema.json index 5d33c10b01..db3d2ad2d0 100644 --- a/schemas/common/auditable.schema.json +++ b/schemas/common/auditable.schema.json @@ -9,37 +9,36 @@ "$schema": "http://json-schema.org/draft-06/schema#", "title": "Audit Trail", "type": "object", - "meta:extends": ["http://ns.adobe.com/adobecloud/core/1.0"], "meta:abstract": true, "description": - "Inheriting this schema using `allOf` indicates that the data record is auditable, i.e. it can be determined when the record has last been modified and by whom.", + "Inclusion of this schema indicates that the data record is auditable, i.e. it can be determined when the record has last been modified and by whom.", "definitions": { "auditlog": { "properties": { "xdm:repositoryCreatedBy": { "title": "Created by User Identifier", "type": "string", - "description": "User id who has created the entity.\n" + "description": "User id who has created the entity." }, "xdm:repositoryLastModifiedBy": { "title": "Modified by User Identifier", "type": "string", "description": - "User id who last modified the entity.\nAt creation time, `modifiedByUser` is set as `createdByUser`.\n" + "User id who last modified the entity. At creation time, `modifiedByUser` is set as `createdByUser`." }, "xdm:createdByBatchID": { "title": "Created by Batch Identifier", "type": "string", - "format": "uri", + "format": "uri-reference", "description": - "The Data Set Files in Catalog Services which has been originating the creation of the entity.\n" + "The Data Set Files in Catalog Services which has been originating the creation of the entity." }, "xdm:modifiedByBatchID": { "title": "Modified by Batch Identifier", "type": "string", - "format": "uri", + "format": "uri-reference", "description": - "The last Data Set Files in Catalog Services which has modified the entity.\nAt creation time, `modifiedByBatchID` is set as `createdByBatchID`.\n" + "The last Data Set Files in Catalog Services which has modified the entity. At creation time, `modifiedByBatchID` is set as `createdByBatchID`." } } } @@ -49,8 +48,7 @@ "$ref": "#/definitions/auditlog" }, { - "$ref": - "http://ns.adobe.com/adobecloud/core/1.0#/definitions/date-properties" + "$ref": "http://ns.adobe.com/adobecloud/core/1.0#/definitions/date-properties" } ], "meta:status": "experimental" diff --git a/schemas/context/directmarketing-address.example.1.json b/schemas/context/directmarketing-address.example.1.json new file mode 100644 index 0000000000..ecb659fc8d --- /dev/null +++ b/schemas/context/directmarketing-address.example.1.json @@ -0,0 +1,16 @@ +{ + "@id": "https://data.adobe.io/entities/address/123", + "xdm:primary": false, + "xdm:street1": "345 Park Ave", + "xdm:city": "San Jose", + "xdm:stateProvince": "US-CA", + "xdm:postalCode": "95110", + "xdm:country": "United States", + "xdm:countryCode": "US", + "schema:latitude": 37.3382, + "schema:longitude": 121.8863, + "xdm:status": "active", + "xdm:lastVerifiedDate": "2018-01-02", + "xdm:errorCount": 0, + "xdm:quality": "Fully-recognized street" +} diff --git a/schemas/context/directmarketing-address.schema.json b/schemas/context/directmarketing-address.schema.json new file mode 100644 index 0000000000..5f81f4aa69 --- /dev/null +++ b/schemas/context/directmarketing-address.schema.json @@ -0,0 +1,46 @@ +{ + "meta:license": [ + "Copyright 2018 Adobe Systems Incorporated. All rights reserved.", + "This work is licensed under a Creative Commons Attribution 4.0 International (CC BY 4.0) license", + "you may not use this file except in compliance with the License. You may obtain a copy", + "of the License at https://creativecommons.org/licenses/by/4.0/" + ], + "$id": "https://ns.adobe.com/xdm/context/directmarketing-address", + "$schema": "http://json-schema.org/draft-06/schema#", + "title": "Direct Marketing Address", + "type": "object", + "description": "Direct Marketing Address.", + "definitions": { + "directmarketing-address": { + "properties": { + "xdm:errorCount": { + "title": "Address Error Count", + "type": "integer", + "description": "Number of consecutive errors when sending to this address." + }, + "xdm:quality": { + "title": "Address Quality", + "type": "string", + "description": "Address quality rating.", + "meta:enum": { + "incomplete_address": "Incomplete address", + "unknown_town_postal_code": "Unknown Town-Postal Code", + "empty_street": "Empty street", + "unknown_street": "Unknown street", + "partially_recognized_street": "Partially-recognized street", + "fully_recognized_street": "Fully-recognized street" + } + } + } + } + }, + "allOf": [ + { + "$ref": "#/definitions/directmarketing-address" + }, + { + "$ref": "https://ns.adobe.com/xdm/common/address" + } + ], + "meta:status": "experimental" +} diff --git a/schemas/context/directmarketing-emailaddress.example.1.json b/schemas/context/directmarketing-emailaddress.example.1.json new file mode 100644 index 0000000000..5cfeec39a8 --- /dev/null +++ b/schemas/context/directmarketing-emailaddress.example.1.json @@ -0,0 +1,8 @@ +{ + "xdm:primary": false, + "xdm:address": "jsmith@xyzinc.com", + "xdm:label": "John Smith", + "xdm:type": "work", + "xdm:status": "active", + "xdm:errorCount": 0 +} diff --git a/schemas/context/directmarketing-emailaddress.schema.json b/schemas/context/directmarketing-emailaddress.schema.json new file mode 100644 index 0000000000..57e20ac93e --- /dev/null +++ b/schemas/context/directmarketing-emailaddress.schema.json @@ -0,0 +1,38 @@ +{ + "meta:license": [ + "Copyright 2018 Adobe Systems Incorporated. All rights reserved.", + "This work is licensed under a Creative Commons Attribution 4.0 International (CC BY 4.0) license", + "you may not use this file except in compliance with the License. You may obtain a copy", + "of the License at https://creativecommons.org/licenses/by/4.0/" + ], + "$id": "https://ns.adobe.com/xdm/context/directmarketing-emailaddress", + "$schema": "http://json-schema.org/draft-06/schema#", + "title": "Direct Marketing Email Address", + "type": "object", + "description": "Direct Marketing Email Address.", + "definitions": { + "directmarketing-emailaddress": { + "properties": { + "xdm:errorCount": { + "title": "Error Count", + "type": "integer", + "description": "Number of consecutive errors when sending to this email address." + }, + "xdm:quality": { + "title": "Quality", + "type": "string", + "description": "Quality rating." + } + } + } + }, + "allOf": [ + { + "$ref": "#/definitions/directmarketing-emailaddress" + }, + { + "$ref": "https://ns.adobe.com/xdm/context/emailaddress" + } + ], + "meta:status": "experimental" +} diff --git a/schemas/context/directmarketing-phonenumber.example.1.json b/schemas/context/directmarketing-phonenumber.example.1.json new file mode 100644 index 0000000000..75a93aad6a --- /dev/null +++ b/schemas/context/directmarketing-phonenumber.example.1.json @@ -0,0 +1,6 @@ +{ + "xdm:primary": true, + "xdm:number": "1-408-888-8888", + "xdm:status": "active", + "xdm:errorCount": 0 +} diff --git a/schemas/context/directmarketing-phonenumber.schema.json b/schemas/context/directmarketing-phonenumber.schema.json new file mode 100644 index 0000000000..13c0cabd40 --- /dev/null +++ b/schemas/context/directmarketing-phonenumber.schema.json @@ -0,0 +1,38 @@ +{ + "meta:license": [ + "Copyright 2018 Adobe Systems Incorporated. All rights reserved.", + "This work is licensed under a Creative Commons Attribution 4.0 International (CC BY 4.0) license", + "you may not use this file except in compliance with the License. You may obtain a copy", + "of the License at https://creativecommons.org/licenses/by/4.0/" + ], + "$id": "https://ns.adobe.com/xdm/context/directmarketing-phonenumber", + "$schema": "http://json-schema.org/draft-06/schema#", + "title": "Direct Marketing Phone Number", + "type": "object", + "description": "Direct Marketing Phone Number.", + "definitions": { + "directmarketing-phonenumber": { + "properties": { + "xdm:errorCount": { + "title": "Error Count", + "type": "integer", + "description": "Number of consecutive errors when calling this phone number." + }, + "xdm:quality": { + "title": "Quality", + "type": "string", + "description": "Quality rating." + } + } + } + }, + "allOf": [ + { + "$ref": "#/definitions/directmarketing-phonenumber" + }, + { + "$ref": "https://ns.adobe.com/xdm/context/phonenumber" + } + ], + "meta:status": "experimental" +} diff --git a/schemas/context/experienceevent-enduserids.example.1.json b/schemas/context/experienceevent-enduserids.example.1.json new file mode 100644 index 0000000000..d093f2cc6d --- /dev/null +++ b/schemas/context/experienceevent-enduserids.example.1.json @@ -0,0 +1,23 @@ +{ + "xdm:endUserIDs": { + "https://ns.adobe.com/experience/mcid": { + "@id": "https://data.adobe.io/entities/identity/92312748749128", + "xdm:namespace": { + "xdm:code": "ECID" + } + }, + "https://ns.adobe.com/experience/aaid": { + "@id": "https://data.adobe.io/entities/identity/2394509340-30453470347", + "xdm:namespace": { + "xdm:code": "AVID" + } + }, + "https://ns.adobe.com/experience/tntid": { + "@id": + "https://data.adobe.io/entities/identity/1233ce17-20e0-4a2c-8198-2a77fd60cf4d", + "xdm:namespace": { + "xdm:code": "tnt0051" + } + } + } +} diff --git a/schemas/context/experienceevent-enduserids.schema.json b/schemas/context/experienceevent-enduserids.schema.json new file mode 100644 index 0000000000..b4c9750288 --- /dev/null +++ b/schemas/context/experienceevent-enduserids.schema.json @@ -0,0 +1,36 @@ +{ + "meta:license": [ + "Copyright 2017 Adobe Systems Incorporated. All rights reserved.", + "This work is licensed under a Creative Commons Attribution 4.0 International (CC BY 4.0) license", + "you may not use this file except in compliance with the License. You may obtain a copy", + "of the License at https://creativecommons.org/licenses/by/4.0/" + ], + "$id": "https://ns.adobe.com/xdm/context/experienceevent-enduserids", + "$schema": "http://json-schema.org/draft-06/schema#", + "title": "ExperienceEvent endUserIDs", + "type": "object", + "meta:extensible": true, + "meta:abstract": true, + "meta:intendedToExtend": ["https://ns.adobe.com/xdm/context/experienceevent"], + "description": "Condensed, normalized encapsulation of end user identifiers asserted for this ExperienceEvent.", + "definitions": { + "experienceevent-enduserids": { + "properties": { + "xdm:endUserIDs": { + "title": "End User IDs", + "$ref": "https://ns.adobe.com/xdm/context/enduserids", + "description": "Condensed, normalized encapsulation of end user identifiers asserted for this ExperienceEvent." + } + } + } + }, + "allOf": [ + { + "$ref": "https://ns.adobe.com/xdm/common/extensible#/definitions/@context" + }, + { + "$ref": "#/definitions/experienceevent-enduserids" + } + ], + "meta:status": "stabilizing" +} diff --git a/schemas/context/experienceevent-segmentmembership.example.1.json b/schemas/context/experienceevent-segmentmembership.example.1.json index 588b7330a6..819a87a574 100644 --- a/schemas/context/experienceevent-segmentmembership.example.1.json +++ b/schemas/context/experienceevent-segmentmembership.example.1.json @@ -1,18 +1,26 @@ { - "xdm:segmentMemberships": [{ - "xdm:segmentID": { - "@id": "https://data.adobe.io/entities/segmentIdentity/92312748749128", - "xdm:namespace": { - "xdm:code": "AAM" - } + "xdm:segmentMembership": { + "AAM": { + "04a81716-43d6-4e7a-a49c-f1d8b3129ba9" : { + "xdm:version": "15", + "xdm:timestamp": "2018-04-26T15:52:25+00:00", + "xdm:validUntil": "2019-04-26T15:52:25+00:00", + "xdm:status": "existing" }, - "xdm:lastQualificationTime": "2017-09-26T15:52:25+00:00", - "xdm:version": "1.0", - "xdm:validUntil" : "2017-12-26T15:52:25+00:00", - "xdm:status" : "realized", - "xdm:payload": { - "xdm:payloadPropensityValue": 0.5, - "xdm:payloadType": "propensity" - } - }] + "53cba6b2-a23b-454a-8069-fc41308f1c0f" : { + "xdm:version": "3", + "xdm:lastQualificationTime": "2018-04-26T15:52:25+00:00", + "xdm:validUntil": "2018-04-27T15:52:25+00:00", + "xdm:status": "realized" + } + }, + "Email": { + "abcd@adobe.com" : { + "xdm:version": "1", + "xdm:lastQualificationTime": "2017-09-26T15:52:25+00:00", + "xdm:validUntil": "2017-12-26T15:52:25+00:00", + "xdm:status": "exited" + } + } + } } diff --git a/schemas/context/experienceevent-segmentmembership.schema.json b/schemas/context/experienceevent-segmentmembership.schema.json index cbae9d8327..c498369e25 100644 --- a/schemas/context/experienceevent-segmentmembership.schema.json +++ b/schemas/context/experienceevent-segmentmembership.schema.json @@ -18,11 +18,25 @@ "properties": { "xdm:segmentMemberships": { "title": "Segment Memberships", - "description": "The segments associated with this ExperienceEvent", + "meta:status": "deprecated", + "description": "The segments associated with this ExperienceEvent. Deprecated, use `xdm:segmentMembership` instead.", "type": "array", "items": { "$ref": "https://ns.adobe.com/xdm/context/segmentmembershipitem" } + }, + "xdm:segmentMembership":{ + "title" : "Segment Membership Map", + "type" : "object", + "meta:xdmType": "map", + "additionalProperties" : { + "title": "Segment Membership per Namespace", + "type": "object", + "meta:xdmType": "map", + "additionalProperties" : { + "$ref" : "https://ns.adobe.com/xdm/context/segmentmembership" + } + } } } } diff --git a/schemas/context/profile-directmarketing.example.1.json b/schemas/context/profile-directmarketing.example.1.json new file mode 100644 index 0000000000..9b3037158a --- /dev/null +++ b/schemas/context/profile-directmarketing.example.1.json @@ -0,0 +1,32 @@ +{ + "xdm:directMarketingPhone": { + "xdm:primary": true, + "xdm:number": "1-408-888-8888", + "xdm:status": "active", + "xdm:errorCount": 0 + }, + "xdm:directMarketingAddress": { + "@id": "https://data.adobe.io/entities/address/123", + "xdm:primary": false, + "xdm:street1": "345 Park Ave", + "xdm:city": "San Jose", + "xdm:stateProvince": "US-CA", + "xdm:postalCode": "95110", + "xdm:country": "United States", + "xdm:countryCode": "US", + "schema:latitude": 37.3382, + "schema:longitude": 121.8863, + "xdm:status": "active", + "xdm:lastVerifiedDate": "2018-01-02", + "xdm:errorCount": 0, + "xdm:quality": "Fully-recognized street" + }, + "xdm:directMarketingEmail": { + "xdm:primary": false, + "xdm:address": "jsmith@xyzinc.com", + "xdm:label": "John Smith", + "xdm:type": "work", + "xdm:status": "active", + "xdm:errorCount": 0 + } +} diff --git a/schemas/context/profile-directmarketing.schema.json b/schemas/context/profile-directmarketing.schema.json new file mode 100644 index 0000000000..47f5ca4119 --- /dev/null +++ b/schemas/context/profile-directmarketing.schema.json @@ -0,0 +1,46 @@ +{ + "meta:license": [ + "Copyright 2018 Adobe Systems Incorporated. All rights reserved.", + "This work is licensed under a Creative Commons Attribution 4.0 International (CC BY 4.0) license", + "you may not use this file except in compliance with the License. You may obtain a copy", + "of the License at https://creativecommons.org/licenses/by/4.0/" + ], + "$id": "https://ns.adobe.com/xdm/context/profile-directmarketing", + "$schema": "http://json-schema.org/draft-06/schema#", + "title": "Profile Direct Marketing", + "type": "object", + "meta:extensible": true, + "meta:abstract": true, + "meta:intendedToExtend": ["https://ns.adobe.com/xdm/context/profile"], + "description": "Direct Marketing addressing for profiles.", + "definitions": { + "profile-directmarketing": { + "properties": { + "xdm:directMarketingAddress": { + "title": "Direct Marketing Address", + "$ref": "https://ns.adobe.com/xdm/context/directmarketing-address", + "description": "Direct Marketing postal address." + }, + "xdm:directMarketingEmail": { + "title": "Direct Marketing Email", + "$ref": "https://ns.adobe.com/xdm/context/directmarketing-emailaddress", + "description": "Direct Marketing email address." + }, + "xdm:directMarketingPhone": { + "title": "Direct Marketing Phone", + "$ref": "https://ns.adobe.com/xdm/context/directmarketing-phonenumber", + "description": "Direct Marketing phone number." + } + } + } + }, + "allOf": [ + { + "$ref": "https://ns.adobe.com/xdm/common/extensible#/definitions/@context" + }, + { + "$ref": "#/definitions/profile-directmarketing" + } + ], + "meta:status": "experimental" +} diff --git a/schemas/context/profile-segmentation.example.1.json b/schemas/context/profile-segmentation.example.1.json index 94ab341cbe..819a87a574 100644 --- a/schemas/context/profile-segmentation.example.1.json +++ b/schemas/context/profile-segmentation.example.1.json @@ -1,28 +1,26 @@ { - "xdm:segments": [ - { - "xdm:segmentID": { - "@id": "https://data.adobe.io/entities/segmentidentity/04a81716-43d6-4e7a-a49c-f1d8b3129ba9", - "xdm:namespace": { - "xdm:code": "AAM" - } + "xdm:segmentMembership": { + "AAM": { + "04a81716-43d6-4e7a-a49c-f1d8b3129ba9" : { + "xdm:version": "15", + "xdm:timestamp": "2018-04-26T15:52:25+00:00", + "xdm:validUntil": "2019-04-26T15:52:25+00:00", + "xdm:status": "existing" }, - "xdm:version": "15", - "xdm:timestamp": "2018-04-26T15:52:25+00:00", - "xdm:validUntil": "2019-04-26T15:52:25+00:00", - "xdm:status": "existing" + "53cba6b2-a23b-454a-8069-fc41308f1c0f" : { + "xdm:version": "3", + "xdm:lastQualificationTime": "2018-04-26T15:52:25+00:00", + "xdm:validUntil": "2018-04-27T15:52:25+00:00", + "xdm:status": "realized" + } }, - { - "xdm:segmentID": { - "@id": "https://data.adobe.io/entities/identity/53cba6b2-a23b-454a-8069-fc41308f1c0f", - "xdm:namespace": { - "xdm:code": "AAM" - } - }, - "xdm:version": "3", - "xdm:lastQualificationTime": "2018-04-26T15:52:25+00:00", - "xdm:validUntil": "2018-04-27T15:52:25+00:00", - "xdm:status": "realized" + "Email": { + "abcd@adobe.com" : { + "xdm:version": "1", + "xdm:lastQualificationTime": "2017-09-26T15:52:25+00:00", + "xdm:validUntil": "2017-12-26T15:52:25+00:00", + "xdm:status": "exited" + } } - ] + } } diff --git a/schemas/context/profile-segmentation.schema.json b/schemas/context/profile-segmentation.schema.json index 03c7eac4cb..55dcdce10b 100644 --- a/schemas/context/profile-segmentation.schema.json +++ b/schemas/context/profile-segmentation.schema.json @@ -18,10 +18,24 @@ "properties": { "xdm:segments":{ "title" : "Segment Membership", + "meta:status": "deprecated", "type" : "array", "items" : { "$ref" : "https://ns.adobe.com/xdm/context/segmentmembership" } + }, + "xdm:segmentMembership":{ + "title" : "Segment Membership Map", + "type" : "object", + "meta:xdmType": "map", + "additionalProperties" : { + "title": "Segment Membership per Namespace", + "type": "object", + "meta:xdmType": "map", + "additionalProperties" : { + "$ref" : "https://ns.adobe.com/xdm/context/segmentmembership" + } + } } } } diff --git a/schemas/context/profile.schema.json b/schemas/context/profile.schema.json index b72be5abc1..9b3fb4f368 100644 --- a/schemas/context/profile.schema.json +++ b/schemas/context/profile.schema.json @@ -14,7 +14,6 @@ "meta:abstract": true, "meta:extends": [ "https://ns.adobe.com/xdm/data/record", - "https://ns.adobe.com/xdm/common/auditable", "https://ns.adobe.com/xdm/context/identitymap" ], "description": diff --git a/schemas/context/segmentmembership.example.1.json b/schemas/context/segmentmembership.example.1.json index 9b1cf76ac6..d0b2ce8ed4 100644 --- a/schemas/context/segmentmembership.example.1.json +++ b/schemas/context/segmentmembership.example.1.json @@ -1,10 +1,4 @@ { - "xdm:segmentID": { - "@id": "https://data.adobe.io/entities/segmentIdentity/92312748749128", - "xdm:namespace": { - "xdm:code": "AAM" - } - }, "xdm:lastQualificationTime": "2017-09-26T15:52:25+00:00", "xdm:version": "1.0", "xdm:validUntil" : "2017-12-26T15:52:25+00:00", diff --git a/schemas/context/segmentmembership.schema.json b/schemas/context/segmentmembership.schema.json index db8d29c375..5c3fe45a56 100644 --- a/schemas/context/segmentmembership.schema.json +++ b/schemas/context/segmentmembership.schema.json @@ -15,8 +15,9 @@ "properties": { "xdm:segmentID": { "title": "Segment ID", + "meta:status": "deprecated", "$ref": "https://ns.adobe.com/xdm/context/segmentidentity", - "description": "The identity of the segment or snapshot definition in with the domain of the specific system that processes that type of segment." + "description": "The identity of the segment or snapshot definition in with the domain of the specific system that processes that type of segment. Deprecated." }, "xdm:version": { "title": "Version", @@ -88,6 +89,9 @@ "realized": "Entity is entering the segment", "exited": "Entity is exiting the segment" } + }, + "xdm:profileStitchID": { + "$ref": "https://ns.adobe.com/xdm/context/profileStitchIdentity" } } } diff --git a/schemas/data/record.schema.json b/schemas/data/record.schema.json index e18c6de889..ac2da290db 100644 --- a/schemas/data/record.schema.json +++ b/schemas/data/record.schema.json @@ -21,6 +21,14 @@ "type": "string", "format": "uri-reference", "description": "A unique identifier for the record." + }, + "xdm:timeSeriesEvents": { + "title": "Time-series Events", + "description": "List of time-series based events that relate to schemas based on record.", + "type": "array", + "items": { + "$ref": "https://ns.adobe.com/xdm/data/time-series" + } } } }