mcdev 8.2.1 → 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 (123) hide show
  1. package/.github/ISSUE_TEMPLATE/bug.yml +1 -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/DataExtensionField.js +21 -0
  63. package/lib/metadataTypes/DataFilter.js +653 -0
  64. package/lib/metadataTypes/DataFilterHidden.js +18 -0
  65. package/lib/metadataTypes/Filter.js +315 -1
  66. package/lib/metadataTypes/ImportFile.js +11 -1
  67. package/lib/metadataTypes/Journey.js +111 -7
  68. package/lib/metadataTypes/definitions/Automation.definition.js +1 -0
  69. package/lib/metadataTypes/definitions/DataFilter.definition.js +168 -0
  70. package/lib/metadataTypes/definitions/DataFilterHidden.definition.js +169 -0
  71. package/lib/metadataTypes/definitions/Filter.definition.js +136 -22
  72. package/lib/metadataTypes/definitions/Journey.definition.js +20 -1
  73. package/lib/util/devops.js +14 -4
  74. package/lib/util/util.js +7 -2
  75. package/lib/util/validations.js +7 -1
  76. package/package.json +10 -10
  77. package/test/general.test.js +17 -19
  78. package/test/mockRoot/.mcdevrc.json +4 -1
  79. package/test/mockRoot/deploy/testInstance/testBU/dataFilter/testExisting_dataFilter.dataFilter-meta.json +19 -0
  80. package/test/mockRoot/deploy/testInstance/testBU/dataFilter/testNew_dataFilter.dataFilter-meta.json +19 -0
  81. package/test/mockRoot/deploy/testInstance/testBU/filter/testExisting_filter.filter-meta.json +10 -0
  82. package/test/mockRoot/deploy/testInstance/testBU/filter/testNew_filter.filter-meta.json +11 -0
  83. package/test/mockRoot/deploy/testInstance/testBU/journey/testExisting_journey_updatecontact.journey-meta.json +108 -0
  84. package/test/resources/9999999/automation/v1/filters/a0f1a1bc-4ea1-44b3-8fe1-ce40ef35c1c0/patch-response.json +18 -0
  85. package/test/resources/9999999/automation/v1/filters/f018f237-f7ef-40b0-afc8-39ea2e5dcca4/delete-response.txt +0 -0
  86. package/test/resources/9999999/automation/v1/filters/f018f237-f7ef-40b0-afc8-39ea2e5dcca4/get-response.json +15 -0
  87. package/test/resources/9999999/automation/v1/filters/f018f237-f7ef-40b0-afc8-39ea2e5dcca4/patch-response.json +15 -0
  88. package/test/resources/9999999/automation/v1/filters/get-response.json +22 -0
  89. package/test/resources/9999999/dataFilter/build-expected.json +19 -0
  90. package/test/resources/9999999/dataFilter/get-expected.json +23 -0
  91. package/test/resources/9999999/dataFilter/patch-expected.json +20 -0
  92. package/test/resources/9999999/dataFilter/post-expected.json +20 -0
  93. package/test/resources/9999999/dataFilter/template-expected.json +19 -0
  94. 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
  95. package/test/resources/9999999/dataFolder/retrieve-ContentTypeINfilteractivity,hidden-response.xml +139 -0
  96. package/test/resources/9999999/dataFolder/retrieve-ContentTypeINfilterdefinition,hidden-response.xml +116 -0
  97. package/test/resources/9999999/email/v1/filters/filterdefinition/10ef27dd-4be8-4bf6-970a-8acf8e281e55/delete-response.txt +1 -0
  98. package/test/resources/9999999/email/v1/filters/filterdefinition/10ef27dd-4be8-4bf6-970a-8acf8e281e55/get-response.json +19 -0
  99. package/test/resources/9999999/email/v1/filters/filterdefinition/10ef27dd-4be8-4bf6-970a-8acf8e281e55/patch-response.json +15 -0
  100. package/test/resources/9999999/email/v1/filters/filterdefinition/category/5318/get-response.json +27 -0
  101. package/test/resources/9999999/email/v1/filters/filterdefinition/category/8502/get-response.json +7 -0
  102. package/test/resources/9999999/email/v1/filters/filterdefinition/category/8503/get-response.json +7 -0
  103. package/test/resources/9999999/email/v1/filters/filterdefinition/post-response.json +15 -0
  104. package/test/resources/9999999/filter/build-expected.json +10 -0
  105. package/test/resources/9999999/filter/get-expected.json +11 -0
  106. package/test/resources/9999999/filter/patch-expected.json +11 -0
  107. package/test/resources/9999999/filter/post-expected.json +11 -0
  108. package/test/resources/9999999/filter/template-expected.json +10 -0
  109. package/test/resources/9999999/filterActivity/create-response.xml +46 -0
  110. package/test/resources/9999999/filterActivity/retrieve-CustomerKey=testExisting_filter-response.xml +30 -0
  111. package/test/resources/9999999/filterDefinition/retrieve-CustomerKey=testExisting_dataFilter-response.xml +30 -0
  112. package/test/resources/9999999/interaction/v1/interactions/get-response.json +45 -3
  113. package/test/resources/9999999/interaction/v1/interactions/key_testExisting_journey_updatecontact/get-response.json +119 -0
  114. package/test/resources/9999999/interaction/v1/interactions/key_testExisting_journey_updatecontact/put-response.json +106 -0
  115. package/test/resources/9999999/journey/get-updatecontact-expected.json +108 -0
  116. package/test/resources/9999999/journey/put-updatecontact-expected.json +108 -0
  117. package/test/type.automation.test.js +14 -14
  118. package/test/type.dataFilter.test.js +174 -0
  119. package/test/type.filter.test.js +170 -0
  120. package/test/type.journey.test.js +59 -7
  121. package/test/type.query.test.js +2 -2
  122. package/test/utils.js +8 -0
  123. 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
  /**
@@ -457,7 +458,9 @@ const DevOps = {
457
458
  // remove potentially existing "description"-entry
458
459
  delete properties.marketList[sourceML].description;
459
460
 
460
- const sourceMarketBuArr = Object.keys(properties.marketList[sourceML]);
461
+ const sourceMarketBuArr = Object.keys(properties.marketList[sourceML]).filter(
462
+ (key) => key !== 'filter'
463
+ );
461
464
  if (sourceMarketBuArr.length !== 1) {
462
465
  throw new Error('Only 1 BU is allowed per source marketList');
463
466
  }
@@ -497,10 +500,16 @@ const DevOps = {
497
500
  for (const sourceMlName of sourceMarketListArr) {
498
501
  /** @type {string} */
499
502
  const targetMlName = sourceTargetMapping[sourceMlName];
503
+ const sourceMarketLists = properties.marketList[sourceMlName];
500
504
  /** @type {string} */
501
- 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 []
502
507
  /** @type {string} */
503
- 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];
504
513
  if ('string' !== typeof sourceMarket) {
505
514
  Util.logger.error(
506
515
  'Deployment Source market list needs to have a 1:1 BU-Market combo. Your value: ' +
@@ -567,7 +576,8 @@ const DevOps = {
567
576
  buTypeDelta[buFrom],
568
577
  [sourceMarket],
569
578
  [targetMlName],
570
- true
579
+ true,
580
+ sourceMarketLists.filter
571
581
  );
572
582
  }
573
583
  this._generateDeleteInstructions(delta, sourceMarket, properties, targetMlName);
package/lib/util/util.js CHANGED
@@ -146,7 +146,7 @@ export const Util = {
146
146
  // check if BUs in marketList are valid
147
147
  let buCounter = 0;
148
148
  for (const businessUnit in properties.marketList[mlName]) {
149
- if (businessUnit !== 'description') {
149
+ if (businessUnit !== 'description' && businessUnit !== 'filter') {
150
150
  buCounter++;
151
151
  Util.isValidBU(properties, businessUnit, true);
152
152
  if (!Util.isValidBU(properties, businessUnit, true)) {
@@ -1134,7 +1134,12 @@ export const Util = {
1134
1134
  String.raw`\$1`
1135
1135
  );
1136
1136
  // Replace % and _ with equivalent regex
1137
- search = search.replaceAll('%', '.*').replaceAll('_', '.');
1137
+ // Replace % with .*
1138
+ search = search.replaceAll('%', '.*');
1139
+ // Replace _ with . only if not surrounded by [ and ]
1140
+ search = search.replaceAll(/(?<!\[)_+(?!\])/g, (match) => '.'.repeat(match.length));
1141
+ // replace [_] with _
1142
+ search = search.replaceAll(String.raw`\[_\]`, '_');
1138
1143
  // Check matches
1139
1144
  return new RegExp('^' + search + '$', 'gi').test(testString);
1140
1145
  },