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.
- package/LICENSE +21 -0
- package/README.md +350 -0
- package/dist/dependencies.d.ts +9 -0
- package/dist/dependencies.js +51 -0
- package/dist/dependencies.js.map +1 -0
- package/dist/env.d.ts +10 -0
- package/dist/env.js +54 -0
- package/dist/env.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +320 -0
- package/dist/index.js.map +1 -0
- package/dist/org-fetch.d.ts +4 -0
- package/dist/org-fetch.js +59 -0
- package/dist/org-fetch.js.map +1 -0
- package/dist/prompts.d.ts +15 -0
- package/dist/prompts.js +358 -0
- package/dist/prompts.js.map +1 -0
- package/dist/search.d.ts +3 -0
- package/dist/search.js +17 -0
- package/dist/search.js.map +1 -0
- package/dist/types.d.ts +49 -0
- package/dist/types.js +13 -0
- package/dist/types.js.map +1 -0
- package/dist/xml-mutator.d.ts +32 -0
- package/dist/xml-mutator.js +223 -0
- package/dist/xml-mutator.js.map +1 -0
- package/package.json +54 -0
package/dist/prompts.js
ADDED
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
import inquirer from 'inquirer';
|
|
2
|
+
import autocomplete from 'inquirer-autocomplete-prompt';
|
|
3
|
+
import Fuse from 'fuse.js';
|
|
4
|
+
inquirer.registerPrompt('autocomplete', autocomplete);
|
|
5
|
+
export async function promptObjectSearch(objects) {
|
|
6
|
+
const selected = [];
|
|
7
|
+
const remaining = [...objects];
|
|
8
|
+
console.log('Start typing to search for an object. Select it to add.\n');
|
|
9
|
+
while (true) {
|
|
10
|
+
const fuse = new Fuse(remaining, { threshold: 0.4, includeScore: true });
|
|
11
|
+
const { object } = await inquirer.prompt([
|
|
12
|
+
{
|
|
13
|
+
type: 'autocomplete',
|
|
14
|
+
name: 'object',
|
|
15
|
+
message: selected.length > 0
|
|
16
|
+
? `Selected: [${selected.join(', ')}] — Search for another object (or type "done"):`
|
|
17
|
+
: 'Search for an object:',
|
|
18
|
+
source: (_answers, input) => {
|
|
19
|
+
const query = (input || '').trim();
|
|
20
|
+
if (!query) {
|
|
21
|
+
const opts = selected.length > 0 ? ['>> Done selecting objects <<', ...remaining] : remaining;
|
|
22
|
+
return Promise.resolve(opts);
|
|
23
|
+
}
|
|
24
|
+
if ('done'.startsWith(query.toLowerCase()) && selected.length > 0) {
|
|
25
|
+
return Promise.resolve([
|
|
26
|
+
'>> Done selecting objects <<',
|
|
27
|
+
...fuse.search(query).map((r) => r.item),
|
|
28
|
+
]);
|
|
29
|
+
}
|
|
30
|
+
return Promise.resolve(fuse.search(query).map((r) => r.item));
|
|
31
|
+
},
|
|
32
|
+
pageSize: 15,
|
|
33
|
+
},
|
|
34
|
+
]);
|
|
35
|
+
if (object === '>> Done selecting objects <<')
|
|
36
|
+
break;
|
|
37
|
+
selected.push(object);
|
|
38
|
+
remaining.splice(remaining.indexOf(object), 1);
|
|
39
|
+
console.log(` Added: ${object}`);
|
|
40
|
+
if (remaining.length === 0)
|
|
41
|
+
break;
|
|
42
|
+
const { addMore } = await inquirer.prompt([
|
|
43
|
+
{
|
|
44
|
+
type: 'confirm',
|
|
45
|
+
name: 'addMore',
|
|
46
|
+
message: 'Add another object?',
|
|
47
|
+
default: false,
|
|
48
|
+
},
|
|
49
|
+
]);
|
|
50
|
+
if (!addMore)
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
if (selected.length === 0) {
|
|
54
|
+
console.log('No objects selected. Exiting.');
|
|
55
|
+
process.exit(0);
|
|
56
|
+
}
|
|
57
|
+
return selected;
|
|
58
|
+
}
|
|
59
|
+
export async function promptFieldSearch(objectName, fields) {
|
|
60
|
+
const selected = [];
|
|
61
|
+
const remaining = [...fields];
|
|
62
|
+
console.log(`\nStart typing to search for a field on ${objectName}.\n`);
|
|
63
|
+
while (true) {
|
|
64
|
+
const fuse = new Fuse(remaining, { threshold: 0.4, includeScore: true });
|
|
65
|
+
const { field } = await inquirer.prompt([
|
|
66
|
+
{
|
|
67
|
+
type: 'autocomplete',
|
|
68
|
+
name: 'field',
|
|
69
|
+
message: selected.length > 0
|
|
70
|
+
? `Selected: [${selected.map((f) => f.split('.')[1]).join(', ')}] — Search for another field (or type "done"):`
|
|
71
|
+
: `Search for a field on ${objectName}:`,
|
|
72
|
+
source: (_answers, input) => {
|
|
73
|
+
const query = (input || '').trim();
|
|
74
|
+
if (!query) {
|
|
75
|
+
const opts = selected.length > 0 ? ['>> Done selecting fields <<', ...remaining] : remaining;
|
|
76
|
+
return Promise.resolve(opts);
|
|
77
|
+
}
|
|
78
|
+
if ('done'.startsWith(query.toLowerCase()) && selected.length > 0) {
|
|
79
|
+
return Promise.resolve([
|
|
80
|
+
'>> Done selecting fields <<',
|
|
81
|
+
...fuse.search(query).map((r) => r.item),
|
|
82
|
+
]);
|
|
83
|
+
}
|
|
84
|
+
return Promise.resolve(fuse.search(query).map((r) => r.item));
|
|
85
|
+
},
|
|
86
|
+
pageSize: 15,
|
|
87
|
+
},
|
|
88
|
+
]);
|
|
89
|
+
if (field === '>> Done selecting fields <<')
|
|
90
|
+
break;
|
|
91
|
+
selected.push(field);
|
|
92
|
+
remaining.splice(remaining.indexOf(field), 1);
|
|
93
|
+
console.log(` Added: ${field}`);
|
|
94
|
+
if (remaining.length === 0)
|
|
95
|
+
break;
|
|
96
|
+
const { addMore } = await inquirer.prompt([
|
|
97
|
+
{
|
|
98
|
+
type: 'confirm',
|
|
99
|
+
name: 'addMore',
|
|
100
|
+
message: 'Add another field?',
|
|
101
|
+
default: false,
|
|
102
|
+
},
|
|
103
|
+
]);
|
|
104
|
+
if (!addMore)
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
return selected;
|
|
108
|
+
}
|
|
109
|
+
export async function promptPermissionMode() {
|
|
110
|
+
const { mode } = await inquirer.prompt([
|
|
111
|
+
{
|
|
112
|
+
type: 'list',
|
|
113
|
+
name: 'mode',
|
|
114
|
+
message: 'How would you like to assign permissions?',
|
|
115
|
+
choices: [
|
|
116
|
+
{ name: 'Bulk — same permissions for all selected objects/fields', value: 'bulk' },
|
|
117
|
+
{ name: 'Granular — different permissions for each object/field', value: 'granular' },
|
|
118
|
+
],
|
|
119
|
+
},
|
|
120
|
+
]);
|
|
121
|
+
return mode;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Show existing permissions summary across permission sets.
|
|
125
|
+
* e.g. " Currently set — Sales_User: Read, Edit | Admin: Read"
|
|
126
|
+
*/
|
|
127
|
+
export function printExistingPermissions(itemName, existingByTarget) {
|
|
128
|
+
const entries = [];
|
|
129
|
+
for (const [targetName, perms] of existingByTarget) {
|
|
130
|
+
const enabled = [];
|
|
131
|
+
if ('allowRead' in perms) {
|
|
132
|
+
const p = perms;
|
|
133
|
+
if (p.allowRead)
|
|
134
|
+
enabled.push('Read');
|
|
135
|
+
if (p.allowCreate)
|
|
136
|
+
enabled.push('Create');
|
|
137
|
+
if (p.allowEdit)
|
|
138
|
+
enabled.push('Edit');
|
|
139
|
+
if (p.allowDelete)
|
|
140
|
+
enabled.push('Delete');
|
|
141
|
+
if (p.viewAllRecords)
|
|
142
|
+
enabled.push('View All');
|
|
143
|
+
if (p.modifyAllRecords)
|
|
144
|
+
enabled.push('Modify All');
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
const p = perms;
|
|
148
|
+
if (p.readable)
|
|
149
|
+
enabled.push('Read');
|
|
150
|
+
if (p.editable)
|
|
151
|
+
enabled.push('Edit');
|
|
152
|
+
}
|
|
153
|
+
if (enabled.length > 0) {
|
|
154
|
+
entries.push(`${targetName}: ${enabled.join(', ')}`);
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
entries.push(`${targetName}: (none)`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
if (entries.length > 0) {
|
|
161
|
+
console.log(` Currently set — ${entries.join(' | ')}`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Compute which permissions are enabled in ANY of the selected permission sets.
|
|
166
|
+
* This union becomes the pre-checked default so the user sees everything that's currently on.
|
|
167
|
+
*/
|
|
168
|
+
function computeObjectPermissionUnion(existingByTarget) {
|
|
169
|
+
const union = {
|
|
170
|
+
allowRead: false,
|
|
171
|
+
allowCreate: false,
|
|
172
|
+
allowEdit: false,
|
|
173
|
+
allowDelete: false,
|
|
174
|
+
viewAllRecords: false,
|
|
175
|
+
modifyAllRecords: false,
|
|
176
|
+
};
|
|
177
|
+
for (const perms of existingByTarget.values()) {
|
|
178
|
+
if (!perms)
|
|
179
|
+
continue;
|
|
180
|
+
for (const key of Object.keys(union)) {
|
|
181
|
+
if (perms[key])
|
|
182
|
+
union[key] = true;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return union;
|
|
186
|
+
}
|
|
187
|
+
function computeFieldPermissionUnion(existingByTarget) {
|
|
188
|
+
const union = { readable: false, editable: false };
|
|
189
|
+
for (const perms of existingByTarget.values()) {
|
|
190
|
+
if (!perms)
|
|
191
|
+
continue;
|
|
192
|
+
for (const key of Object.keys(union)) {
|
|
193
|
+
if (perms[key])
|
|
194
|
+
union[key] = true;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return union;
|
|
198
|
+
}
|
|
199
|
+
export async function promptObjectPermissions(objectNames, existingByTarget) {
|
|
200
|
+
const preChecked = existingByTarget
|
|
201
|
+
? computeObjectPermissionUnion(existingByTarget)
|
|
202
|
+
: undefined;
|
|
203
|
+
const permChoices = [
|
|
204
|
+
{ name: 'Read', value: 'allowRead', checked: preChecked?.allowRead ?? false },
|
|
205
|
+
{ name: 'Create', value: 'allowCreate', checked: preChecked?.allowCreate ?? false },
|
|
206
|
+
{ name: 'Edit', value: 'allowEdit', checked: preChecked?.allowEdit ?? false },
|
|
207
|
+
{ name: 'Delete', value: 'allowDelete', checked: preChecked?.allowDelete ?? false },
|
|
208
|
+
{ name: 'View All', value: 'viewAllRecords', checked: preChecked?.viewAllRecords ?? false },
|
|
209
|
+
{ name: 'Modify All', value: 'modifyAllRecords', checked: preChecked?.modifyAllRecords ?? false },
|
|
210
|
+
];
|
|
211
|
+
const label = objectNames.length === 1
|
|
212
|
+
? `Permissions for ${objectNames[0]}`
|
|
213
|
+
: `Permissions for ${objectNames.length} objects (${objectNames.slice(0, 3).join(', ')}${objectNames.length > 3 ? '...' : ''})`;
|
|
214
|
+
const { perms } = await inquirer.prompt([
|
|
215
|
+
{
|
|
216
|
+
type: 'checkbox',
|
|
217
|
+
name: 'perms',
|
|
218
|
+
message: label,
|
|
219
|
+
choices: permChoices,
|
|
220
|
+
},
|
|
221
|
+
]);
|
|
222
|
+
const selected = new Set(perms);
|
|
223
|
+
return {
|
|
224
|
+
allowRead: selected.has('allowRead'),
|
|
225
|
+
allowCreate: selected.has('allowCreate'),
|
|
226
|
+
allowEdit: selected.has('allowEdit'),
|
|
227
|
+
allowDelete: selected.has('allowDelete'),
|
|
228
|
+
viewAllRecords: selected.has('viewAllRecords'),
|
|
229
|
+
modifyAllRecords: selected.has('modifyAllRecords'),
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
export async function promptFieldPermissions(fieldNames, existingByTarget) {
|
|
233
|
+
const preChecked = existingByTarget
|
|
234
|
+
? computeFieldPermissionUnion(existingByTarget)
|
|
235
|
+
: undefined;
|
|
236
|
+
const permChoices = [
|
|
237
|
+
{ name: 'Read', value: 'readable', checked: preChecked?.readable ?? false },
|
|
238
|
+
{ name: 'Edit', value: 'editable', checked: preChecked?.editable ?? false },
|
|
239
|
+
];
|
|
240
|
+
const label = fieldNames.length === 1
|
|
241
|
+
? `Permissions for ${fieldNames[0]}`
|
|
242
|
+
: `Permissions for ${fieldNames.length} fields`;
|
|
243
|
+
const { perms } = await inquirer.prompt([
|
|
244
|
+
{
|
|
245
|
+
type: 'checkbox',
|
|
246
|
+
name: 'perms',
|
|
247
|
+
message: label,
|
|
248
|
+
choices: permChoices,
|
|
249
|
+
},
|
|
250
|
+
]);
|
|
251
|
+
const selected = new Set(perms);
|
|
252
|
+
return {
|
|
253
|
+
readable: selected.has('readable'),
|
|
254
|
+
editable: selected.has('editable'),
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
export async function promptPermissionSetSelection(targets) {
|
|
258
|
+
if (targets.length === 0) {
|
|
259
|
+
console.log('No permission set files found in the project.');
|
|
260
|
+
process.exit(1);
|
|
261
|
+
}
|
|
262
|
+
const choices = targets.map((t) => ({
|
|
263
|
+
name: t.name,
|
|
264
|
+
value: t.name,
|
|
265
|
+
}));
|
|
266
|
+
const { selected } = await inquirer.prompt([
|
|
267
|
+
{
|
|
268
|
+
type: 'checkbox',
|
|
269
|
+
name: 'selected',
|
|
270
|
+
message: 'Select permission sets to update (press <space> to select, <enter> to confirm):',
|
|
271
|
+
choices,
|
|
272
|
+
loop: false,
|
|
273
|
+
pageSize: 20,
|
|
274
|
+
},
|
|
275
|
+
]);
|
|
276
|
+
if (selected.length === 0) {
|
|
277
|
+
console.log('No permission sets selected.');
|
|
278
|
+
process.exit(0);
|
|
279
|
+
}
|
|
280
|
+
const selectedSet = new Set(selected);
|
|
281
|
+
return targets.filter((t) => selectedSet.has(t.name));
|
|
282
|
+
}
|
|
283
|
+
export function printPreview(changes, targets, existingPerms) {
|
|
284
|
+
console.log('\n--- Preview ---\n');
|
|
285
|
+
for (const target of targets) {
|
|
286
|
+
console.log(`Permission Set: ${target.name}`);
|
|
287
|
+
const targetExisting = existingPerms.get(target.name);
|
|
288
|
+
for (const change of changes) {
|
|
289
|
+
const itemName = change.selection.name;
|
|
290
|
+
const existing = targetExisting?.get(itemName) ?? null;
|
|
291
|
+
const perms = change.permissions;
|
|
292
|
+
const added = [];
|
|
293
|
+
const removed = [];
|
|
294
|
+
const unchanged = [];
|
|
295
|
+
if ('allowRead' in perms) {
|
|
296
|
+
const p = perms;
|
|
297
|
+
const e = existing ?? {
|
|
298
|
+
allowRead: false, allowCreate: false, allowEdit: false,
|
|
299
|
+
allowDelete: false, viewAllRecords: false, modifyAllRecords: false,
|
|
300
|
+
};
|
|
301
|
+
const labels = [
|
|
302
|
+
['allowRead', 'Read'], ['allowCreate', 'Create'], ['allowEdit', 'Edit'],
|
|
303
|
+
['allowDelete', 'Delete'], ['viewAllRecords', 'View All'], ['modifyAllRecords', 'Modify All'],
|
|
304
|
+
];
|
|
305
|
+
for (const [key, label] of labels) {
|
|
306
|
+
if (p[key] && !e[key])
|
|
307
|
+
added.push(label);
|
|
308
|
+
else if (!p[key] && e[key])
|
|
309
|
+
removed.push(label);
|
|
310
|
+
else if (p[key] && e[key])
|
|
311
|
+
unchanged.push(label);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
else {
|
|
315
|
+
const p = perms;
|
|
316
|
+
const e = existing ?? { readable: false, editable: false };
|
|
317
|
+
if (p.readable && !e.readable)
|
|
318
|
+
added.push('Read');
|
|
319
|
+
else if (!p.readable && e.readable)
|
|
320
|
+
removed.push('Read');
|
|
321
|
+
else if (p.readable && e.readable)
|
|
322
|
+
unchanged.push('Read');
|
|
323
|
+
if (p.editable && !e.editable)
|
|
324
|
+
added.push('Edit');
|
|
325
|
+
else if (!p.editable && e.editable)
|
|
326
|
+
removed.push('Edit');
|
|
327
|
+
else if (p.editable && e.editable)
|
|
328
|
+
unchanged.push('Edit');
|
|
329
|
+
}
|
|
330
|
+
const parts = [];
|
|
331
|
+
if (added.length > 0)
|
|
332
|
+
parts.push(`+${added.join(', ')}`);
|
|
333
|
+
if (removed.length > 0)
|
|
334
|
+
parts.push(`-${removed.join(', ')}`);
|
|
335
|
+
if (unchanged.length > 0)
|
|
336
|
+
parts.push(`=${unchanged.join(', ')}`);
|
|
337
|
+
let autoStr = '';
|
|
338
|
+
if (change.autoEnabled.length > 0) {
|
|
339
|
+
autoStr = ` (auto-enabled: ${change.autoEnabled.join(', ')})`;
|
|
340
|
+
}
|
|
341
|
+
console.log(` ${itemName}: ${parts.join(' ')}${autoStr}`);
|
|
342
|
+
}
|
|
343
|
+
console.log();
|
|
344
|
+
}
|
|
345
|
+
console.log(' Legend: +added -removed =unchanged\n');
|
|
346
|
+
}
|
|
347
|
+
export async function promptConfirm() {
|
|
348
|
+
const { confirmed } = await inquirer.prompt([
|
|
349
|
+
{
|
|
350
|
+
type: 'confirm',
|
|
351
|
+
name: 'confirmed',
|
|
352
|
+
message: 'Apply these changes?',
|
|
353
|
+
default: true,
|
|
354
|
+
},
|
|
355
|
+
]);
|
|
356
|
+
return confirmed;
|
|
357
|
+
}
|
|
358
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"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"}
|
package/dist/search.d.ts
ADDED
package/dist/search.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import Fuse from 'fuse.js';
|
|
2
|
+
export function createSearcher(items, keys) {
|
|
3
|
+
return new Fuse(items, {
|
|
4
|
+
keys,
|
|
5
|
+
threshold: 0.4,
|
|
6
|
+
includeScore: true,
|
|
7
|
+
});
|
|
8
|
+
}
|
|
9
|
+
export function fuzzySearch(searcher, query) {
|
|
10
|
+
if (!query.trim()) {
|
|
11
|
+
// Return all items when query is empty
|
|
12
|
+
const index = searcher.getIndex();
|
|
13
|
+
return index.docs;
|
|
14
|
+
}
|
|
15
|
+
return searcher.search(query).map((r) => r.item);
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,SAAS,CAAC;AAE3B,MAAM,UAAU,cAAc,CAAI,KAAU,EAAE,IAAc;IAC1D,OAAO,IAAI,IAAI,CAAC,KAAK,EAAE;QACrB,IAAI;QACJ,SAAS,EAAE,GAAG;QACd,YAAY,EAAE,IAAI;KACnB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,WAAW,CAAI,QAAiB,EAAE,KAAa;IAC7D,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAClB,uCAAuC;QACvC,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,EAA8B,CAAC;QAC9D,OAAO,KAAK,CAAC,IAAI,CAAC;IACpB,CAAC;IACD,OAAO,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACnD,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export interface OrgInfo {
|
|
2
|
+
username: string;
|
|
3
|
+
orgId: string;
|
|
4
|
+
instanceUrl: string;
|
|
5
|
+
}
|
|
6
|
+
export interface SfdxProject {
|
|
7
|
+
packageDirectories: Array<{
|
|
8
|
+
path: string;
|
|
9
|
+
default?: boolean;
|
|
10
|
+
}>;
|
|
11
|
+
}
|
|
12
|
+
export type SelectionItem = {
|
|
13
|
+
type: 'object';
|
|
14
|
+
name: string;
|
|
15
|
+
} | {
|
|
16
|
+
type: 'field';
|
|
17
|
+
name: string;
|
|
18
|
+
object: string;
|
|
19
|
+
};
|
|
20
|
+
export interface ObjectPermissions {
|
|
21
|
+
allowCreate: boolean;
|
|
22
|
+
allowDelete: boolean;
|
|
23
|
+
allowEdit: boolean;
|
|
24
|
+
allowRead: boolean;
|
|
25
|
+
modifyAllRecords: boolean;
|
|
26
|
+
viewAllRecords: boolean;
|
|
27
|
+
}
|
|
28
|
+
export interface FieldPermissions {
|
|
29
|
+
editable: boolean;
|
|
30
|
+
readable: boolean;
|
|
31
|
+
}
|
|
32
|
+
export type ObjectPermissionKey = keyof ObjectPermissions;
|
|
33
|
+
export type FieldPermissionKey = keyof FieldPermissions;
|
|
34
|
+
export interface PermissionChange {
|
|
35
|
+
selection: SelectionItem;
|
|
36
|
+
permissions: ObjectPermissions | FieldPermissions;
|
|
37
|
+
autoEnabled: string[];
|
|
38
|
+
}
|
|
39
|
+
export interface PermissionSetTarget {
|
|
40
|
+
name: string;
|
|
41
|
+
filePath: string | null;
|
|
42
|
+
label: string;
|
|
43
|
+
}
|
|
44
|
+
export interface ApplyPlan {
|
|
45
|
+
changes: PermissionChange[];
|
|
46
|
+
targets: PermissionSetTarget[];
|
|
47
|
+
}
|
|
48
|
+
export declare const OBJECT_PERMISSION_LABELS: Record<ObjectPermissionKey, string>;
|
|
49
|
+
export declare const FIELD_PERMISSION_LABELS: Record<FieldPermissionKey, string>;
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export const OBJECT_PERMISSION_LABELS = {
|
|
2
|
+
allowRead: 'Read',
|
|
3
|
+
allowCreate: 'Create',
|
|
4
|
+
allowEdit: 'Edit',
|
|
5
|
+
allowDelete: 'Delete',
|
|
6
|
+
viewAllRecords: 'View All',
|
|
7
|
+
modifyAllRecords: 'Modify All',
|
|
8
|
+
};
|
|
9
|
+
export const FIELD_PERMISSION_LABELS = {
|
|
10
|
+
readable: 'Read',
|
|
11
|
+
editable: 'Edit',
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAgDA,MAAM,CAAC,MAAM,wBAAwB,GAAwC;IAC3E,SAAS,EAAE,MAAM;IACjB,WAAW,EAAE,QAAQ;IACrB,SAAS,EAAE,MAAM;IACjB,WAAW,EAAE,QAAQ;IACrB,cAAc,EAAE,UAAU;IAC1B,gBAAgB,EAAE,YAAY;CAC/B,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAuC;IACzE,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,MAAM;CACjB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { ObjectPermissions, FieldPermissions } from './types.js';
|
|
2
|
+
interface PermSetNode {
|
|
3
|
+
[key: string]: unknown;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Read existing object permissions from a parsed permission set XML.
|
|
7
|
+
* Returns null if the object has no entry in the file.
|
|
8
|
+
*/
|
|
9
|
+
export declare function readExistingObjectPermissions(parsed: PermSetNode[], objectName: string): ObjectPermissions | null;
|
|
10
|
+
/**
|
|
11
|
+
* Read existing field permissions from a parsed permission set XML.
|
|
12
|
+
* Returns null if the field has no entry in the file.
|
|
13
|
+
*/
|
|
14
|
+
export declare function readExistingFieldPermissions(parsed: PermSetNode[], fieldName: string): FieldPermissions | null;
|
|
15
|
+
export declare function detectIndentation(content: string): string;
|
|
16
|
+
export declare function parsePermissionSetXml(filePath: string): PermSetNode[];
|
|
17
|
+
export declare function createEmptyPermissionSet(name: string, label: string): PermSetNode[];
|
|
18
|
+
/**
|
|
19
|
+
* Apply object permissions — writes the exact state provided.
|
|
20
|
+
* The caller is responsible for showing the user existing state and
|
|
21
|
+
* letting them toggle permissions on/off.
|
|
22
|
+
*/
|
|
23
|
+
export declare function applyObjectPermission(parsed: PermSetNode[], objectName: string, perms: ObjectPermissions): void;
|
|
24
|
+
/**
|
|
25
|
+
* Apply field permissions — writes the exact state provided.
|
|
26
|
+
* The caller is responsible for showing the user existing state and
|
|
27
|
+
* letting them toggle permissions on/off.
|
|
28
|
+
*/
|
|
29
|
+
export declare function applyFieldPermission(parsed: PermSetNode[], fieldName: string, perms: FieldPermissions): void;
|
|
30
|
+
export declare function serializePermissionSetXml(parsed: PermSetNode[], indent?: string): string;
|
|
31
|
+
export declare function writePermissionSetFile(filePath: string, content: string): void;
|
|
32
|
+
export {};
|