@simplysf/simply-permissions 1.2.7 → 1.2.8

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.
@@ -43,6 +43,10 @@ export type PermissionSetTemplateData = {
43
43
  /**
44
44
  * Render a complete PermissionSet metadata XML document from template data.
45
45
  *
46
+ * Element text content is set via `.txt()`, which xmlbuilder2 escapes for us — there's no
47
+ * hand-rolled escaping (and no risk of it drifting out of sync with what's actually unsafe in
48
+ * XML text content).
49
+ *
46
50
  * @param data - The permission set's label, description, and permission entries.
47
51
  * @returns The rendered `<PermissionSet>` XML document, ready to write to a `.permissionset-meta.xml` file.
48
52
  */
@@ -13,75 +13,101 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- /**
17
- * @param value - The raw string to escape.
18
- * @returns `value` with XML special characters (`& < > " '`) replaced by their entity references.
19
- */
20
- function escapeXml(value) {
21
- return value
22
- .replace(/&/g, '&amp;')
23
- .replace(/</g, '&lt;')
24
- .replace(/>/g, '&gt;')
25
- .replace(/"/g, '&quot;')
26
- .replace(/'/g, '&apos;');
27
- }
16
+ import { create } from 'xmlbuilder2';
28
17
  /**
29
18
  * Render a complete PermissionSet metadata XML document from template data.
30
19
  *
20
+ * Element text content is set via `.txt()`, which xmlbuilder2 escapes for us — there's no
21
+ * hand-rolled escaping (and no risk of it drifting out of sync with what's actually unsafe in
22
+ * XML text content).
23
+ *
31
24
  * @param data - The permission set's label, description, and permission entries.
32
25
  * @returns The rendered `<PermissionSet>` XML document, ready to write to a `.permissionset-meta.xml` file.
33
26
  */
34
27
  export function buildPermissionSetXml(data) {
35
- const objectPermissionsXml = data.objectPermissions
36
- .map((permission) => ` <objectPermissions>
37
- <allowCreate>${permission.allowCreate}</allowCreate>
38
- <allowDelete>${permission.allowDelete}</allowDelete>
39
- <allowEdit>${permission.allowEdit}</allowEdit>
40
- <allowRead>${permission.allowRead}</allowRead>
41
- <object>${escapeXml(permission.object)}</object>
42
- <modifyAllRecords>${permission.modifyAllRecords}</modifyAllRecords>
43
- <viewAllRecords>${permission.viewAllRecords}</viewAllRecords>
44
- <viewAllFields>${permission.viewAllFields}</viewAllFields>
45
- </objectPermissions>`)
46
- .join('\n');
47
- const fieldPermissionsXml = data.fieldPermissions
48
- .map((permission) => ` <fieldPermissions>
49
- <field>${escapeXml(permission.field)}</field>
50
- <readable>${permission.readable}</readable>
51
- <editable>${permission.editable}</editable>
52
- </fieldPermissions>`)
53
- .join('\n');
54
- const tabSettingsXml = data.tabSettings
55
- .map((setting) => ` <tabSettings>
56
- <tab>${escapeXml(setting.tab)}</tab>
57
- <visibility>${setting.visible ? 'Visible' : 'Hidden'}</visibility>
58
- </tabSettings>`)
59
- .join('\n');
60
- const recordTypeVisibilitiesXml = data.recordTypeVisibilities
61
- .map((visibility) => ` <recordTypeVisibilities>
62
- <recordType>${escapeXml(visibility.recordType)}</recordType>
63
- <visible>${visibility.visible}</visible>
64
- </recordTypeVisibilities>`)
65
- .join('\n');
66
- const userPermissionsXml = data.userPermissions
67
- .map((permission) => ` <userPermissions>
68
- <name>${escapeXml(permission.name)}</name>
69
- <enabled>${permission.enabled}</enabled>
70
- </userPermissions>`)
71
- .join('\n');
72
- const sections = [
73
- ` <label>${escapeXml(data.label)}</label>`,
74
- data.description ? ` <description>${escapeXml(data.description)}</description>` : '',
75
- objectPermissionsXml,
76
- fieldPermissionsXml,
77
- tabSettingsXml,
78
- recordTypeVisibilitiesXml,
79
- userPermissionsXml,
80
- ].filter(Boolean);
81
- return `<?xml version="1.0" encoding="UTF-8"?>
82
- <PermissionSet xmlns="http://soap.sforce.com/2006/04/metadata">
83
- ${sections.join('\n')}
84
- </PermissionSet>
85
- `;
28
+ const root = create({ version: '1.0', encoding: 'UTF-8' }).ele('PermissionSet', {
29
+ xmlns: 'http://soap.sforce.com/2006/04/metadata',
30
+ });
31
+ root.ele('label').txt(data.label).up();
32
+ if (data.description) {
33
+ root.ele('description').txt(data.description).up();
34
+ }
35
+ for (const permission of data.objectPermissions) {
36
+ root
37
+ .ele('objectPermissions')
38
+ .ele('allowCreate')
39
+ .txt(String(permission.allowCreate))
40
+ .up()
41
+ .ele('allowDelete')
42
+ .txt(String(permission.allowDelete))
43
+ .up()
44
+ .ele('allowEdit')
45
+ .txt(String(permission.allowEdit))
46
+ .up()
47
+ .ele('allowRead')
48
+ .txt(String(permission.allowRead))
49
+ .up()
50
+ .ele('object')
51
+ .txt(permission.object)
52
+ .up()
53
+ .ele('modifyAllRecords')
54
+ .txt(String(permission.modifyAllRecords))
55
+ .up()
56
+ .ele('viewAllRecords')
57
+ .txt(String(permission.viewAllRecords))
58
+ .up()
59
+ .ele('viewAllFields')
60
+ .txt(String(permission.viewAllFields))
61
+ .up()
62
+ .up();
63
+ }
64
+ for (const permission of data.fieldPermissions) {
65
+ root
66
+ .ele('fieldPermissions')
67
+ .ele('field')
68
+ .txt(permission.field)
69
+ .up()
70
+ .ele('readable')
71
+ .txt(String(permission.readable))
72
+ .up()
73
+ .ele('editable')
74
+ .txt(String(permission.editable))
75
+ .up()
76
+ .up();
77
+ }
78
+ for (const setting of data.tabSettings) {
79
+ root
80
+ .ele('tabSettings')
81
+ .ele('tab')
82
+ .txt(setting.tab)
83
+ .up()
84
+ .ele('visibility')
85
+ .txt(setting.visible ? 'Visible' : 'Hidden')
86
+ .up()
87
+ .up();
88
+ }
89
+ for (const visibility of data.recordTypeVisibilities) {
90
+ root
91
+ .ele('recordTypeVisibilities')
92
+ .ele('recordType')
93
+ .txt(visibility.recordType)
94
+ .up()
95
+ .ele('visible')
96
+ .txt(String(visibility.visible))
97
+ .up()
98
+ .up();
99
+ }
100
+ for (const permission of data.userPermissions) {
101
+ root
102
+ .ele('userPermissions')
103
+ .ele('name')
104
+ .txt(permission.name)
105
+ .up()
106
+ .ele('enabled')
107
+ .txt(String(permission.enabled))
108
+ .up()
109
+ .up();
110
+ }
111
+ return root.end({ prettyPrint: true });
86
112
  }
87
113
  //# sourceMappingURL=permissionSetXmlTemplate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"permissionSetXmlTemplate.js","sourceRoot":"","sources":["../../src/common/permissionSetXmlTemplate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAkDH;;;GAGG;AACH,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,KAAK;SACT,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAA+B;IACnE,MAAM,oBAAoB,GAAG,IAAI,CAAC,iBAAiB;SAChD,GAAG,CACF,CAAC,UAAU,EAAE,EAAE,CAAC;mBACH,UAAU,CAAC,WAAW;mBACtB,UAAU,CAAC,WAAW;iBACxB,UAAU,CAAC,SAAS;iBACpB,UAAU,CAAC,SAAS;cACvB,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC;wBAClB,UAAU,CAAC,gBAAgB;sBAC7B,UAAU,CAAC,cAAc;qBAC1B,UAAU,CAAC,aAAa;uBACtB,CAClB;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,mBAAmB,GAAG,IAAI,CAAC,gBAAgB;SAC9C,GAAG,CACF,CAAC,UAAU,EAAE,EAAE,CAAC;aACT,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC;gBACxB,UAAU,CAAC,QAAQ;gBACnB,UAAU,CAAC,QAAQ;sBACb,CACjB;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW;SACpC,GAAG,CACF,CAAC,OAAO,EAAE,EAAE,CAAC;WACR,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC;kBACf,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ;iBACvC,CACZ;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,yBAAyB,GAAG,IAAI,CAAC,sBAAsB;SAC1D,GAAG,CACF,CAAC,UAAU,EAAE,EAAE,CAAC;kBACJ,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC;eACnC,UAAU,CAAC,OAAO;4BACL,CACvB;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,kBAAkB,GAAG,IAAI,CAAC,eAAe;SAC5C,GAAG,CACF,CAAC,UAAU,EAAE,EAAE,CAAC;YACV,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC;eACvB,UAAU,CAAC,OAAO;qBACZ,CAChB;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,QAAQ,GAAG;QACf,YAAY,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU;QAC3C,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,kBAAkB,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE;QACrF,oBAAoB;QACpB,mBAAmB;QACnB,cAAc;QACd,yBAAyB;QACzB,kBAAkB;KACnB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAElB,OAAO;;EAEP,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;;CAEpB,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"permissionSetXmlTemplate.js","sourceRoot":"","sources":["../../src/common/permissionSetXmlTemplate.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@simplysf/simply-permissions",
3
3
  "description": "Utilities for working with permissions",
4
- "version": "1.2.7",
4
+ "version": "1.2.8",
5
5
  "author": "@ClayChipps",
6
6
  "homepage": "https://github.com/SimplySF/simply",
7
7
  "bugs": "https://github.com/SimplySF/simply/issues",
@@ -61,7 +61,8 @@
61
61
  "@salesforce/kit": "^3.2.6",
62
62
  "@salesforce/sf-plugins-core": "^12.2.16",
63
63
  "@salesforce/source-deploy-retrieve": "^12.37.2",
64
- "@simplysf/simply-core": "^1.1.3",
64
+ "@simplysf/simply-core": "^1.1.4",
65
+ "xmlbuilder2": "^4.0.3",
65
66
  "zod": "^4.1.12"
66
67
  },
67
68
  "devDependencies": {
@@ -208,5 +209,5 @@
208
209
  "output": []
209
210
  }
210
211
  },
211
- "gitHead": "c8f2c684566e7cdb98a1ee0186eadbc932cebb61"
212
+ "gitHead": "6fadc80de8d12b2d91070cd8c35e60d727a3391d"
212
213
  }