mcdev 8.2.0 → 8.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/.github/ISSUE_TEMPLATE/bug.yml +2 -0
  2. package/.github/workflows/code-test.yml +1 -1
  3. package/.github/workflows/coverage-base-update.yml +1 -1
  4. package/.github/workflows/coverage-develop-branch.yml +1 -1
  5. package/.github/workflows/coverage-main-branch.yml +1 -1
  6. package/.github/workflows/coverage.yml +1 -1
  7. package/.github/workflows/npm-publish.yml +9 -5
  8. package/@types/lib/MetadataTypeDefinitions.d.ts +4 -0
  9. package/@types/lib/MetadataTypeDefinitions.d.ts.map +1 -1
  10. package/@types/lib/MetadataTypeInfo.d.ts +4 -0
  11. package/@types/lib/MetadataTypeInfo.d.ts.map +1 -1
  12. package/@types/lib/Retriever.d.ts.map +1 -1
  13. package/@types/lib/index.d.ts +20 -9
  14. package/@types/lib/index.d.ts.map +1 -1
  15. package/@types/lib/metadataTypes/Asset.d.ts +3 -3
  16. package/@types/lib/metadataTypes/Asset.d.ts.map +1 -1
  17. package/@types/lib/metadataTypes/Automation.d.ts +7 -7
  18. package/@types/lib/metadataTypes/Automation.d.ts.map +1 -1
  19. package/@types/lib/metadataTypes/DataExtension.d.ts +9 -9
  20. package/@types/lib/metadataTypes/DataExtension.d.ts.map +1 -1
  21. package/@types/lib/metadataTypes/DataExtensionField.d.ts +7 -0
  22. package/@types/lib/metadataTypes/DataExtensionField.d.ts.map +1 -1
  23. package/@types/lib/metadataTypes/DataFilter.d.ts +326 -0
  24. package/@types/lib/metadataTypes/DataFilter.d.ts.map +1 -0
  25. package/@types/lib/metadataTypes/DataFilterHidden.d.ts +164 -0
  26. package/@types/lib/metadataTypes/DataFilterHidden.d.ts.map +1 -0
  27. package/@types/lib/metadataTypes/Filter.d.ts +181 -6
  28. package/@types/lib/metadataTypes/Filter.d.ts.map +1 -1
  29. package/@types/lib/metadataTypes/FilterDefinition.d.ts +318 -0
  30. package/@types/lib/metadataTypes/FilterDefinition.d.ts.map +1 -0
  31. package/@types/lib/metadataTypes/FilterDefinitionHidden.d.ts +156 -0
  32. package/@types/lib/metadataTypes/FilterDefinitionHidden.d.ts.map +1 -0
  33. package/@types/lib/metadataTypes/ImportFile.d.ts.map +1 -1
  34. package/@types/lib/metadataTypes/Journey.d.ts +18 -0
  35. package/@types/lib/metadataTypes/Journey.d.ts.map +1 -1
  36. package/@types/lib/metadataTypes/MobileKeyword.d.ts +2 -2
  37. package/@types/lib/metadataTypes/MobileKeyword.d.ts.map +1 -1
  38. package/@types/lib/metadataTypes/User.d.ts +1 -1
  39. package/@types/lib/metadataTypes/User.d.ts.map +1 -1
  40. package/@types/lib/metadataTypes/definitions/DataFilter.definition.d.ts +230 -0
  41. package/@types/lib/metadataTypes/definitions/DataFilter.definition.d.ts.map +1 -0
  42. package/@types/lib/metadataTypes/definitions/DataFilterHidden.definition.d.ts +230 -0
  43. package/@types/lib/metadataTypes/definitions/DataFilterHidden.definition.d.ts.map +1 -0
  44. package/@types/lib/metadataTypes/definitions/Filter.definition.d.ts +203 -31
  45. package/@types/lib/metadataTypes/definitions/FilterDefinition.definition.d.ts +218 -0
  46. package/@types/lib/metadataTypes/definitions/FilterDefinition.definition.d.ts.map +1 -0
  47. package/@types/lib/metadataTypes/definitions/FilterDefinitionHidden.definition.d.ts +218 -0
  48. package/@types/lib/metadataTypes/definitions/FilterDefinitionHidden.definition.d.ts.map +1 -0
  49. package/@types/lib/metadataTypes/definitions/Journey.definition.d.ts +18 -0
  50. package/@types/lib/util/devops.d.ts +1 -0
  51. package/@types/lib/util/devops.d.ts.map +1 -1
  52. package/@types/lib/util/replaceContentBlockReference.d.ts +3 -3
  53. package/@types/lib/util/replaceContentBlockReference.d.ts.map +1 -1
  54. package/@types/lib/util/util.d.ts.map +1 -1
  55. package/@types/lib/util/validations.d.ts.map +1 -1
  56. package/@types/types/mcdev.d.d.ts +296 -0
  57. package/@types/types/mcdev.d.d.ts.map +1 -1
  58. package/lib/MetadataTypeDefinitions.js +4 -0
  59. package/lib/MetadataTypeInfo.js +4 -0
  60. package/lib/Retriever.js +3 -0
  61. package/lib/index.js +87 -3
  62. package/lib/metadataTypes/Automation.js +3 -1
  63. package/lib/metadataTypes/DataExtension.js +19 -12
  64. package/lib/metadataTypes/DataExtensionField.js +25 -3
  65. package/lib/metadataTypes/DataFilter.js +653 -0
  66. package/lib/metadataTypes/DataFilterHidden.js +18 -0
  67. package/lib/metadataTypes/Filter.js +315 -1
  68. package/lib/metadataTypes/ImportFile.js +11 -1
  69. package/lib/metadataTypes/Journey.js +118 -7
  70. package/lib/metadataTypes/definitions/Automation.definition.js +1 -0
  71. package/lib/metadataTypes/definitions/DataFilter.definition.js +168 -0
  72. package/lib/metadataTypes/definitions/DataFilterHidden.definition.js +169 -0
  73. package/lib/metadataTypes/definitions/Filter.definition.js +136 -22
  74. package/lib/metadataTypes/definitions/Journey.definition.js +20 -1
  75. package/lib/util/devops.js +18 -5
  76. package/lib/util/util.js +7 -2
  77. package/lib/util/validations.js +7 -1
  78. package/package.json +10 -10
  79. package/test/general.test.js +17 -19
  80. package/test/mockRoot/.mcdevrc.json +4 -1
  81. package/test/mockRoot/deploy/testInstance/testBU/dataFilter/testExisting_dataFilter.dataFilter-meta.json +19 -0
  82. package/test/mockRoot/deploy/testInstance/testBU/dataFilter/testNew_dataFilter.dataFilter-meta.json +19 -0
  83. package/test/mockRoot/deploy/testInstance/testBU/filter/testExisting_filter.filter-meta.json +10 -0
  84. package/test/mockRoot/deploy/testInstance/testBU/filter/testNew_filter.filter-meta.json +11 -0
  85. package/test/mockRoot/deploy/testInstance/testBU/journey/testExisting_journey_updatecontact.journey-meta.json +108 -0
  86. package/test/resources/9999999/automation/v1/filters/a0f1a1bc-4ea1-44b3-8fe1-ce40ef35c1c0/patch-response.json +18 -0
  87. package/test/resources/9999999/automation/v1/filters/f018f237-f7ef-40b0-afc8-39ea2e5dcca4/delete-response.txt +0 -0
  88. package/test/resources/9999999/automation/v1/filters/f018f237-f7ef-40b0-afc8-39ea2e5dcca4/get-response.json +15 -0
  89. package/test/resources/9999999/automation/v1/filters/f018f237-f7ef-40b0-afc8-39ea2e5dcca4/patch-response.json +15 -0
  90. package/test/resources/9999999/automation/v1/filters/get-response.json +22 -0
  91. package/test/resources/9999999/dataFilter/build-expected.json +19 -0
  92. package/test/resources/9999999/dataFilter/get-expected.json +23 -0
  93. package/test/resources/9999999/dataFilter/patch-expected.json +20 -0
  94. package/test/resources/9999999/dataFilter/post-expected.json +20 -0
  95. package/test/resources/9999999/dataFilter/template-expected.json +19 -0
  96. package/test/resources/9999999/dataFolder/retrieve-ContentTypeINasset,asset-sha,automatio,cloudpage,dataexten,filteract,filterdef,hidden,journey,list,mysubs,publicati,queryacti,salesforc,shared_da,shared_da,shared_sa,ssjsactiv,synchroni,useriniti-response.xml +765 -0
  97. package/test/resources/9999999/dataFolder/retrieve-ContentTypeINfilteractivity,hidden-response.xml +139 -0
  98. package/test/resources/9999999/dataFolder/retrieve-ContentTypeINfilterdefinition,hidden-response.xml +116 -0
  99. package/test/resources/9999999/email/v1/filters/filterdefinition/10ef27dd-4be8-4bf6-970a-8acf8e281e55/delete-response.txt +1 -0
  100. package/test/resources/9999999/email/v1/filters/filterdefinition/10ef27dd-4be8-4bf6-970a-8acf8e281e55/get-response.json +19 -0
  101. package/test/resources/9999999/email/v1/filters/filterdefinition/10ef27dd-4be8-4bf6-970a-8acf8e281e55/patch-response.json +15 -0
  102. package/test/resources/9999999/email/v1/filters/filterdefinition/category/5318/get-response.json +27 -0
  103. package/test/resources/9999999/email/v1/filters/filterdefinition/category/8502/get-response.json +7 -0
  104. package/test/resources/9999999/email/v1/filters/filterdefinition/category/8503/get-response.json +7 -0
  105. package/test/resources/9999999/email/v1/filters/filterdefinition/post-response.json +15 -0
  106. package/test/resources/9999999/filter/build-expected.json +10 -0
  107. package/test/resources/9999999/filter/get-expected.json +11 -0
  108. package/test/resources/9999999/filter/patch-expected.json +11 -0
  109. package/test/resources/9999999/filter/post-expected.json +11 -0
  110. package/test/resources/9999999/filter/template-expected.json +10 -0
  111. package/test/resources/9999999/filterActivity/create-response.xml +46 -0
  112. package/test/resources/9999999/filterActivity/retrieve-CustomerKey=testExisting_filter-response.xml +30 -0
  113. package/test/resources/9999999/filterDefinition/retrieve-CustomerKey=testExisting_dataFilter-response.xml +30 -0
  114. package/test/resources/9999999/interaction/v1/interactions/get-response.json +45 -3
  115. package/test/resources/9999999/interaction/v1/interactions/key_testExisting_journey_Multistep/put-response.json +1 -1
  116. package/test/resources/9999999/interaction/v1/interactions/key_testExisting_journey_updatecontact/get-response.json +119 -0
  117. package/test/resources/9999999/interaction/v1/interactions/key_testExisting_journey_updatecontact/put-response.json +106 -0
  118. package/test/resources/9999999/interaction/v1/interactions/key_testExisting_temail/put-response-paused.json +1 -1
  119. package/test/resources/9999999/interaction/v1/interactions/key_testExisting_temail/put-response.json +1 -1
  120. package/test/resources/9999999/interaction/v1/interactions/key_testExisting_temail_notPublished/put-response.json +1 -1
  121. package/test/resources/9999999/journey/get-updatecontact-expected.json +108 -0
  122. package/test/resources/9999999/journey/put-updatecontact-expected.json +108 -0
  123. package/test/type.automation.test.js +14 -14
  124. package/test/type.dataFilter.test.js +174 -0
  125. package/test/type.filter.test.js +170 -0
  126. package/test/type.journey.test.js +59 -7
  127. package/test/type.query.test.js +2 -2
  128. package/test/utils.js +8 -0
  129. package/types/mcdev.d.js +101 -0
@@ -0,0 +1,168 @@
1
+ export default {
2
+ bodyIteratorField: 'items',
3
+ dependencies: ['folder-filterdefinition', 'folder-hidden', 'dataExtension'],
4
+ dependencyGraph: {
5
+ dataExtension: ['r__source_dataExtension_key'],
6
+ },
7
+ filter: {},
8
+ hasExtended: false,
9
+ idField: 'id',
10
+ keyIsFixed: false,
11
+ keyField: 'key',
12
+ nameField: 'name',
13
+ folderType: 'filterdefinition',
14
+ folderIdField: 'categoryId',
15
+ createdDateField: 'createdDate',
16
+ createdNameField: 'createdBy',
17
+ lastmodDateField: 'lastUpdated',
18
+ lastmodNameField: 'lastUpdatedBy',
19
+ restPagination: true,
20
+ restPageSize: 100,
21
+ maxKeyLength: 36, // confirmed max length
22
+ type: 'dataFilter',
23
+ soapType: 'FilterDefinition',
24
+ typeDescription: 'Defines an audience based on specified rules. Used by Filter Activities.',
25
+ typeRetrieveByDefault: true,
26
+ typeName: 'Data Filter',
27
+ fields: {
28
+ // the GUI seems to ONLY send fields during update that are actually changed. It has yet to be tested if that also works with sending other fiedls as well
29
+ id: {
30
+ isCreateable: false,
31
+ isUpdateable: false, // included in URL
32
+ retrieving: false,
33
+ template: false,
34
+ },
35
+ key: {
36
+ isCreateable: true,
37
+ isUpdateable: true, // can be updated
38
+ retrieving: true,
39
+ template: true,
40
+ },
41
+ createdDate: {
42
+ isCreateable: false,
43
+ isUpdateable: false,
44
+ retrieving: true,
45
+ template: false,
46
+ },
47
+ createdBy: {
48
+ isCreateable: false,
49
+ isUpdateable: false,
50
+ retrieving: false,
51
+ template: false,
52
+ },
53
+ owner: {
54
+ // equal to createdBy
55
+ isCreateable: false,
56
+ isUpdateable: false,
57
+ retrieving: false,
58
+ template: false,
59
+ },
60
+ createdByName: {
61
+ // actual name of user indicated by id in createdBy
62
+ isCreateable: false,
63
+ isUpdateable: false,
64
+ retrieving: true,
65
+ template: false,
66
+ },
67
+ lastUpdated: {
68
+ isCreateable: false,
69
+ isUpdateable: false,
70
+ retrieving: true,
71
+ template: false,
72
+ },
73
+ lastUpdatedBy: {
74
+ isCreateable: false,
75
+ isUpdateable: false,
76
+ retrieving: false,
77
+ template: false,
78
+ },
79
+ lastUpdatedByName: {
80
+ // actual name of user indicated by id in lastUpdatedBy
81
+ isCreateable: false,
82
+ isUpdateable: false,
83
+ retrieving: true,
84
+ template: false,
85
+ },
86
+ name: {
87
+ isCreateable: true,
88
+ isUpdateable: true, // can be updated
89
+ retrieving: true,
90
+ template: true,
91
+ },
92
+ categoryId: {
93
+ // returned by GET / CREATE / UPDATE; used in CREATE payload
94
+ isCreateable: true,
95
+ isUpdateable: true, // can be updated
96
+ retrieving: true,
97
+ template: true,
98
+ },
99
+ description: {
100
+ isCreateable: true,
101
+ isUpdateable: true, // can be updated
102
+ retrieving: true,
103
+ template: true,
104
+ },
105
+ filterDefinitionXml: {
106
+ isCreateable: true,
107
+ isUpdateable: true, // this is the only field that can be updated
108
+ retrieving: true,
109
+ template: true,
110
+ },
111
+ // DerivedFromType: {
112
+ // // this upper-cased spelling is used by GUI when creating a dataExtension based filterDefintion
113
+ // isCreateable: true,
114
+ // isUpdateable: false, // cannot be updated
115
+ // retrieving: false,
116
+ // template: false,
117
+ // },
118
+ derivedFromType: {
119
+ // 1: SubscriberAttributes, 2: DataExtension, 6: EntryCriteria;
120
+ isCreateable: true,
121
+ isUpdateable: false, // cannot be updated
122
+ retrieving: true,
123
+ template: true,
124
+ },
125
+ derivedFromObjectId: {
126
+ // dataExtension ID or '00000000-0000-0000-0000-000000000000' for lists
127
+ isCreateable: true,
128
+ isUpdateable: false, // cannot be updated
129
+ retrieving: true,
130
+ template: true,
131
+ },
132
+ derivedFromObjectTypeName: {
133
+ // "SubscriberAttributes" | "DataExtension" | "EntryCriteria" ...; only returned by GET API
134
+ isCreateable: false,
135
+ isUpdateable: false, // cannot be updated
136
+ retrieving: true,
137
+ template: true,
138
+ },
139
+ derivedFromObjectName: {
140
+ // dataExtension name; field only returned by GET-API
141
+ isCreateable: false,
142
+ isUpdateable: false, // cannot be updated
143
+ retrieving: true,
144
+ template: true,
145
+ },
146
+ isSendable: {
147
+ isCreateable: false, // automatically set during create
148
+ isUpdateable: false, // cannot be updated
149
+ retrieving: true,
150
+ template: true,
151
+ },
152
+ r__source_dataExtension_key: {
153
+ isCreateable: false,
154
+ isUpdateable: false,
155
+ retrieving: true,
156
+ template: true,
157
+ },
158
+ c__filterDefinition: {
159
+ skipValidation: true,
160
+ },
161
+ r__folder_Path: {
162
+ isCreateable: false,
163
+ isUpdateable: false,
164
+ retrieving: true,
165
+ template: true,
166
+ },
167
+ },
168
+ };
@@ -0,0 +1,169 @@
1
+ export default {
2
+ bodyIteratorField: 'items',
3
+ dependencies: ['folder-filterdefinition', 'folder-hidden', 'dataExtension'],
4
+ dependencyGraph: {
5
+ dataExtension: ['r__source_dataExtension_key'],
6
+ },
7
+ filter: {},
8
+ hasExtended: false,
9
+ idField: 'id',
10
+ keyIsFixed: false,
11
+ keyField: 'key',
12
+ nameField: 'name',
13
+ folderType: 'filterdefinition',
14
+ folderIdField: 'categoryId',
15
+ createdDateField: 'createdDate',
16
+ createdNameField: 'createdBy',
17
+ lastmodDateField: 'lastUpdated',
18
+ lastmodNameField: 'lastUpdatedBy',
19
+ restPagination: true,
20
+ restPageSize: 100,
21
+ maxKeyLength: 36, // confirmed max length
22
+ type: 'dataFilterHidden',
23
+ soapType: 'FilterDefinition',
24
+ typeDescription:
25
+ 'Defines an audience based on specified rules. Auto-generated by filtered DEs and filtered Lists.',
26
+ typeRetrieveByDefault: false,
27
+ typeName: 'Data Filter (auto-generated)',
28
+ fields: {
29
+ // the GUI seems to ONLY send fields during update that are actually changed. It has yet to be tested if that also works with sending other fiedls as well
30
+ id: {
31
+ isCreateable: false,
32
+ isUpdateable: false, // included in URL
33
+ retrieving: false,
34
+ template: false,
35
+ },
36
+ key: {
37
+ isCreateable: true,
38
+ isUpdateable: true, // can be updated
39
+ retrieving: true,
40
+ template: true,
41
+ },
42
+ createdDate: {
43
+ isCreateable: false,
44
+ isUpdateable: false,
45
+ retrieving: true,
46
+ template: false,
47
+ },
48
+ createdBy: {
49
+ isCreateable: false,
50
+ isUpdateable: false,
51
+ retrieving: false,
52
+ template: false,
53
+ },
54
+ owner: {
55
+ // equal to createdBy
56
+ isCreateable: false,
57
+ isUpdateable: false,
58
+ retrieving: false,
59
+ template: false,
60
+ },
61
+ createdByName: {
62
+ // actual name of user indicated by id in createdBy
63
+ isCreateable: false,
64
+ isUpdateable: false,
65
+ retrieving: true,
66
+ template: false,
67
+ },
68
+ lastUpdated: {
69
+ isCreateable: false,
70
+ isUpdateable: false,
71
+ retrieving: true,
72
+ template: false,
73
+ },
74
+ lastUpdatedBy: {
75
+ isCreateable: false,
76
+ isUpdateable: false,
77
+ retrieving: false,
78
+ template: false,
79
+ },
80
+ lastUpdatedByName: {
81
+ // actual name of user indicated by id in lastUpdatedBy
82
+ isCreateable: false,
83
+ isUpdateable: false,
84
+ retrieving: true,
85
+ template: false,
86
+ },
87
+ name: {
88
+ isCreateable: true,
89
+ isUpdateable: true, // can be updated
90
+ retrieving: true,
91
+ template: true,
92
+ },
93
+ categoryId: {
94
+ // returned by GET / CREATE / UPDATE; used in CREATE payload
95
+ isCreateable: true,
96
+ isUpdateable: true, // can be updated
97
+ retrieving: true,
98
+ template: true,
99
+ },
100
+ description: {
101
+ isCreateable: true,
102
+ isUpdateable: true, // can be updated
103
+ retrieving: true,
104
+ template: true,
105
+ },
106
+ filterDefinitionXml: {
107
+ isCreateable: true,
108
+ isUpdateable: true, // this is the only field that can be updated
109
+ retrieving: true,
110
+ template: true,
111
+ },
112
+ // DerivedFromType: {
113
+ // // this upper-cased spelling is used by GUI when creating a dataExtension based filterDefintion
114
+ // isCreateable: true,
115
+ // isUpdateable: false, // cannot be updated
116
+ // retrieving: false,
117
+ // template: false,
118
+ // },
119
+ derivedFromType: {
120
+ // 1: SubscriberAttributes, 2: DataExtension, 6: EntryCriteria;
121
+ isCreateable: true,
122
+ isUpdateable: false, // cannot be updated
123
+ retrieving: true,
124
+ template: true,
125
+ },
126
+ derivedFromObjectId: {
127
+ // dataExtension ID or '00000000-0000-0000-0000-000000000000' for lists
128
+ isCreateable: true,
129
+ isUpdateable: false, // cannot be updated
130
+ retrieving: true,
131
+ template: true,
132
+ },
133
+ derivedFromObjectTypeName: {
134
+ // "SubscriberAttributes" | "DataExtension" | "EntryCriteria" ...; only returned by GET API
135
+ isCreateable: false,
136
+ isUpdateable: false, // cannot be updated
137
+ retrieving: true,
138
+ template: true,
139
+ },
140
+ derivedFromObjectName: {
141
+ // dataExtension name; field only returned by GET-API
142
+ isCreateable: false,
143
+ isUpdateable: false, // cannot be updated
144
+ retrieving: true,
145
+ template: true,
146
+ },
147
+ isSendable: {
148
+ isCreateable: false, // automatically set during create
149
+ isUpdateable: false, // cannot be updated
150
+ retrieving: true,
151
+ template: true,
152
+ },
153
+ r__source_dataExtension_key: {
154
+ isCreateable: false,
155
+ isUpdateable: false,
156
+ retrieving: true,
157
+ template: true,
158
+ },
159
+ c__filterDefinition: {
160
+ skipValidation: true,
161
+ },
162
+ r__folder_Path: {
163
+ isCreateable: false,
164
+ isUpdateable: false,
165
+ retrieving: true,
166
+ template: true,
167
+ },
168
+ },
169
+ };
@@ -1,12 +1,27 @@
1
1
  export default {
2
2
  bodyIteratorField: 'items',
3
- dependencies: [],
4
- dependencyGraph: null,
3
+ dependencies: [
4
+ 'dataFilter',
5
+ 'dataFilterHidden',
6
+ 'list',
7
+ 'dataExtension',
8
+ 'folder-filteractivity',
9
+ 'folder-hidden',
10
+ ],
11
+ dependencyGraph: {
12
+ filterDefinition: ['r__dataFilter_key'],
13
+ dataExtension: ['r__source_dataExtension_key', 'r__destination_dataExtension_key'],
14
+ },
5
15
  hasExtended: false,
6
- idField: 'id',
7
- keyIsFixed: false,
16
+ idField: 'filterActivityId',
17
+ keyIsFixed: true,
8
18
  keyField: 'customerKey',
9
19
  nameField: 'name',
20
+ folderType: 'filteractivity',
21
+ folderIdField: 'categoryId',
22
+ filter: {
23
+ statusId: 0, // exclude deleted filters
24
+ },
10
25
  createdDateField: 'createdDate',
11
26
  createdNameField: null,
12
27
  lastmodDateField: 'modifiedDate',
@@ -14,57 +29,90 @@ export default {
14
29
  restPagination: true,
15
30
  maxKeyLength: 36, // confirmed max length
16
31
  type: 'filter',
32
+ soapType: 'FilterActivity',
17
33
  typeDescription:
18
- 'BETA: Part of how filtered Data Extensions are created. Depends on type "FilterDefinitions".',
19
- typeRetrieveByDefault: false,
34
+ 'Used in automations to filter lists and DEs. Depends on type "FilterDefinitions".',
35
+ typeRetrieveByDefault: true,
20
36
  typeCdpByDefault: true,
21
37
  typeName: 'Automation: Filter Activity',
22
38
  fields: {
39
+ // https://developer.salesforce.com/docs/atlas.en-us.noversion.mc-apis.meta/mc-apis/filteractivity.htm
23
40
  categoryId: {
24
41
  isCreateable: false,
25
- isUpdateable: false,
42
+ isUpdateable: true,
26
43
  retrieving: true,
27
- template: false,
44
+ template: true,
28
45
  },
29
46
  createdDate: {
30
47
  isCreateable: false,
31
48
  isUpdateable: false,
32
- retrieving: true,
49
+ retrieving: false,
33
50
  template: false,
34
51
  },
35
52
  customerKey: {
36
- isCreateable: null,
37
- isUpdateable: false,
53
+ isCreateable: false,
54
+ isUpdateable: true,
38
55
  retrieving: true,
56
+ template: true,
57
+ },
58
+ CustomerKey: {
59
+ isCreateable: true,
60
+ isUpdateable: false,
61
+ retrieving: false,
39
62
  template: false,
40
63
  },
41
64
  description: {
42
65
  isCreateable: false,
43
- isUpdateable: false,
66
+ isUpdateable: true,
44
67
  retrieving: true,
68
+ template: true,
69
+ },
70
+ Description: {
71
+ isCreateable: true,
72
+ isUpdateable: false,
73
+ retrieving: false,
45
74
  template: false,
46
75
  },
47
76
  destinationObjectId: {
48
77
  isCreateable: false,
49
- isUpdateable: false,
78
+ isUpdateable: true,
50
79
  retrieving: true,
80
+ template: true,
81
+ },
82
+ DestinationObjectID: {
83
+ isCreateable: true,
84
+ isUpdateable: false,
85
+ retrieving: false,
51
86
  template: false,
52
87
  },
53
88
  destinationTypeId: {
54
89
  isCreateable: false,
55
- isUpdateable: false,
90
+ isUpdateable: true,
56
91
  retrieving: true,
92
+ template: true,
93
+ },
94
+ DestinationTypeID: {
95
+ isCreateable: true,
96
+ isUpdateable: false,
97
+ retrieving: false,
57
98
  template: false,
58
99
  },
59
100
  filterActivityId: {
60
- isCreateable: null,
61
- isUpdateable: null,
62
- retrieving: true,
101
+ isCreateable: false,
102
+ isUpdateable: true,
103
+ retrieving: false,
104
+ template: false,
63
105
  },
64
106
  filterDefinitionId: {
65
107
  isCreateable: false,
66
- isUpdateable: false,
108
+ isUpdateable: true,
67
109
  retrieving: true,
110
+ template: true,
111
+ },
112
+ FilterDefinitionID: {
113
+ isCreateable: true,
114
+ isUpdateable: false,
115
+ retrieving: false,
68
116
  template: false,
69
117
  },
70
118
  modifiedDate: {
@@ -74,28 +122,94 @@ export default {
74
122
  template: false,
75
123
  },
76
124
  name: {
77
- isCreateable: null,
78
- isUpdateable: false,
125
+ isCreateable: false,
126
+ isUpdateable: true,
79
127
  retrieving: true,
128
+ template: true,
129
+ },
130
+ Name: {
131
+ isCreateable: true,
132
+ isUpdateable: false,
133
+ retrieving: false,
80
134
  template: false,
81
135
  },
82
136
  sourceObjectId: {
83
137
  isCreateable: false,
84
- isUpdateable: false,
138
+ isUpdateable: true,
85
139
  retrieving: true,
140
+ template: true,
141
+ },
142
+ SourceObjectID: {
143
+ isCreateable: true,
144
+ isUpdateable: false,
145
+ retrieving: false,
86
146
  template: false,
87
147
  },
88
148
  sourceTypeId: {
89
149
  isCreateable: false,
90
150
  isUpdateable: false,
91
151
  retrieving: true,
152
+ template: true,
153
+ },
154
+ SourceTypeID: {
155
+ isCreateable: true,
156
+ isUpdateable: false,
157
+ retrieving: false,
158
+ template: false,
159
+ },
160
+ filterDefinitionSourceTypeId: {
161
+ isCreateable: false,
162
+ isUpdateable: true,
163
+ retrieving: false,
92
164
  template: false,
93
165
  },
94
166
  statusId: {
95
167
  isCreateable: false,
96
- isUpdateable: false,
168
+ isUpdateable: true,
97
169
  retrieving: true,
170
+ template: true,
171
+ },
172
+ resultDEName: {
173
+ isCreateable: false,
174
+ isUpdateable: true,
175
+ retrieving: false,
98
176
  template: false,
99
177
  },
178
+ resultDEKey: {
179
+ isCreateable: false,
180
+ isUpdateable: true,
181
+ retrieving: false,
182
+ template: false,
183
+ },
184
+ resultDEDescription: {
185
+ isCreateable: false,
186
+ isUpdateable: true,
187
+ retrieving: false,
188
+ template: false,
189
+ },
190
+ r__folder_Path: {
191
+ isCreateable: false,
192
+ isUpdateable: false,
193
+ retrieving: true,
194
+ template: true,
195
+ },
196
+ r__dataFilter_key: {
197
+ isCreateable: false,
198
+ isUpdateable: false,
199
+ retrieving: true,
200
+ template: true,
201
+ },
202
+ r__source_dataExtension_key: {
203
+ isCreateable: false,
204
+ isUpdateable: false,
205
+ retrieving: true,
206
+ template: true,
207
+ },
208
+ r__destination_dataExtension_key: {
209
+ isCreateable: false,
210
+ isUpdateable: false,
211
+ retrieving: true,
212
+ template: true,
213
+ },
100
214
  },
101
215
  };
@@ -8,7 +8,7 @@ export default {
8
8
  dependencies: [
9
9
  'folder-journey',
10
10
  'triggeredSend', // for EMAILV2-activity
11
- 'dataExtension', // for transactionalEmails: EMAILV2-activity
11
+ 'dataExtension', // for transactionalEmails: EMAILV2-activity and for UPDATECONTACTDATA activity
12
12
  'deliveryProfile',
13
13
  'event', // for Multistep and Quicksend journeys
14
14
  'mobileMessage', // for SMSSYNC-activity
@@ -27,6 +27,7 @@ export default {
27
27
  dataExtension: [
28
28
  'activities.metaData.highThroughput.r__dataExtension_key',
29
29
  'activities.configurationArguments.triggeredSend.r__dataExtension_key.domainExclusions',
30
+ 'activities.arguments.activityData.updateContactFields.r__dataExtension_key',
30
31
  ],
31
32
  deliveryProfile: ['activities.configurationArguments.triggeredSend.r__deliveryProfile_key'],
32
33
  list: [
@@ -716,6 +717,24 @@ export default {
716
717
  'activities[].schema': {
717
718
  skipValidation: true,
718
719
  },
720
+ 'activities[].arguments.activityData.updateContactFields[].r__dataExtension_key': {
721
+ isCreateable: false,
722
+ isUpdateable: false,
723
+ retrieving: true,
724
+ template: true,
725
+ },
726
+ 'activities[].arguments.activityData.updateContactFields[].r__dataExtensionField_name': {
727
+ isCreateable: false,
728
+ isUpdateable: false,
729
+ retrieving: true,
730
+ template: true,
731
+ },
732
+ 'activities[].arguments.activityData.updateContactFields[].field': {
733
+ isCreateable: true,
734
+ isUpdateable: true,
735
+ retrieving: true,
736
+ template: true,
737
+ },
719
738
  categoryId: {
720
739
  isCreateable: true,
721
740
  isUpdateable: true,
@@ -30,6 +30,7 @@ import cliProgress from 'cli-progress';
30
30
  * @typedef {import('../../types/mcdev.d.js').SoapRequestParams} SoapRequestParams
31
31
  * @typedef {import('../../types/mcdev.d.js').TemplateMap} TemplateMap
32
32
  * @typedef {import('../../types/mcdev.d.js').TypeKeyCombo} TypeKeyCombo
33
+ * @typedef {import('../../types/mcdev.d.js').BuildFilter} BuildFilter
33
34
  */
34
35
 
35
36
  /**
@@ -193,7 +194,6 @@ const DevOps = {
193
194
  } else {
194
195
  // find the key in paths like:
195
196
  // - retrieve/cred/bu/asset/block/016aecc7-7063-4b78-93f4-aa119ea933c7.asset-block-meta.html
196
- // - retrieve/cred/bu/asset/message/003c1ef5-f538-473a-91da-26942024a64a/blocks/views.html.slots.[bottom-8frq7iw2k99].asset-message-meta.html
197
197
  // - retrieve/cred/bu/query/03efd5f1-ba1f-487a-9c9a-36aeb2ae5192.query-meta.sql
198
198
  // assets have an additional folder level for their subtype
199
199
  // keys could contain dots themselves
@@ -202,6 +202,10 @@ const DevOps = {
202
202
  [file.type === 'asset' ? 5 : 4].split('.')
203
203
  .slice(0, -2)
204
204
  .join('.');
205
+ if (file.type === 'asset' && !file.externalKey) {
206
+ // retrieve/cred/bu/asset/message/emailkey/blocks/views.html.slots.[8maw2k7jnlb-5llcajmxaqa].asset-message-meta.html
207
+ file.externalKey = file.file.split('/')[5];
208
+ }
205
209
  file.name = null;
206
210
  }
207
211
 
@@ -454,7 +458,9 @@ const DevOps = {
454
458
  // remove potentially existing "description"-entry
455
459
  delete properties.marketList[sourceML].description;
456
460
 
457
- const sourceMarketBuArr = Object.keys(properties.marketList[sourceML]);
461
+ const sourceMarketBuArr = Object.keys(properties.marketList[sourceML]).filter(
462
+ (key) => key !== 'filter'
463
+ );
458
464
  if (sourceMarketBuArr.length !== 1) {
459
465
  throw new Error('Only 1 BU is allowed per source marketList');
460
466
  }
@@ -494,10 +500,16 @@ const DevOps = {
494
500
  for (const sourceMlName of sourceMarketListArr) {
495
501
  /** @type {string} */
496
502
  const targetMlName = sourceTargetMapping[sourceMlName];
503
+ const sourceMarketLists = properties.marketList[sourceMlName];
497
504
  /** @type {string} */
498
- const sourceBU = Object.keys(properties.marketList[sourceMlName])[0];
505
+ const sourceBU = Object.keys(sourceMarketLists).find((key) => key !== 'filter');
506
+ // accept ["oneMarket"] or "oneMarket" for sourceMarket, but not ["oneMarket","secondMarket"] or []
499
507
  /** @type {string} */
500
- const sourceMarket = Object.values(properties.marketList[sourceMlName])[0];
508
+ const sourceMarket =
509
+ Array.isArray(sourceMarketLists[sourceBU]) &&
510
+ sourceMarketLists[sourceBU].length === 1
511
+ ? sourceMarketLists[sourceBU][0]
512
+ : sourceMarketLists[sourceBU];
501
513
  if ('string' !== typeof sourceMarket) {
502
514
  Util.logger.error(
503
515
  'Deployment Source market list needs to have a 1:1 BU-Market combo. Your value: ' +
@@ -564,7 +576,8 @@ const DevOps = {
564
576
  buTypeDelta[buFrom],
565
577
  [sourceMarket],
566
578
  [targetMlName],
567
- true
579
+ true,
580
+ sourceMarketLists.filter
568
581
  );
569
582
  }
570
583
  this._generateDeleteInstructions(delta, sourceMarket, properties, targetMlName);