permcraft 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,223 @@
1
+ import { XMLParser, XMLBuilder } from 'fast-xml-parser';
2
+ import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';
3
+ import { dirname } from 'node:path';
4
+ const PARSER_OPTIONS = {
5
+ ignoreAttributes: false,
6
+ preserveOrder: true,
7
+ commentPropName: '#comment',
8
+ parseTagValue: false,
9
+ trimValues: true,
10
+ };
11
+ const BUILDER_OPTIONS = {
12
+ ignoreAttributes: false,
13
+ preserveOrder: true,
14
+ commentPropName: '#comment',
15
+ format: true,
16
+ indentBy: ' ',
17
+ suppressEmptyNode: false,
18
+ };
19
+ function boolStr(val) {
20
+ return val ? 'true' : 'false';
21
+ }
22
+ function buildObjectPermissionNode(objectName, perms) {
23
+ return [
24
+ {
25
+ objectPermissions: [
26
+ { allowCreate: [{ '#text': boolStr(perms.allowCreate) }] },
27
+ { allowDelete: [{ '#text': boolStr(perms.allowDelete) }] },
28
+ { allowEdit: [{ '#text': boolStr(perms.allowEdit) }] },
29
+ { allowRead: [{ '#text': boolStr(perms.allowRead) }] },
30
+ { modifyAllRecords: [{ '#text': boolStr(perms.modifyAllRecords) }] },
31
+ { object: [{ '#text': objectName }] },
32
+ { viewAllRecords: [{ '#text': boolStr(perms.viewAllRecords) }] },
33
+ ],
34
+ },
35
+ ];
36
+ }
37
+ function buildFieldPermissionNode(fieldName, perms) {
38
+ return [
39
+ {
40
+ fieldPermissions: [
41
+ { editable: [{ '#text': boolStr(perms.editable) }] },
42
+ { field: [{ '#text': fieldName }] },
43
+ { readable: [{ '#text': boolStr(perms.readable) }] },
44
+ ],
45
+ },
46
+ ];
47
+ }
48
+ function getTextValue(nodes, tagName) {
49
+ for (const node of nodes) {
50
+ if (tagName in node) {
51
+ const children = node[tagName];
52
+ if (children && children.length > 0 && '#text' in children[0]) {
53
+ return children[0]['#text'];
54
+ }
55
+ }
56
+ }
57
+ return undefined;
58
+ }
59
+ function setTextValue(nodes, tagName, value) {
60
+ for (const node of nodes) {
61
+ if (tagName in node) {
62
+ const children = node[tagName];
63
+ if (children && children.length > 0) {
64
+ children[0]['#text'] = value;
65
+ }
66
+ return;
67
+ }
68
+ }
69
+ // If not found, add it
70
+ nodes.push({ [tagName]: [{ '#text': value }] });
71
+ }
72
+ /**
73
+ * Read existing object permissions from a parsed permission set XML.
74
+ * Returns null if the object has no entry in the file.
75
+ */
76
+ export function readExistingObjectPermissions(parsed, objectName) {
77
+ const root = findPermSetRoot(parsed);
78
+ const existing = findExistingNode(root, 'objectPermissions', 'object', objectName);
79
+ if (!existing)
80
+ return null;
81
+ const inner = existing.node['objectPermissions'];
82
+ return {
83
+ allowRead: getTextValue(inner, 'allowRead') === 'true',
84
+ allowCreate: getTextValue(inner, 'allowCreate') === 'true',
85
+ allowEdit: getTextValue(inner, 'allowEdit') === 'true',
86
+ allowDelete: getTextValue(inner, 'allowDelete') === 'true',
87
+ viewAllRecords: getTextValue(inner, 'viewAllRecords') === 'true',
88
+ modifyAllRecords: getTextValue(inner, 'modifyAllRecords') === 'true',
89
+ };
90
+ }
91
+ /**
92
+ * Read existing field permissions from a parsed permission set XML.
93
+ * Returns null if the field has no entry in the file.
94
+ */
95
+ export function readExistingFieldPermissions(parsed, fieldName) {
96
+ const root = findPermSetRoot(parsed);
97
+ const existing = findExistingNode(root, 'fieldPermissions', 'field', fieldName);
98
+ if (!existing)
99
+ return null;
100
+ const inner = existing.node['fieldPermissions'];
101
+ return {
102
+ readable: getTextValue(inner, 'readable') === 'true',
103
+ editable: getTextValue(inner, 'editable') === 'true',
104
+ };
105
+ }
106
+ export function detectIndentation(content) {
107
+ const match = content.match(/^( +|\t+)</m);
108
+ return match ? match[1] : ' ';
109
+ }
110
+ export function parsePermissionSetXml(filePath) {
111
+ const content = readFileSync(filePath, 'utf-8');
112
+ const parser = new XMLParser(PARSER_OPTIONS);
113
+ return parser.parse(content);
114
+ }
115
+ export function createEmptyPermissionSet(name, label) {
116
+ const xml = `<?xml version="1.0" encoding="UTF-8"?>
117
+ <PermissionSet xmlns="http://soap.sforce.com/2006/04/metadata">
118
+ <hasActivationRequired>false</hasActivationRequired>
119
+ <label>${label}</label>
120
+ </PermissionSet>`;
121
+ const parser = new XMLParser(PARSER_OPTIONS);
122
+ return parser.parse(xml);
123
+ }
124
+ function findPermSetRoot(parsed) {
125
+ for (const node of parsed) {
126
+ if ('PermissionSet' in node) {
127
+ return node['PermissionSet'];
128
+ }
129
+ }
130
+ throw new Error('Invalid permission set XML: no <PermissionSet> root element found');
131
+ }
132
+ function findExistingNode(children, tag, identifierTag, identifierValue) {
133
+ for (let i = 0; i < children.length; i++) {
134
+ const child = children[i];
135
+ if (tag in child) {
136
+ const innerNodes = child[tag];
137
+ const val = getTextValue(innerNodes, identifierTag);
138
+ if (val === identifierValue) {
139
+ return { node: child, index: i };
140
+ }
141
+ }
142
+ }
143
+ return null;
144
+ }
145
+ function findInsertionIndex(children, tag, identifierTag, identifierValue) {
146
+ let lastTagIndex = -1;
147
+ let insertAfterAll = -1;
148
+ for (let i = 0; i < children.length; i++) {
149
+ if (tag in children[i]) {
150
+ lastTagIndex = i;
151
+ const innerNodes = children[i][tag];
152
+ const val = getTextValue(innerNodes, identifierTag);
153
+ if (val && val.localeCompare(identifierValue) < 0) {
154
+ insertAfterAll = i;
155
+ }
156
+ }
157
+ }
158
+ if (lastTagIndex === -1) {
159
+ return children.length;
160
+ }
161
+ return insertAfterAll + 1 === 0 ? lastTagIndex : insertAfterAll + 1;
162
+ }
163
+ /**
164
+ * Apply object permissions — writes the exact state provided.
165
+ * The caller is responsible for showing the user existing state and
166
+ * letting them toggle permissions on/off.
167
+ */
168
+ export function applyObjectPermission(parsed, objectName, perms) {
169
+ const root = findPermSetRoot(parsed);
170
+ const existing = findExistingNode(root, 'objectPermissions', 'object', objectName);
171
+ if (existing) {
172
+ const inner = existing.node['objectPermissions'];
173
+ setTextValue(inner, 'allowCreate', boolStr(perms.allowCreate));
174
+ setTextValue(inner, 'allowDelete', boolStr(perms.allowDelete));
175
+ setTextValue(inner, 'allowEdit', boolStr(perms.allowEdit));
176
+ setTextValue(inner, 'allowRead', boolStr(perms.allowRead));
177
+ setTextValue(inner, 'modifyAllRecords', boolStr(perms.modifyAllRecords));
178
+ setTextValue(inner, 'viewAllRecords', boolStr(perms.viewAllRecords));
179
+ }
180
+ else {
181
+ const newNode = buildObjectPermissionNode(objectName, perms);
182
+ const idx = findInsertionIndex(root, 'objectPermissions', 'object', objectName);
183
+ root.splice(idx, 0, ...newNode);
184
+ }
185
+ }
186
+ /**
187
+ * Apply field permissions — writes the exact state provided.
188
+ * The caller is responsible for showing the user existing state and
189
+ * letting them toggle permissions on/off.
190
+ */
191
+ export function applyFieldPermission(parsed, fieldName, perms) {
192
+ const root = findPermSetRoot(parsed);
193
+ const existing = findExistingNode(root, 'fieldPermissions', 'field', fieldName);
194
+ if (existing) {
195
+ const inner = existing.node['fieldPermissions'];
196
+ setTextValue(inner, 'editable', boolStr(perms.editable));
197
+ setTextValue(inner, 'readable', boolStr(perms.readable));
198
+ }
199
+ else {
200
+ const newNode = buildFieldPermissionNode(fieldName, perms);
201
+ const idx = findInsertionIndex(root, 'fieldPermissions', 'field', fieldName);
202
+ root.splice(idx, 0, ...newNode);
203
+ }
204
+ }
205
+ export function serializePermissionSetXml(parsed, indent = ' ') {
206
+ const builder = new XMLBuilder({ ...BUILDER_OPTIONS, indentBy: indent });
207
+ let xml = builder.build(parsed);
208
+ // Collapse any multiple consecutive blank lines into a single newline
209
+ xml = xml.replace(/\n\s*\n/g, '\n');
210
+ // Ensure trailing newline
211
+ if (!xml.endsWith('\n')) {
212
+ xml += '\n';
213
+ }
214
+ return xml;
215
+ }
216
+ export function writePermissionSetFile(filePath, content) {
217
+ const dir = dirname(filePath);
218
+ if (!existsSync(dir)) {
219
+ mkdirSync(dir, { recursive: true });
220
+ }
221
+ writeFileSync(filePath, content, 'utf-8');
222
+ }
223
+ //# sourceMappingURL=xml-mutator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xml-mutator.js","sourceRoot":"","sources":["../src/xml-mutator.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "permcraft",
3
+ "version": "0.1.0",
4
+ "description": "Interactive CLI to manage Salesforce permission set XML files",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "bin": {
8
+ "permcraft": "./dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "scripts": {
14
+ "build": "tsc",
15
+ "dev": "tsx src/index.ts",
16
+ "test": "vitest run",
17
+ "test:watch": "vitest",
18
+ "lint": "eslint src/ --ext .ts",
19
+ "format": "prettier --write 'src/**/*.ts'",
20
+ "prepublishOnly": "npm run build && npm test"
21
+ },
22
+ "keywords": [
23
+ "salesforce",
24
+ "permission-set",
25
+ "sfdx",
26
+ "cli"
27
+ ],
28
+ "license": "MIT",
29
+ "repository": {
30
+ "type": "git",
31
+ "url": "https://github.com/Akif90/sf-permission-set-cli.git"
32
+ },
33
+ "engines": {
34
+ "node": ">=18"
35
+ },
36
+ "devDependencies": {
37
+ "@types/inquirer": "^9.0.7",
38
+ "@types/inquirer-autocomplete-prompt": "^3.0.3",
39
+ "@types/node": "^20.11.0",
40
+ "@typescript-eslint/eslint-plugin": "^7.0.0",
41
+ "@typescript-eslint/parser": "^7.0.0",
42
+ "eslint": "^8.56.0",
43
+ "prettier": "^3.2.0",
44
+ "tsx": "^4.7.0",
45
+ "typescript": "^5.3.0",
46
+ "vitest": "^1.2.0"
47
+ },
48
+ "dependencies": {
49
+ "fast-xml-parser": "^4.3.0",
50
+ "fuse.js": "^7.0.0",
51
+ "inquirer": "^9.2.0",
52
+ "inquirer-autocomplete-prompt": "^3.0.1"
53
+ }
54
+ }