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 +12 -0
- package/CONTRIBUTING.md +1 -1
- package/README.md +26 -4
- package/disassemble.log +93 -96
- package/dist/index.cjs +84 -77
- package/dist/index.cjs.map +1 -1
- package/dist/index.min.cjs +1 -1
- package/dist/index.min.cjs.map +1 -1
- package/dist/index.min.mjs +1 -1
- package/dist/index.min.mjs.map +1 -1
- package/dist/index.min.umd.js +1 -1
- package/dist/index.min.umd.js.map +1 -1
- package/dist/index.mjs +84 -77
- package/dist/index.mjs.map +1 -1
- package/dist/index.umd.js +87 -80
- package/dist/index.umd.js.map +1 -1
- package/dist/typings/service/buildLeafFile.d.ts +1 -0
- package/dist/typings/service/buildNestedFiles.d.ts +2 -0
- package/dist/typings/service/buildReassembledFiles.d.ts +1 -1
- package/dist/typings/service/buildXMLString.d.ts +2 -0
- package/dist/typings/service/reassembleXMLFileHandler.d.ts +1 -1
- package/package.json +1 -1
- package/dist/typings/service/buildNestedElements.d.ts +0 -2
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
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
|
-
|
|
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
|
|
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
|
-
|
|
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-
|
|
2
|
-
[2024-03-
|
|
3
|
-
[2024-03-
|
|
4
|
-
[2024-03-
|
|
5
|
-
[2024-03-
|
|
6
|
-
[2024-03-
|
|
7
|
-
[2024-03-
|
|
8
|
-
[2024-03-
|
|
9
|
-
[2024-03-
|
|
10
|
-
[2024-03-
|
|
11
|
-
[2024-03-
|
|
12
|
-
[2024-03-
|
|
13
|
-
[2024-03-
|
|
14
|
-
[2024-03-
|
|
15
|
-
[2024-03-
|
|
16
|
-
[2024-03-
|
|
17
|
-
[2024-03-
|
|
18
|
-
[2024-03-
|
|
19
|
-
[2024-03-
|
|
20
|
-
[2024-03-
|
|
21
|
-
[2024-03-
|
|
22
|
-
[2024-03-
|
|
23
|
-
[2024-03-
|
|
24
|
-
[2024-03-
|
|
25
|
-
[2024-03-
|
|
26
|
-
[2024-03-
|
|
27
|
-
[2024-03-
|
|
28
|
-
[2024-03-
|
|
29
|
-
[2024-03-
|
|
30
|
-
[2024-03-
|
|
31
|
-
[2024-03-
|
|
32
|
-
[2024-03-
|
|
33
|
-
[2024-03-
|
|
34
|
-
[2024-03-
|
|
35
|
-
[2024-03-
|
|
36
|
-
[2024-03-
|
|
37
|
-
[2024-03-
|
|
38
|
-
[2024-03-
|
|
39
|
-
[2024-03-
|
|
40
|
-
[2024-03-
|
|
41
|
-
[2024-03-
|
|
42
|
-
[2024-03-
|
|
43
|
-
[2024-03-
|
|
44
|
-
[2024-03-
|
|
45
|
-
[2024-03-
|
|
46
|
-
[2024-03-
|
|
47
|
-
[2024-03-
|
|
48
|
-
[2024-03-
|
|
49
|
-
[2024-03-
|
|
50
|
-
[2024-03-
|
|
51
|
-
[2024-03-
|
|
52
|
-
[2024-03-
|
|
53
|
-
[2024-03-
|
|
54
|
-
[2024-03-
|
|
55
|
-
[2024-03-
|
|
56
|
-
[2024-03-
|
|
57
|
-
[2024-03-
|
|
58
|
-
[2024-03-
|
|
59
|
-
[2024-03-
|
|
60
|
-
[2024-03-
|
|
61
|
-
[2024-03-
|
|
62
|
-
[2024-03-
|
|
63
|
-
[2024-03-
|
|
64
|
-
[2024-03-
|
|
65
|
-
[2024-03-
|
|
66
|
-
[2024-03-
|
|
67
|
-
[2024-03-
|
|
68
|
-
[2024-03-
|
|
69
|
-
[2024-03-
|
|
70
|
-
[2024-03-
|
|
71
|
-
[2024-03-
|
|
72
|
-
[2024-03-
|
|
73
|
-
[2024-03-
|
|
74
|
-
[2024-03-
|
|
75
|
-
[2024-03-
|
|
76
|
-
[2024-03-
|
|
77
|
-
[2024-03-
|
|
78
|
-
[2024-03-
|
|
79
|
-
[2024-03-
|
|
80
|
-
[2024-03-
|
|
81
|
-
[2024-03-
|
|
82
|
-
[2024-03-
|
|
83
|
-
[2024-03-
|
|
84
|
-
[2024-03-
|
|
85
|
-
[2024-03-
|
|
86
|
-
[2024-03-
|
|
87
|
-
[2024-03-
|
|
88
|
-
[2024-03-
|
|
89
|
-
[2024-03-
|
|
90
|
-
[2024-03-
|
|
91
|
-
[2024-03-
|
|
92
|
-
[2024-03-
|
|
93
|
-
[2024-03-
|
|
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,
|
|
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
|
-
|
|
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${
|
|
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
|
|
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
|
-
|
|
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 =
|
|
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
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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,
|
|
207
|
-
yield buildReassembledFile(combinedXmlContents, filePath, rootElementName,
|
|
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(`
|
|
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
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
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
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
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,
|
|
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,
|
|
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
|
-
|
|
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) {
|