xml-disassembler 1.2.1 → 1.2.3

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.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,15 @@
1
+ ## [1.2.3](https://github.com/mcarvin8/xml-disassembler/compare/v1.2.2...v1.2.3) (2024-03-31)
2
+
3
+ ### Bug Fixes
4
+
5
+ - preserve any attribute in the root element header ([2926e59](https://github.com/mcarvin8/xml-disassembler/commit/2926e59ac2b55f7e2287ba55c1cc2280f3a92d8c))
6
+
7
+ ## [1.2.2](https://github.com/mcarvin8/xml-disassembler/compare/v1.2.1...v1.2.2) (2024-03-30)
8
+
9
+ ### Bug Fixes
10
+
11
+ - set XML validator flag to true when parsing XMLs ([9682cbe](https://github.com/mcarvin8/xml-disassembler/commit/9682cbe7e431a17a5ce877d99b233fc4b42d634e))
12
+
1
13
  ## [1.2.1](https://github.com/mcarvin8/xml-disassembler/compare/v1.2.0...v1.2.1) (2024-03-28)
2
14
 
3
15
  ### Bug Fixes
package/CONTRIBUTING.md CHANGED
@@ -20,7 +20,7 @@ git clone git@github.com:mcarvin8/xml-disassembler.git
20
20
  2. Install dependencies
21
21
 
22
22
  ```
23
- pnpm
23
+ pnpm install
24
24
  ```
25
25
 
26
26
  ## Branching
package/README.md CHANGED
@@ -159,13 +159,35 @@ The XML parser, which uses the `fast-xml-parser` package, is configured to retai
159
159
 
160
160
  ## Logging
161
161
 
162
- By default, the package will not print any debugging statements to the console.
162
+ By default, the package will not print any debugging statements to the console. Any error or debugging statements will be added to a log file, `disassemble.log`, created in the same directory you are running this package in. This file will be created when running the package in all cases, even if there are no errors.
163
163
 
164
- To configure logging, import the `setLogLevel` function from the package and run the function with `debug` to print debugging statements to a log file.
164
+ **NOTE**: The logging package used, `log4js`, requires `fs-extra` to be installed in your project as a dependency (`npm install --save fs-extra`).
165
165
 
166
- The log file (`disassemble.log`) will be created when running the package in all cases, even when the `setLogLevel` is not explicity called as shown below. The file will be created but empty by default when running the `ReassembleXMLFileHandler` and `DisassembleXMLFileHandler` classes.
166
+ The logger's default state is to only log errors to `disassemble.log`. Check this file for ERROR statements that will look like:
167
167
 
168
- **NOTE**: The logging package used, `log4js`, requires `fs-extra` to be installed in your project as a dependency (`npm install --save fs-extra`).
168
+ ```
169
+ [2024-03-30T14:28:37.950] [ERROR] default - The XML file HR_Admin.no-nested-elements.xml only has leaf elements. This file will not be disassembled.
170
+ ```
171
+
172
+ To add additional debugging statements to the log file, import the `setLogLevel` function from the package and run the function with `debug` to print all debugging statements to a log file.
173
+
174
+ When the log level is set to `debug`, the log file will contain statements like this to indicate which files were processed for disassembly and reassembly:
175
+
176
+ ```
177
+ [2024-03-30T14:28:37.926] [DEBUG] default - Parsing directory to reassemble: mock/no-namespace/HR_Admin
178
+ [2024-03-30T14:28:37.936] [DEBUG] default - Created reassembled file: mock\no-namespace\HR_Admin.permissionset-meta.xml
179
+
180
+ [2024-03-30T14:28:37.951] [DEBUG] default - Parsing file to disassemble: mock\no-nested-elements\HR_Admin.permissionset-meta.xml
181
+ [2024-03-30T14:28:37.953] [DEBUG] default - Created disassembled file: mock\no-nested-elements\HR_Admin\applicationVisibilities\5593cf61.applicationVisibilities-meta.xml
182
+ [2024-03-30T14:28:37.954] [DEBUG] default - Created disassembled file: mock\no-nested-elements\HR_Admin\classAccesses\2e5749c9.classAccesses-meta.xml
183
+ [2024-03-30T14:28:37.955] [DEBUG] default - Created disassembled file: mock\no-nested-elements\HR_Admin\fieldPermissions\16129a47.fieldPermissions-meta.xml
184
+ [2024-03-30T14:28:37.956] [DEBUG] default - Created disassembled file: mock\no-nested-elements\HR_Admin\objectPermissions\81268af4.objectPermissions-meta.xml
185
+ [2024-03-30T14:28:37.956] [DEBUG] default - Created disassembled file: mock\no-nested-elements\HR_Admin\pageAccesses\d6d8105a.pageAccesses-meta.xml
186
+ [2024-03-30T14:28:37.957] [DEBUG] default - Created disassembled file: mock\no-nested-elements\HR_Admin\recordTypeVisibilities\077548e3.recordTypeVisibilities-meta.xml
187
+ [2024-03-30T14:28:37.957] [DEBUG] default - Created disassembled file: mock\no-nested-elements\HR_Admin\tabSettings\181e6985.tabSettings-meta.xml
188
+ [2024-03-30T14:28:37.958] [DEBUG] default - Created disassembled file: mock\no-nested-elements\HR_Admin\userPermissions\0288499e.userPermissions-meta.xml
189
+ [2024-03-30T14:28:37.959] [DEBUG] default - Created disassembled file: mock\no-nested-elements\HR_Admin\HR_Admin.permissionset-meta.xml
190
+ ```
169
191
 
170
192
  ```typescript
171
193
  import {
package/disassemble.log CHANGED
@@ -1,96 +1,93 @@
1
- [2024-03-28T19:05:40.295] [DEBUG] default - Parsing file to disassemble: mock/general/HR_Admin.permissionset-meta.xml
2
- [2024-03-28T19:05:40.301] [DEBUG] default - Created disassembled file: mock/general/HR_Admin/applicationVisibilities/JobApps__Recruiting.applicationVisibilities-meta.xml
3
- [2024-03-28T19:05:40.301] [DEBUG] default - Created disassembled file: mock/general/HR_Admin/classAccesses/Send_Email_Confirmation.classAccesses-meta.xml
4
- [2024-03-28T19:05:40.301] [DEBUG] default - Created disassembled file: mock/general/HR_Admin/fieldPermissions/Job_Request__c.Salary__c.fieldPermissions-meta.xml
5
- [2024-03-28T19:05:40.301] [DEBUG] default - Created disassembled file: mock/general/HR_Admin/objectPermissions/Job_Request__c.objectPermissions-meta.xml
6
- [2024-03-28T19:05:40.301] [DEBUG] default - Created disassembled file: mock/general/HR_Admin/pageAccesses/Job_Request_Web_Form.pageAccesses-meta.xml
7
- [2024-03-28T19:05:40.302] [DEBUG] default - Created disassembled file: mock/general/HR_Admin/recordTypeVisibilities/Recruiting.DevManager.recordTypeVisibilities-meta.xml
8
- [2024-03-28T19:05:40.302] [DEBUG] default - Created disassembled file: mock/general/HR_Admin/tabSettings/Job_Request__c.tabSettings-meta.xml
9
- [2024-03-28T19:05:40.302] [DEBUG] default - Created disassembled file: mock/general/HR_Admin/userPermissions/APIEnabled.userPermissions-meta.xml
10
- [2024-03-28T19:05:40.309] [DEBUG] default - Created disassembled file: mock/general/HR_Admin/HR_Admin.permissionset-meta.xml
11
- [2024-03-28T19:05:40.313] [DEBUG] default - Parsing directory to reassemble: mock/general/HR_Admin
12
- [2024-03-28T19:05:40.321] [DEBUG] default - Created reassembled file: mock/general/HR_Admin.permissionset-meta.xml
13
- [2024-03-28T19:05:40.322] [DEBUG] default - Parsing file to disassemble: mock/cdata/VidLand_US.marketingappextension-meta.xml
14
- [2024-03-28T19:05:40.323] [DEBUG] default - Created disassembled file: mock/cdata/VidLand_US/marketingAppExtActions/register_user.marketingAppExtActions-meta.xml
15
- [2024-03-28T19:05:40.323] [DEBUG] default - Created disassembled file: mock/cdata/VidLand_US/VidLand_US.marketingappextension-meta.xml
16
- [2024-03-28T19:05:40.324] [DEBUG] default - Parsing directory to reassemble: mock/cdata/VidLand_US
17
- [2024-03-28T19:05:40.330] [DEBUG] default - Created reassembled file: mock/cdata/VidLand_US.xml
18
- [2024-03-28T19:05:40.331] [DEBUG] default - Parsing file to disassemble: mock/comments/Numbers-fr.globalValueSetTranslation-meta.xml
19
- [2024-03-28T19:05:40.332] [DEBUG] default - Created disassembled file: mock/comments/Numbers-fr/valueTranslation/30e8b6d2.valueTranslation-meta.xml
20
- [2024-03-28T19:05:40.332] [DEBUG] default - Created disassembled file: mock/comments/Numbers-fr/valueTranslation/d7dd1420.valueTranslation-meta.xml
21
- [2024-03-28T19:05:40.332] [DEBUG] default - Created disassembled file: mock/comments/Numbers-fr/valueTranslation/d8852ede.valueTranslation-meta.xml
22
- [2024-03-28T19:05:40.333] [DEBUG] default - Parsing directory to reassemble: mock/comments/Numbers-fr
23
- [2024-03-28T19:05:40.335] [DEBUG] default - Created reassembled file: mock/comments/Numbers-fr.globalValueSetTranslation-meta.xml
24
- [2024-03-28T19:05:40.336] [DEBUG] default - Parsing file to disassemble: mock/deeply-nested-unique-id-element/Get_Info.flow-meta.xml
25
- [2024-03-28T19:05:40.339] [DEBUG] default - Created disassembled file: mock/deeply-nested-unique-id-element/Get_Info/actionCalls/Get_Info.actionCalls-meta.xml
26
- [2024-03-28T19:05:40.339] [DEBUG] default - Created disassembled file: mock/deeply-nested-unique-id-element/Get_Info/actionCalls/Post_to_Contact_s_Feed.actionCalls-meta.xml
27
- [2024-03-28T19:05:40.339] [DEBUG] default - Created disassembled file: mock/deeply-nested-unique-id-element/Get_Info/assignments/Set_Contact_ID.assignments-meta.xml
28
- [2024-03-28T19:05:40.340] [DEBUG] default - Created disassembled file: mock/deeply-nested-unique-id-element/Get_Info/decisions/Update_If_Existing.decisions-meta.xml
29
- [2024-03-28T19:05:40.340] [DEBUG] default - Created disassembled file: mock/deeply-nested-unique-id-element/Get_Info/decisions/Update_or_Create.decisions-meta.xml
30
- [2024-03-28T19:05:40.340] [DEBUG] default - Created disassembled file: mock/deeply-nested-unique-id-element/Get_Info/dynamicChoiceSets/accounts.dynamicChoiceSets-meta.xml
31
- [2024-03-28T19:05:40.340] [DEBUG] default - Created disassembled file: mock/deeply-nested-unique-id-element/Get_Info/formulas/created_or_updated.formulas-meta.xml
32
- [2024-03-28T19:05:40.340] [DEBUG] default - Created disassembled file: mock/deeply-nested-unique-id-element/Get_Info/processMetadataValues/BuilderType.processMetadataValues-meta.xml
33
- [2024-03-28T19:05:40.341] [DEBUG] default - Created disassembled file: mock/deeply-nested-unique-id-element/Get_Info/processMetadataValues/CanvasMode.processMetadataValues-meta.xml
34
- [2024-03-28T19:05:40.341] [DEBUG] default - Created disassembled file: mock/deeply-nested-unique-id-element/Get_Info/processMetadataValues/OriginBuilderType.processMetadataValues-meta.xml
35
- [2024-03-28T19:05:40.341] [DEBUG] default - Created disassembled file: mock/deeply-nested-unique-id-element/Get_Info/recordCreates/Create_Contact.recordCreates-meta.xml
36
- [2024-03-28T19:05:40.341] [DEBUG] default - Created disassembled file: mock/deeply-nested-unique-id-element/Get_Info/recordLookups/Find_a_Match.recordLookups-meta.xml
37
- [2024-03-28T19:05:40.341] [DEBUG] default - Created disassembled file: mock/deeply-nested-unique-id-element/Get_Info/recordUpdates/Update_Contact.recordUpdates-meta.xml
38
- [2024-03-28T19:05:40.341] [DEBUG] default - Created disassembled file: mock/deeply-nested-unique-id-element/Get_Info/screens/Confirm.screens-meta.xml
39
- [2024-03-28T19:05:40.342] [DEBUG] default - Created disassembled file: mock/deeply-nested-unique-id-element/Get_Info/screens/Contact_Info.screens-meta.xml
40
- [2024-03-28T19:05:40.342] [DEBUG] default - Created disassembled file: mock/deeply-nested-unique-id-element/Get_Info/start/Contact_Info.start-meta.xml
41
- [2024-03-28T19:05:40.342] [DEBUG] default - Created disassembled file: mock/deeply-nested-unique-id-element/Get_Info/textTemplates/chatterMessage.textTemplates-meta.xml
42
- [2024-03-28T19:05:40.342] [DEBUG] default - Created disassembled file: mock/deeply-nested-unique-id-element/Get_Info/variables/ComplexObjectExample.variables-meta.xml
43
- [2024-03-28T19:05:40.342] [DEBUG] default - Created disassembled file: mock/deeply-nested-unique-id-element/Get_Info/variables/contact.variables-meta.xml
44
- [2024-03-28T19:05:40.342] [DEBUG] default - Created disassembled file: mock/deeply-nested-unique-id-element/Get_Info/variables/existingId.variables-meta.xml
45
- [2024-03-28T19:05:40.342] [DEBUG] default - Created disassembled file: mock/deeply-nested-unique-id-element/Get_Info/variables/updateExisting.variables-meta.xml
46
- [2024-03-28T19:05:40.342] [DEBUG] default - Created disassembled file: mock/deeply-nested-unique-id-element/Get_Info/Get_Info.flow-meta.xml
47
- [2024-03-28T19:05:40.344] [DEBUG] default - Parsing directory to reassemble: mock/deeply-nested-unique-id-element/Get_Info
48
- [2024-03-28T19:05:40.357] [DEBUG] default - Created reassembled file: mock/deeply-nested-unique-id-element/Get_Info.flow-meta.xml
49
- [2024-03-28T19:05:40.358] [DEBUG] default - Parsing file to disassemble: mock/array-of-leafs/Dreamhouse.app-meta.xml
50
- [2024-03-28T19:05:40.359] [DEBUG] default - Created disassembled file: mock/array-of-leafs/Dreamhouse/actionOverrides/39049d21.actionOverrides-meta.xml
51
- [2024-03-28T19:05:40.359] [DEBUG] default - Created disassembled file: mock/array-of-leafs/Dreamhouse/actionOverrides/735c1659.actionOverrides-meta.xml
52
- [2024-03-28T19:05:40.359] [DEBUG] default - Created disassembled file: mock/array-of-leafs/Dreamhouse/actionOverrides/b04e9f9b.actionOverrides-meta.xml
53
- [2024-03-28T19:05:40.360] [DEBUG] default - Created disassembled file: mock/array-of-leafs/Dreamhouse/actionOverrides/c8cc7a99.actionOverrides-meta.xml
54
- [2024-03-28T19:05:40.360] [DEBUG] default - Created disassembled file: mock/array-of-leafs/Dreamhouse/brand/c9db422b.brand-meta.xml
55
- [2024-03-28T19:05:40.360] [DEBUG] default - Created disassembled file: mock/array-of-leafs/Dreamhouse/Dreamhouse.app-meta.xml
56
- [2024-03-28T19:05:40.361] [DEBUG] default - Parsing directory to reassemble: mock/array-of-leafs/Dreamhouse
57
- [2024-03-28T19:05:40.365] [DEBUG] default - Created reassembled file: mock/array-of-leafs/Dreamhouse.app-meta.xml
58
- [2024-03-28T19:05:40.365] [DEBUG] default - Parsing file to disassemble: mock/array-of-leafs/Dreamhouse.app-meta.xml
59
- [2024-03-28T19:05:40.368] [DEBUG] default - Created disassembled file: mock/array-of-leafs/Dreamhouse/actionOverrides/39049d21.actionOverrides-meta.xml
60
- [2024-03-28T19:05:40.368] [DEBUG] default - Created disassembled file: mock/array-of-leafs/Dreamhouse/actionOverrides/735c1659.actionOverrides-meta.xml
61
- [2024-03-28T19:05:40.369] [DEBUG] default - Created disassembled file: mock/array-of-leafs/Dreamhouse/actionOverrides/b04e9f9b.actionOverrides-meta.xml
62
- [2024-03-28T19:05:40.369] [DEBUG] default - Created disassembled file: mock/array-of-leafs/Dreamhouse/actionOverrides/c8cc7a99.actionOverrides-meta.xml
63
- [2024-03-28T19:05:40.369] [DEBUG] default - Created disassembled file: mock/array-of-leafs/Dreamhouse/brand/c9db422b.brand-meta.xml
64
- [2024-03-28T19:05:40.369] [DEBUG] default - Created disassembled file: mock/array-of-leafs/Dreamhouse/Dreamhouse.app-meta.xml
65
- [2024-03-28T19:05:40.370] [DEBUG] default - Parsing directory to reassemble: mock/array-of-leafs/Dreamhouse
66
- [2024-03-28T19:05:40.373] [DEBUG] default - Created reassembled file: mock/array-of-leafs/Dreamhouse.app-meta.xml
67
- [2024-03-28T19:05:40.375] [DEBUG] default - Parsing file to disassemble: /home/runner/work/xml-disassembler/xml-disassembler/mock/no-namespace/HR_Admin.permissionset-meta.xml
68
- [2024-03-28T19:05:40.375] [DEBUG] default - Created disassembled file: /home/runner/work/xml-disassembler/xml-disassembler/mock/no-namespace/HR_Admin/applicationVisibilities/JobApps__Recruiting.applicationVisibilities-meta.xml
69
- [2024-03-28T19:05:40.375] [DEBUG] default - Created disassembled file: /home/runner/work/xml-disassembler/xml-disassembler/mock/no-namespace/HR_Admin/classAccesses/Send_Email_Confirmation.classAccesses-meta.xml
70
- [2024-03-28T19:05:40.376] [DEBUG] default - Created disassembled file: /home/runner/work/xml-disassembler/xml-disassembler/mock/no-namespace/HR_Admin/fieldPermissions/Job_Request__c.Salary__c.fieldPermissions-meta.xml
71
- [2024-03-28T19:05:40.376] [DEBUG] default - Created disassembled file: /home/runner/work/xml-disassembler/xml-disassembler/mock/no-namespace/HR_Admin/objectPermissions/Job_Request__c.objectPermissions-meta.xml
72
- [2024-03-28T19:05:40.376] [DEBUG] default - Created disassembled file: /home/runner/work/xml-disassembler/xml-disassembler/mock/no-namespace/HR_Admin/pageAccesses/Job_Request_Web_Form.pageAccesses-meta.xml
73
- [2024-03-28T19:05:40.376] [DEBUG] default - Created disassembled file: /home/runner/work/xml-disassembler/xml-disassembler/mock/no-namespace/HR_Admin/recordTypeVisibilities/Recruiting.DevManager.recordTypeVisibilities-meta.xml
74
- [2024-03-28T19:05:40.376] [DEBUG] default - Created disassembled file: /home/runner/work/xml-disassembler/xml-disassembler/mock/no-namespace/HR_Admin/tabSettings/Job_Request__c.tabSettings-meta.xml
75
- [2024-03-28T19:05:40.376] [DEBUG] default - Created disassembled file: /home/runner/work/xml-disassembler/xml-disassembler/mock/no-namespace/HR_Admin/userPermissions/APIEnabled.userPermissions-meta.xml
76
- [2024-03-28T19:05:40.376] [DEBUG] default - Created disassembled file: /home/runner/work/xml-disassembler/xml-disassembler/mock/no-namespace/HR_Admin/HR_Admin.permissionset-meta.xml
77
- [2024-03-28T19:05:40.377] [DEBUG] default - Parsing directory to reassemble: mock/no-namespace/HR_Admin
78
- [2024-03-28T19:05:40.381] [DEBUG] default - Created reassembled file: mock/no-namespace/HR_Admin.permissionset-meta.xml
79
- [2024-03-28T19:05:40.382] [ERROR] default - The file path /home/runner/work/xml-disassembler/xml-disassembler/mock/not-an-xml.txt is not an XML file.
80
- [2024-03-28T19:05:40.382] [ERROR] default - The provided xmlPath mock/no-namespace/HR_Admin/HR_Admin.permissionset-meta.xml to reassemble is not a directory.
81
- [2024-03-28T19:05:40.383] [DEBUG] default - Parsing file to disassemble: mock/no-root-element/Assessment_Bot.bot-meta.xml
82
- [2024-03-28T19:05:40.384] [ERROR] default - A Root Element Name was not found in Assessment_Bot.bot-meta.xml
83
- [2024-03-28T19:05:40.384] [DEBUG] default - Parsing directory to reassemble: mock/no-root-element/Assessment_Bot
84
- [2024-03-28T19:05:40.385] [ERROR] default - A Root Element Name was not found in any files under mock/no-root-element/Assessment_Bot
85
- [2024-03-28T19:05:40.386] [DEBUG] default - Parsing file to disassemble: mock/no-nested-elements/HR_Admin.no-nested-elements.xml
86
- [2024-03-28T19:05:40.386] [ERROR] default - The XML file HR_Admin.no-nested-elements.xml only has leaf elements. This file will not be disassembled.
87
- [2024-03-28T19:05:40.386] [DEBUG] default - Parsing file to disassemble: mock/no-nested-elements/HR_Admin.permissionset-meta.xml
88
- [2024-03-28T19:05:40.387] [DEBUG] default - Created disassembled file: mock/no-nested-elements/HR_Admin/applicationVisibilities/5593cf61.applicationVisibilities-meta.xml
89
- [2024-03-28T19:05:40.387] [DEBUG] default - Created disassembled file: mock/no-nested-elements/HR_Admin/classAccesses/2e5749c9.classAccesses-meta.xml
90
- [2024-03-28T19:05:40.387] [DEBUG] default - Created disassembled file: mock/no-nested-elements/HR_Admin/fieldPermissions/16129a47.fieldPermissions-meta.xml
91
- [2024-03-28T19:05:40.387] [DEBUG] default - Created disassembled file: mock/no-nested-elements/HR_Admin/objectPermissions/81268af4.objectPermissions-meta.xml
92
- [2024-03-28T19:05:40.387] [DEBUG] default - Created disassembled file: mock/no-nested-elements/HR_Admin/pageAccesses/d6d8105a.pageAccesses-meta.xml
93
- [2024-03-28T19:05:40.387] [DEBUG] default - Created disassembled file: mock/no-nested-elements/HR_Admin/recordTypeVisibilities/077548e3.recordTypeVisibilities-meta.xml
94
- [2024-03-28T19:05:40.388] [DEBUG] default - Created disassembled file: mock/no-nested-elements/HR_Admin/tabSettings/181e6985.tabSettings-meta.xml
95
- [2024-03-28T19:05:40.388] [DEBUG] default - Created disassembled file: mock/no-nested-elements/HR_Admin/userPermissions/0288499e.userPermissions-meta.xml
96
- [2024-03-28T19:05:40.388] [DEBUG] default - Created disassembled file: mock/no-nested-elements/HR_Admin/HR_Admin.permissionset-meta.xml
1
+ [2024-03-31T04:16:32.568] [DEBUG] default - Parsing file to disassemble: mock/general/HR_Admin.permissionset-meta.xml
2
+ [2024-03-31T04:16:32.574] [DEBUG] default - Created disassembled file: mock/general/HR_Admin/applicationVisibilities/JobApps__Recruiting.applicationVisibilities-meta.xml
3
+ [2024-03-31T04:16:32.574] [DEBUG] default - Created disassembled file: mock/general/HR_Admin/classAccesses/Send_Email_Confirmation.classAccesses-meta.xml
4
+ [2024-03-31T04:16:32.575] [DEBUG] default - Created disassembled file: mock/general/HR_Admin/fieldPermissions/Job_Request__c.Salary__c.fieldPermissions-meta.xml
5
+ [2024-03-31T04:16:32.575] [DEBUG] default - Created disassembled file: mock/general/HR_Admin/objectPermissions/Job_Request__c.objectPermissions-meta.xml
6
+ [2024-03-31T04:16:32.575] [DEBUG] default - Created disassembled file: mock/general/HR_Admin/pageAccesses/Job_Request_Web_Form.pageAccesses-meta.xml
7
+ [2024-03-31T04:16:32.575] [DEBUG] default - Created disassembled file: mock/general/HR_Admin/recordTypeVisibilities/Recruiting.DevManager.recordTypeVisibilities-meta.xml
8
+ [2024-03-31T04:16:32.576] [DEBUG] default - Created disassembled file: mock/general/HR_Admin/tabSettings/Job_Request__c.tabSettings-meta.xml
9
+ [2024-03-31T04:16:32.576] [DEBUG] default - Created disassembled file: mock/general/HR_Admin/userPermissions/APIEnabled.userPermissions-meta.xml
10
+ [2024-03-31T04:16:32.583] [DEBUG] default - Created disassembled file: mock/general/HR_Admin/HR_Admin.permissionset-meta.xml
11
+ [2024-03-31T04:16:32.586] [DEBUG] default - Parsing directory to reassemble: mock/general/HR_Admin
12
+ [2024-03-31T04:16:32.594] [DEBUG] default - Created reassembled file: mock/general/HR_Admin.permissionset-meta.xml
13
+ [2024-03-31T04:16:32.595] [DEBUG] default - Parsing file to disassemble: mock/attributes/notes.xml
14
+ [2024-03-31T04:16:32.596] [DEBUG] default - Created disassembled file: mock/attributes/notes/nest/941cb84b.nest-meta.xml
15
+ [2024-03-31T04:16:32.596] [DEBUG] default - Created disassembled file: mock/attributes/notes/nest/c7c296d8.nest-meta.xml
16
+ [2024-03-31T04:16:32.597] [DEBUG] default - Parsing directory to reassemble: mock/attributes/notes
17
+ [2024-03-31T04:16:32.598] [DEBUG] default - Created reassembled file: mock/attributes/notes.xml
18
+ [2024-03-31T04:16:32.599] [DEBUG] default - Parsing file to disassemble: mock/cdata/VidLand_US.marketingappextension-meta.xml
19
+ [2024-03-31T04:16:32.600] [DEBUG] default - Created disassembled file: mock/cdata/VidLand_US/marketingAppExtActions/register_user.marketingAppExtActions-meta.xml
20
+ [2024-03-31T04:16:32.600] [DEBUG] default - Created disassembled file: mock/cdata/VidLand_US/VidLand_US.marketingappextension-meta.xml
21
+ [2024-03-31T04:16:32.601] [DEBUG] default - Parsing directory to reassemble: mock/cdata/VidLand_US
22
+ [2024-03-31T04:16:32.603] [DEBUG] default - Created reassembled file: mock/cdata/VidLand_US.xml
23
+ [2024-03-31T04:16:32.604] [DEBUG] default - Parsing file to disassemble: mock/comments/Numbers-fr.globalValueSetTranslation-meta.xml
24
+ [2024-03-31T04:16:32.605] [DEBUG] default - Created disassembled file: mock/comments/Numbers-fr/valueTranslation/30e8b6d2.valueTranslation-meta.xml
25
+ [2024-03-31T04:16:32.605] [DEBUG] default - Created disassembled file: mock/comments/Numbers-fr/valueTranslation/d7dd1420.valueTranslation-meta.xml
26
+ [2024-03-31T04:16:32.605] [DEBUG] default - Created disassembled file: mock/comments/Numbers-fr/valueTranslation/d8852ede.valueTranslation-meta.xml
27
+ [2024-03-31T04:16:32.606] [DEBUG] default - Parsing directory to reassemble: mock/comments/Numbers-fr
28
+ [2024-03-31T04:16:32.608] [DEBUG] default - Created reassembled file: mock/comments/Numbers-fr.globalValueSetTranslation-meta.xml
29
+ [2024-03-31T04:16:32.609] [DEBUG] default - Parsing file to disassemble: mock/deeply-nested-unique-id-element/Get_Info.flow-meta.xml
30
+ [2024-03-31T04:16:32.613] [DEBUG] default - Created disassembled file: mock/deeply-nested-unique-id-element/Get_Info/actionCalls/Get_Info.actionCalls-meta.xml
31
+ [2024-03-31T04:16:32.613] [DEBUG] default - Created disassembled file: mock/deeply-nested-unique-id-element/Get_Info/actionCalls/Post_to_Contact_s_Feed.actionCalls-meta.xml
32
+ [2024-03-31T04:16:32.614] [DEBUG] default - Created disassembled file: mock/deeply-nested-unique-id-element/Get_Info/assignments/Set_Contact_ID.assignments-meta.xml
33
+ [2024-03-31T04:16:32.614] [DEBUG] default - Created disassembled file: mock/deeply-nested-unique-id-element/Get_Info/decisions/Update_If_Existing.decisions-meta.xml
34
+ [2024-03-31T04:16:32.614] [DEBUG] default - Created disassembled file: mock/deeply-nested-unique-id-element/Get_Info/decisions/Update_or_Create.decisions-meta.xml
35
+ [2024-03-31T04:16:32.614] [DEBUG] default - Created disassembled file: mock/deeply-nested-unique-id-element/Get_Info/dynamicChoiceSets/accounts.dynamicChoiceSets-meta.xml
36
+ [2024-03-31T04:16:32.614] [DEBUG] default - Created disassembled file: mock/deeply-nested-unique-id-element/Get_Info/formulas/created_or_updated.formulas-meta.xml
37
+ [2024-03-31T04:16:32.615] [DEBUG] default - Created disassembled file: mock/deeply-nested-unique-id-element/Get_Info/processMetadataValues/BuilderType.processMetadataValues-meta.xml
38
+ [2024-03-31T04:16:32.615] [DEBUG] default - Created disassembled file: mock/deeply-nested-unique-id-element/Get_Info/processMetadataValues/CanvasMode.processMetadataValues-meta.xml
39
+ [2024-03-31T04:16:32.615] [DEBUG] default - Created disassembled file: mock/deeply-nested-unique-id-element/Get_Info/processMetadataValues/OriginBuilderType.processMetadataValues-meta.xml
40
+ [2024-03-31T04:16:32.615] [DEBUG] default - Created disassembled file: mock/deeply-nested-unique-id-element/Get_Info/recordCreates/Create_Contact.recordCreates-meta.xml
41
+ [2024-03-31T04:16:32.615] [DEBUG] default - Created disassembled file: mock/deeply-nested-unique-id-element/Get_Info/recordLookups/Find_a_Match.recordLookups-meta.xml
42
+ [2024-03-31T04:16:32.615] [DEBUG] default - Created disassembled file: mock/deeply-nested-unique-id-element/Get_Info/recordUpdates/Update_Contact.recordUpdates-meta.xml
43
+ [2024-03-31T04:16:32.615] [DEBUG] default - Created disassembled file: mock/deeply-nested-unique-id-element/Get_Info/screens/Confirm.screens-meta.xml
44
+ [2024-03-31T04:16:32.616] [DEBUG] default - Created disassembled file: mock/deeply-nested-unique-id-element/Get_Info/screens/Contact_Info.screens-meta.xml
45
+ [2024-03-31T04:16:32.616] [DEBUG] default - Created disassembled file: mock/deeply-nested-unique-id-element/Get_Info/start/Contact_Info.start-meta.xml
46
+ [2024-03-31T04:16:32.616] [DEBUG] default - Created disassembled file: mock/deeply-nested-unique-id-element/Get_Info/textTemplates/chatterMessage.textTemplates-meta.xml
47
+ [2024-03-31T04:16:32.616] [DEBUG] default - Created disassembled file: mock/deeply-nested-unique-id-element/Get_Info/variables/ComplexObjectExample.variables-meta.xml
48
+ [2024-03-31T04:16:32.616] [DEBUG] default - Created disassembled file: mock/deeply-nested-unique-id-element/Get_Info/variables/contact.variables-meta.xml
49
+ [2024-03-31T04:16:32.616] [DEBUG] default - Created disassembled file: mock/deeply-nested-unique-id-element/Get_Info/variables/existingId.variables-meta.xml
50
+ [2024-03-31T04:16:32.616] [DEBUG] default - Created disassembled file: mock/deeply-nested-unique-id-element/Get_Info/variables/updateExisting.variables-meta.xml
51
+ [2024-03-31T04:16:32.616] [DEBUG] default - Created disassembled file: mock/deeply-nested-unique-id-element/Get_Info/Get_Info.flow-meta.xml
52
+ [2024-03-31T04:16:32.621] [DEBUG] default - Parsing directory to reassemble: mock/deeply-nested-unique-id-element/Get_Info
53
+ [2024-03-31T04:16:32.640] [DEBUG] default - Created reassembled file: mock/deeply-nested-unique-id-element/Get_Info.flow-meta.xml
54
+ [2024-03-31T04:16:32.641] [DEBUG] default - Parsing file to disassemble: mock/array-of-leafs/Dreamhouse.app-meta.xml
55
+ [2024-03-31T04:16:32.643] [DEBUG] default - Created disassembled file: mock/array-of-leafs/Dreamhouse/actionOverrides/39049d21.actionOverrides-meta.xml
56
+ [2024-03-31T04:16:32.643] [DEBUG] default - Created disassembled file: mock/array-of-leafs/Dreamhouse/actionOverrides/735c1659.actionOverrides-meta.xml
57
+ [2024-03-31T04:16:32.643] [DEBUG] default - Created disassembled file: mock/array-of-leafs/Dreamhouse/actionOverrides/b04e9f9b.actionOverrides-meta.xml
58
+ [2024-03-31T04:16:32.643] [DEBUG] default - Created disassembled file: mock/array-of-leafs/Dreamhouse/actionOverrides/c8cc7a99.actionOverrides-meta.xml
59
+ [2024-03-31T04:16:32.644] [DEBUG] default - Created disassembled file: mock/array-of-leafs/Dreamhouse/brand/c9db422b.brand-meta.xml
60
+ [2024-03-31T04:16:32.644] [DEBUG] default - Created disassembled file: mock/array-of-leafs/Dreamhouse/Dreamhouse.app-meta.xml
61
+ [2024-03-31T04:16:32.645] [DEBUG] default - Parsing directory to reassemble: mock/array-of-leafs/Dreamhouse
62
+ [2024-03-31T04:16:32.649] [DEBUG] default - Created reassembled file: mock/array-of-leafs/Dreamhouse.app-meta.xml
63
+ [2024-03-31T04:16:32.650] [DEBUG] default - Parsing file to disassemble: mock/array-of-leafs/Dreamhouse.app-meta.xml
64
+ [2024-03-31T04:16:32.652] [DEBUG] default - Created disassembled file: mock/array-of-leafs/Dreamhouse/actionOverrides/39049d21.actionOverrides-meta.xml
65
+ [2024-03-31T04:16:32.653] [DEBUG] default - Created disassembled file: mock/array-of-leafs/Dreamhouse/actionOverrides/735c1659.actionOverrides-meta.xml
66
+ [2024-03-31T04:16:32.653] [DEBUG] default - Created disassembled file: mock/array-of-leafs/Dreamhouse/actionOverrides/b04e9f9b.actionOverrides-meta.xml
67
+ [2024-03-31T04:16:32.653] [DEBUG] default - Created disassembled file: mock/array-of-leafs/Dreamhouse/actionOverrides/c8cc7a99.actionOverrides-meta.xml
68
+ [2024-03-31T04:16:32.653] [DEBUG] default - Created disassembled file: mock/array-of-leafs/Dreamhouse/brand/c9db422b.brand-meta.xml
69
+ [2024-03-31T04:16:32.653] [DEBUG] default - Created disassembled file: mock/array-of-leafs/Dreamhouse/Dreamhouse.app-meta.xml
70
+ [2024-03-31T04:16:32.654] [DEBUG] default - Parsing directory to reassemble: mock/array-of-leafs/Dreamhouse
71
+ [2024-03-31T04:16:32.656] [DEBUG] default - Created reassembled file: mock/array-of-leafs/Dreamhouse.app-meta.xml
72
+ [2024-03-31T04:16:32.658] [DEBUG] default - Parsing file to disassemble: /home/runner/work/xml-disassembler/xml-disassembler/mock/no-namespace/HR_Admin.permissionset-meta.xml
73
+ [2024-03-31T04:16:32.659] [DEBUG] default - Created disassembled file: /home/runner/work/xml-disassembler/xml-disassembler/mock/no-namespace/HR_Admin/applicationVisibilities/JobApps__Recruiting.applicationVisibilities-meta.xml
74
+ [2024-03-31T04:16:32.659] [DEBUG] default - Created disassembled file: /home/runner/work/xml-disassembler/xml-disassembler/mock/no-namespace/HR_Admin/classAccesses/Send_Email_Confirmation.classAccesses-meta.xml
75
+ [2024-03-31T04:16:32.659] [DEBUG] default - Created disassembled file: /home/runner/work/xml-disassembler/xml-disassembler/mock/no-namespace/HR_Admin/fieldPermissions/Job_Request__c.Salary__c.fieldPermissions-meta.xml
76
+ [2024-03-31T04:16:32.659] [DEBUG] default - Created disassembled file: /home/runner/work/xml-disassembler/xml-disassembler/mock/no-namespace/HR_Admin/objectPermissions/Job_Request__c.objectPermissions-meta.xml
77
+ [2024-03-31T04:16:32.659] [DEBUG] default - Created disassembled file: /home/runner/work/xml-disassembler/xml-disassembler/mock/no-namespace/HR_Admin/pageAccesses/Job_Request_Web_Form.pageAccesses-meta.xml
78
+ [2024-03-31T04:16:32.659] [DEBUG] default - Created disassembled file: /home/runner/work/xml-disassembler/xml-disassembler/mock/no-namespace/HR_Admin/recordTypeVisibilities/Recruiting.DevManager.recordTypeVisibilities-meta.xml
79
+ [2024-03-31T04:16:32.659] [DEBUG] default - Created disassembled file: /home/runner/work/xml-disassembler/xml-disassembler/mock/no-namespace/HR_Admin/tabSettings/Job_Request__c.tabSettings-meta.xml
80
+ [2024-03-31T04:16:32.660] [DEBUG] default - Created disassembled file: /home/runner/work/xml-disassembler/xml-disassembler/mock/no-namespace/HR_Admin/userPermissions/APIEnabled.userPermissions-meta.xml
81
+ [2024-03-31T04:16:32.660] [DEBUG] default - Created disassembled file: /home/runner/work/xml-disassembler/xml-disassembler/mock/no-namespace/HR_Admin/HR_Admin.permissionset-meta.xml
82
+ [2024-03-31T04:16:32.660] [DEBUG] default - Parsing directory to reassemble: mock/no-namespace/HR_Admin
83
+ [2024-03-31T04:16:32.664] [DEBUG] default - Created reassembled file: mock/no-namespace/HR_Admin.permissionset-meta.xml
84
+ [2024-03-31T04:16:32.665] [ERROR] default - The file path /home/runner/work/xml-disassembler/xml-disassembler/mock/not-an-xml.txt is not an XML file.
85
+ [2024-03-31T04:16:32.665] [ERROR] default - The provided xmlPath mock/no-namespace/HR_Admin/HR_Admin.permissionset-meta.xml to reassemble is not a directory.
86
+ [2024-03-31T04:16:32.666] [DEBUG] default - Parsing file to disassemble: mock/no-root-element/Assessment_Bot.bot-meta.xml
87
+ [2024-03-31T04:16:32.666] [ERROR] default - Assessment_Bot.bot-meta.xml was unable to be parsed. Confirm formatting and try again.
88
+ [2024-03-31T04:16:32.667] [DEBUG] default - Parsing directory to reassemble: mock/no-root-element/Assessment_Bot
89
+ [2024-03-31T04:16:32.667] [ERROR] default - mock/no-root-element/Assessment_Bot/Assessment_Bot.bot-meta.xml was unable to be parsed and was not added to the reassembled file. Confirm formatting and try again.
90
+ [2024-03-31T04:16:32.668] [ERROR] default - mock/no-root-element/Assessment_Bot/botMlDomain/419e0199.botMlDomain-meta.xml was unable to be parsed and was not added to the reassembled file. Confirm formatting and try again.
91
+ [2024-03-31T04:16:32.668] [ERROR] default - No files under mock/no-root-element/Assessment_Bot were parsed successfully. A reassembled XML file was not created.
92
+ [2024-03-31T04:16:32.668] [DEBUG] default - Parsing file to disassemble: mock/no-nested-elements/HR_Admin.xml
93
+ [2024-03-31T04:16:32.669] [ERROR] default - The XML file HR_Admin.xml only has leaf elements. This file will not be disassembled.
package/dist/index.cjs CHANGED
@@ -3,8 +3,8 @@
3
3
  var log4js = require('log4js');
4
4
  var fs = require('node:fs/promises');
5
5
  var path = require('node:path');
6
- var fs$1 = require('node:fs');
7
6
  var fastXmlParser = require('fast-xml-parser');
7
+ var fs$1 = require('node:fs');
8
8
  var node_crypto = require('node:crypto');
9
9
 
10
10
  function _interopNamespaceDefault(e) {
@@ -77,14 +77,11 @@ const XML_PARSER_OPTION = {
77
77
  };
78
78
  const JSON_PARSER_OPTION = Object.assign(Object.assign({}, XML_PARSER_OPTION), { format: true, indentBy: INDENT, suppressBooleanAttributes: false, suppressEmptyNode: false });
79
79
 
80
- function buildReassembledFile(combinedXmlContents, filePath, xmlElement, xmlNamespace) {
80
+ function buildReassembledFile(combinedXmlContents, filePath, xmlElement, xmlRootElementHeader) {
81
81
  return __awaiter(this, void 0, void 0, function* () {
82
82
  let finalXmlContent = combinedXmlContents.join("\n");
83
83
  finalXmlContent = finalXmlContent.replace(/<\?xml version="1.0" encoding="UTF-8"\?>/g, "");
84
- const namespaceRegexPart = xmlNamespace ? `( xmlns="${xmlNamespace}")?` : "";
85
- const rootElementRegexString = `<${xmlElement}[^>]*${namespaceRegexPart}>`;
86
- const rootElementRegex = new RegExp(rootElementRegexString, "g");
87
- finalXmlContent = finalXmlContent.replace(rootElementRegex, "");
84
+ finalXmlContent = finalXmlContent.replace(new RegExp(`<${xmlElement}\\s*[^>]*>`, "g"), "");
88
85
  finalXmlContent = finalXmlContent.replace(new RegExp(`</${xmlElement}>`, "g"), "");
89
86
  finalXmlContent = finalXmlContent.replace(/<!\[CDATA\[\s*([\s\S]*?)\s*]]>/g, function (_, cdataContent) {
90
87
  const trimmedContent = cdataContent.trim();
@@ -95,16 +92,13 @@ function buildReassembledFile(combinedXmlContents, filePath, xmlElement, xmlName
95
92
  return ("<![CDATA[\n" + INDENT + indentedLines.join("\n" + INDENT) + "\n]]>");
96
93
  });
97
94
  finalXmlContent = finalXmlContent.replace(/(\n\s*){2,}/g, `\n${INDENT}`);
98
- const openTag = xmlNamespace
99
- ? `<${xmlElement} xmlns="${xmlNamespace}">`
100
- : `<${xmlElement}>`;
101
95
  const closeTag = `</${xmlElement}>`;
102
- yield fs__namespace.writeFile(filePath, `${XML_HEADER}\n${openTag}${finalXmlContent}${closeTag}`);
96
+ yield fs__namespace.writeFile(filePath, `${XML_HEADER}\n${xmlRootElementHeader}${finalXmlContent}${closeTag}`);
103
97
  logger.debug(`Created reassembled file: ${filePath}`);
104
98
  });
105
99
  }
106
100
 
107
- function buildNestedElements(element, indentLevel = 2) {
101
+ function buildXMLString(element, indentLevel = 0) {
108
102
  const xmlBuilder = new fastXmlParser.XMLBuilder(JSON_PARSER_OPTION);
109
103
  const xmlString = xmlBuilder.build(element);
110
104
  const formattedXml = xmlString
@@ -132,12 +126,19 @@ class ReassembleXMLFileHandler {
132
126
  const fileStat = yield fs__namespace.stat(filePath);
133
127
  if (fileStat.isFile() && filePath.endsWith(".xml")) {
134
128
  const xmlContent = yield fs__namespace.readFile(filePath, "utf-8");
135
- const xmlParsed = xmlParser.parse(xmlContent);
129
+ let xmlParsed;
130
+ try {
131
+ xmlParsed = xmlParser.parse(xmlContent, true);
132
+ }
133
+ catch (err) {
134
+ logger.error(`${filePath} was unable to be parsed and was not added to the reassembled file. Confirm formatting and try again.`);
135
+ continue;
136
+ }
136
137
  const rootResultFromFile = yield this.processFilesForRootElement(xmlParsed);
137
138
  if (rootResultFromFile && !rootResult) {
138
139
  rootResult = rootResultFromFile;
139
140
  }
140
- const combinedXmlString = buildNestedElements(xmlParsed, 0);
141
+ const combinedXmlString = buildXMLString(xmlParsed);
141
142
  combinedXmlContents.push(combinedXmlString);
142
143
  }
143
144
  }
@@ -148,17 +149,15 @@ class ReassembleXMLFileHandler {
148
149
  return __awaiter(this, void 0, void 0, function* () {
149
150
  const rootElementName = Object.keys(xmlParsed)[1];
150
151
  const rootElement = xmlParsed[rootElementName];
151
- let rootElementNamespace;
152
- if (rootElement["@_xmlns"] !== undefined) {
153
- rootElementNamespace = String(rootElement["@_xmlns"]);
154
- }
155
- else {
156
- rootElementNamespace = undefined;
157
- }
158
- if (rootElementName !== undefined && rootElementName.length > 0) {
159
- return [rootElementName, rootElementNamespace];
152
+ let rootElementHeader = `<${rootElementName}`;
153
+ for (const [attrKey, attrValue] of Object.entries(rootElement)) {
154
+ if (attrKey.startsWith("@")) {
155
+ const cleanAttrKey = attrKey.slice(2);
156
+ rootElementHeader += ` ${cleanAttrKey}="${String(attrValue)}"`;
157
+ }
160
158
  }
161
- return undefined;
159
+ rootElementHeader += ">";
160
+ return [rootElementName, rootElementHeader];
162
161
  });
163
162
  }
164
163
  reassemble(xmlAttributes) {
@@ -183,9 +182,16 @@ class ReassembleXMLFileHandler {
183
182
  const fileStat = yield fs__namespace.stat(filePath);
184
183
  if (fileStat.isFile() && filePath.endsWith(".xml")) {
185
184
  const xmlContent = yield fs__namespace.readFile(filePath, "utf-8");
186
- const xmlParsed = xmlParser.parse(xmlContent);
185
+ let xmlParsed;
186
+ try {
187
+ xmlParsed = xmlParser.parse(xmlContent, true);
188
+ }
189
+ catch (err) {
190
+ logger.error(`${filePath} was unable to be parsed and was not added to the reassembled file. Confirm formatting and try again.`);
191
+ continue;
192
+ }
187
193
  rootResult = yield this.processFilesForRootElement(xmlParsed);
188
- const combinedXmlString = buildNestedElements(xmlParsed, 0);
194
+ const combinedXmlString = buildXMLString(xmlParsed);
189
195
  combinedXmlContents.push(combinedXmlString);
190
196
  }
191
197
  else if (fileStat.isDirectory()) {
@@ -203,13 +209,13 @@ class ReassembleXMLFileHandler {
203
209
  : `${subdirectoryBasename}.xml`;
204
210
  const filePath = path__namespace.join(parentDirectory, fileName);
205
211
  if (rootResult !== undefined) {
206
- const [rootElementName, rootElementNamespace] = rootResult;
207
- yield buildReassembledFile(combinedXmlContents, filePath, rootElementName, rootElementNamespace);
212
+ const [rootElementName, rootElementHeader] = rootResult;
213
+ yield buildReassembledFile(combinedXmlContents, filePath, rootElementName, rootElementHeader);
208
214
  if (postPurge)
209
215
  yield fs__namespace.rm(xmlPath, { recursive: true });
210
216
  }
211
217
  else {
212
- logger.error(`A Root Element Name was not found in any files under ${xmlPath}`);
218
+ logger.error(`No files under ${xmlPath} were parsed successfully. A reassembled XML file was not created.`);
213
219
  }
214
220
  });
215
221
  }
@@ -244,22 +250,59 @@ function getShortHash(element) {
244
250
  return fullHash.slice(0, 8);
245
251
  }
246
252
 
253
+ function buildNestedFile(element, metadataPath, uniqueIdElements, rootElementName, rootElementHeader, parentKey, indent) {
254
+ let elementContent = "";
255
+ const fieldName = findUniqueIdElement(element, uniqueIdElements);
256
+ const outputDirectory = path__namespace.join(metadataPath, parentKey);
257
+ const outputFileName = `${fieldName}.${parentKey}-meta.xml`;
258
+ const outputPath = path__namespace.join(outputDirectory, outputFileName);
259
+ fs__namespace$1.mkdirSync(outputDirectory, { recursive: true });
260
+ elementContent = buildXMLString(element, 2);
261
+ let decomposeFileContents = `${XML_HEADER}\n`;
262
+ decomposeFileContents += `${rootElementHeader}\n`;
263
+ decomposeFileContents += `${indent}<${parentKey}>\n`;
264
+ decomposeFileContents += `${elementContent}\n`;
265
+ decomposeFileContents += `${indent}</${parentKey}>\n`;
266
+ decomposeFileContents += `</${rootElementName}>`;
267
+ fs__namespace$1.writeFileSync(outputPath, decomposeFileContents);
268
+ logger.debug(`Created disassembled file: ${outputPath}`);
269
+ }
270
+
271
+ function buildLeafFile(leafContent, metadataPath, baseName, rootElementName, rootElementHeader) {
272
+ let leafFile = `${XML_HEADER}\n`;
273
+ leafFile += rootElementHeader;
274
+ const sortedLeafContent = leafContent
275
+ .split("\n")
276
+ .filter((line) => line.trim() !== "")
277
+ .sort((a, b) => a.localeCompare(b))
278
+ .join("\n");
279
+ leafFile += sortedLeafContent;
280
+ leafFile += `\n</${rootElementName}>`;
281
+ const leafOutputPath = path__namespace.join(metadataPath, `${baseName}.xml`);
282
+ fs__namespace$1.writeFileSync(leafOutputPath, leafFile);
283
+ logger.debug(`Created disassembled file: ${leafOutputPath}`);
284
+ }
285
+
247
286
  function buildDisassembledFiles(xmlString, metadataPath, uniqueIdElements, baseName, indent, postPurge, parentPath) {
248
287
  const xmlParser = new fastXmlParser.XMLParser(XML_PARSER_OPTION);
249
- const result = xmlParser.parse(xmlString);
250
- const rootElementName = Object.keys(result)[1];
251
- if (rootElementName.length === 0) {
252
- logger.error(`A Root Element Name was not found in ${baseName}.xml`);
288
+ let result;
289
+ try {
290
+ result = xmlParser.parse(xmlString, true);
291
+ }
292
+ catch (err) {
293
+ logger.error(`${baseName}.xml was unable to be parsed. Confirm formatting and try again.`);
253
294
  return;
254
295
  }
296
+ const rootElementName = Object.keys(result)[1];
255
297
  const rootElement = result[rootElementName];
256
- let rootElementNamespace;
257
- if (rootElement["@_xmlns"] !== undefined) {
258
- rootElementNamespace = String(rootElement["@_xmlns"]);
259
- }
260
- else {
261
- rootElementNamespace = undefined;
298
+ let rootElementHeader = `<${rootElementName}`;
299
+ for (const [attrKey, attrValue] of Object.entries(rootElement)) {
300
+ if (attrKey.startsWith("@")) {
301
+ const cleanAttrKey = attrKey.slice(2);
302
+ rootElementHeader += ` ${cleanAttrKey}="${String(attrValue)}"`;
303
+ }
262
304
  }
305
+ rootElementHeader += ">";
263
306
  let leafContent = "";
264
307
  let leafCount = 0;
265
308
  let hasNestedElements = false;
@@ -269,7 +312,7 @@ function buildDisassembledFiles(xmlString, metadataPath, uniqueIdElements, baseN
269
312
  if (Array.isArray(rootElement[key])) {
270
313
  for (const element of rootElement[key]) {
271
314
  if (typeof element === "object") {
272
- buildNestedFile(element, metadataPath, uniqueIdElements, rootElementName, rootElementNamespace, key, indent);
315
+ buildNestedFile(element, metadataPath, uniqueIdElements, rootElementName, rootElementHeader, key, indent);
273
316
  hasNestedElements = true;
274
317
  }
275
318
  else {
@@ -280,7 +323,7 @@ function buildDisassembledFiles(xmlString, metadataPath, uniqueIdElements, baseN
280
323
  }
281
324
  }
282
325
  else if (typeof rootElement[key] === "object") {
283
- buildNestedFile(rootElement[key], metadataPath, uniqueIdElements, rootElementName, rootElementNamespace, key, indent);
326
+ buildNestedFile(rootElement[key], metadataPath, uniqueIdElements, rootElementName, rootElementHeader, key, indent);
284
327
  hasNestedElements = true;
285
328
  }
286
329
  else {
@@ -294,49 +337,13 @@ function buildDisassembledFiles(xmlString, metadataPath, uniqueIdElements, baseN
294
337
  return;
295
338
  }
296
339
  if (leafCount > 0) {
297
- let leafFile = `${XML_HEADER}\n`;
298
- leafFile += `<${rootElementName}`;
299
- if (rootElementNamespace) {
300
- leafFile += ` xmlns="${rootElementNamespace}"`;
301
- }
302
- leafFile += `>\n`;
303
- const sortedLeafContent = leafContent
304
- .split("\n")
305
- .filter((line) => line.trim() !== "")
306
- .sort((a, b) => a.localeCompare(b))
307
- .join("\n");
308
- leafFile += sortedLeafContent;
309
- leafFile += `\n</${rootElementName}>`;
310
- const leafOutputPath = path__namespace.join(metadataPath, `${baseName}.xml`);
311
- fs__namespace$1.writeFileSync(leafOutputPath, leafFile);
312
- logger.debug(`Created disassembled file: ${leafOutputPath}`);
340
+ buildLeafFile(leafContent, metadataPath, baseName, rootElementName, rootElementHeader);
313
341
  }
314
342
  if (postPurge) {
315
343
  const originalFilePath = path__namespace.resolve(`${parentPath}/${baseName}.xml`);
316
344
  fs__namespace.unlink(originalFilePath);
317
345
  }
318
346
  }
319
- function buildNestedFile(element, metadataPath, uniqueIdElements, rootElementName, rootElementNamespace, parentKey, indent) {
320
- let elementContent = "";
321
- const fieldName = findUniqueIdElement(element, uniqueIdElements);
322
- const outputDirectory = path__namespace.join(metadataPath, parentKey);
323
- const outputFileName = `${fieldName}.${parentKey}-meta.xml`;
324
- const outputPath = path__namespace.join(outputDirectory, outputFileName);
325
- fs__namespace$1.mkdirSync(outputDirectory, { recursive: true });
326
- elementContent = buildNestedElements(element);
327
- let decomposeFileContents = `${XML_HEADER}\n`;
328
- decomposeFileContents += `<${rootElementName}`;
329
- if (rootElementNamespace) {
330
- decomposeFileContents += ` xmlns="${rootElementNamespace}"`;
331
- }
332
- decomposeFileContents += `>\n`;
333
- decomposeFileContents += `${indent}<${parentKey}>\n`;
334
- decomposeFileContents += `${elementContent}\n`;
335
- decomposeFileContents += `${indent}</${parentKey}>\n`;
336
- decomposeFileContents += `</${rootElementName}>`;
337
- fs__namespace$1.writeFileSync(outputPath, decomposeFileContents);
338
- logger.debug(`Created disassembled file: ${outputPath}`);
339
- }
340
347
 
341
348
  class DisassembleXMLFileHandler {
342
349
  disassemble(xmlAttributes) {