sf-plugin-permission-sets 0.3.1 → 0.4.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.md +28 -0
- package/README.md +141 -23
- package/lib/adapters/connection-org-client.d.ts +7 -3
- package/lib/adapters/connection-org-client.d.ts.map +1 -1
- package/lib/adapters/connection-org-client.js +94 -63
- package/lib/adapters/connection-org-client.js.map +1 -1
- package/lib/adapters/index.d.ts +2 -0
- package/lib/adapters/index.d.ts.map +1 -0
- package/lib/adapters/index.js +2 -0
- package/lib/adapters/index.js.map +1 -0
- package/lib/commands/ps/apply.d.ts +28 -1
- package/lib/commands/ps/apply.d.ts.map +1 -1
- package/lib/commands/ps/apply.js +155 -35
- package/lib/commands/ps/apply.js.map +1 -1
- package/lib/commands/ps/check.d.ts +3 -1
- package/lib/commands/ps/check.d.ts.map +1 -1
- package/lib/commands/ps/check.js +15 -6
- package/lib/commands/ps/check.js.map +1 -1
- package/lib/commands/ps/export.d.ts +11 -2
- package/lib/commands/ps/export.d.ts.map +1 -1
- package/lib/commands/ps/export.js +53 -7
- package/lib/commands/ps/export.js.map +1 -1
- package/lib/commands/ps/plan.d.ts +19 -1
- package/lib/commands/ps/plan.d.ts.map +1 -1
- package/lib/commands/ps/plan.js +121 -30
- package/lib/commands/ps/plan.js.map +1 -1
- package/lib/commands/ps/validate.d.ts +3 -1
- package/lib/commands/ps/validate.d.ts.map +1 -1
- package/lib/commands/ps/validate.js +16 -7
- package/lib/commands/ps/validate.js.map +1 -1
- package/lib/core/finding.d.ts +3 -2
- package/lib/core/finding.d.ts.map +1 -1
- package/lib/core/finding.js +1 -1
- package/lib/core/finding.js.map +1 -1
- package/lib/core/index.d.ts +11 -0
- package/lib/core/index.d.ts.map +1 -0
- package/lib/core/index.js +10 -0
- package/lib/core/index.js.map +1 -0
- package/lib/core/load.d.ts.map +1 -1
- package/lib/core/load.js +17 -10
- package/lib/core/load.js.map +1 -1
- package/lib/core/mode.d.ts +18 -0
- package/lib/core/mode.d.ts.map +1 -0
- package/lib/core/mode.js +16 -0
- package/lib/core/mode.js.map +1 -0
- package/lib/core/model.d.ts +5 -0
- package/lib/core/model.d.ts.map +1 -1
- package/lib/core/normalize.d.ts +2 -0
- package/lib/core/normalize.d.ts.map +1 -1
- package/lib/core/normalize.js +7 -0
- package/lib/core/normalize.js.map +1 -1
- package/lib/core/plan-file.d.ts +61 -0
- package/lib/core/plan-file.d.ts.map +1 -0
- package/lib/core/plan-file.js +74 -0
- package/lib/core/plan-file.js.map +1 -0
- package/lib/core/report.d.ts +2 -1
- package/lib/core/report.d.ts.map +1 -1
- package/lib/core/report.js +32 -21
- package/lib/core/report.js.map +1 -1
- package/lib/core/schema.d.ts +2 -12
- package/lib/core/schema.d.ts.map +1 -1
- package/lib/core/schema.js +2 -2
- package/lib/core/schema.js.map +1 -1
- package/lib/services/adapters/index.d.ts +2 -0
- package/lib/services/adapters/index.d.ts.map +1 -0
- package/lib/services/adapters/index.js +2 -0
- package/lib/services/adapters/index.js.map +1 -0
- package/lib/services/adapters/org-client.d.ts +3 -3
- package/lib/services/adapters/org-client.d.ts.map +1 -1
- package/lib/services/apply.d.ts +21 -11
- package/lib/services/apply.d.ts.map +1 -1
- package/lib/services/apply.js +54 -37
- package/lib/services/apply.js.map +1 -1
- package/lib/services/check.d.ts +3 -7
- package/lib/services/check.d.ts.map +1 -1
- package/lib/services/check.js +5 -12
- package/lib/services/check.js.map +1 -1
- package/lib/services/export.d.ts +11 -6
- package/lib/services/export.d.ts.map +1 -1
- package/lib/services/export.js +14 -10
- package/lib/services/export.js.map +1 -1
- package/lib/services/index.d.ts +7 -0
- package/lib/services/index.d.ts.map +1 -0
- package/lib/services/index.js +7 -0
- package/lib/services/index.js.map +1 -0
- package/lib/services/plan.d.ts +7 -10
- package/lib/services/plan.d.ts.map +1 -1
- package/lib/services/plan.js +28 -18
- package/lib/services/plan.js.map +1 -1
- package/lib/services/resolution.d.ts +6 -6
- package/lib/services/resolution.d.ts.map +1 -1
- package/lib/services/resolution.js +21 -9
- package/lib/services/resolution.js.map +1 -1
- package/lib/services/validate.d.ts +7 -7
- package/lib/services/validate.d.ts.map +1 -1
- package/lib/services/validate.js +20 -13
- package/lib/services/validate.js.map +1 -1
- package/messages/ps.apply.md +34 -2
- package/messages/ps.check.md +1 -1
- package/messages/ps.export.md +21 -1
- package/messages/ps.plan.md +8 -0
- package/messages/ps.validate.md +1 -1
- package/package.json +18 -14
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../src/core/normalize.ts"],"names":[],"mappings":"AAEA,OAAO,EAAW,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAI7F,qFAAqF;AACrF,MAAM,CAAC,MAAM,QAAQ,GAA4B;IAC7C,CAAC,eAAe,EAAE,gBAAgB,CAAC;IACnC,CAAC,oBAAoB,EAAE,qBAAqB,CAAC;IAC7C,CAAC,sBAAsB,EAAE,uBAAuB,CAAC;CACpD,CAAC;
|
|
1
|
+
{"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../src/core/normalize.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* The saved-plan format version. Bump when the shape changes incompatibly, so an
|
|
4
|
+
* `apply --plan` on an old file fails loudly instead of misreading it.
|
|
5
|
+
*/
|
|
6
|
+
export declare const savedPlanVersion = 1;
|
|
7
|
+
declare const savedPlanSchema: z.ZodObject<{
|
|
8
|
+
version: z.ZodLiteral<1>;
|
|
9
|
+
org: z.ZodString;
|
|
10
|
+
mode: z.ZodEnum<{
|
|
11
|
+
additive: "additive";
|
|
12
|
+
destructive: "destructive";
|
|
13
|
+
sync: "sync";
|
|
14
|
+
}>;
|
|
15
|
+
add: z.ZodArray<z.ZodObject<{
|
|
16
|
+
assignee: z.ZodString;
|
|
17
|
+
kind: z.ZodEnum<{
|
|
18
|
+
permissionSet: "permissionSet";
|
|
19
|
+
permissionSetGroup: "permissionSetGroup";
|
|
20
|
+
permissionSetLicense: "permissionSetLicense";
|
|
21
|
+
}>;
|
|
22
|
+
target: z.ZodString;
|
|
23
|
+
expiration: z.ZodOptional<z.ZodString>;
|
|
24
|
+
assigneeId: z.ZodString;
|
|
25
|
+
targetId: z.ZodString;
|
|
26
|
+
}, z.core.$strict>>;
|
|
27
|
+
update: z.ZodArray<z.ZodObject<{
|
|
28
|
+
recordId: z.ZodString;
|
|
29
|
+
assignee: z.ZodString;
|
|
30
|
+
kind: z.ZodEnum<{
|
|
31
|
+
permissionSet: "permissionSet";
|
|
32
|
+
permissionSetGroup: "permissionSetGroup";
|
|
33
|
+
permissionSetLicense: "permissionSetLicense";
|
|
34
|
+
}>;
|
|
35
|
+
target: z.ZodString;
|
|
36
|
+
expiration: z.ZodOptional<z.ZodString>;
|
|
37
|
+
previousExpiration: z.ZodOptional<z.ZodString>;
|
|
38
|
+
}, z.core.$strict>>;
|
|
39
|
+
remove: z.ZodArray<z.ZodObject<{
|
|
40
|
+
recordId: z.ZodString;
|
|
41
|
+
assignee: z.ZodString;
|
|
42
|
+
kind: z.ZodEnum<{
|
|
43
|
+
permissionSet: "permissionSet";
|
|
44
|
+
permissionSetGroup: "permissionSetGroup";
|
|
45
|
+
permissionSetLicense: "permissionSetLicense";
|
|
46
|
+
}>;
|
|
47
|
+
target: z.ZodString;
|
|
48
|
+
expiration: z.ZodOptional<z.ZodString>;
|
|
49
|
+
}, z.core.$strict>>;
|
|
50
|
+
}, z.core.$strict>;
|
|
51
|
+
/** A reviewed, resolved change set frozen to a file, ready for `apply` to run verbatim. */
|
|
52
|
+
export type SavedPlan = z.infer<typeof savedPlanSchema>;
|
|
53
|
+
/** Serialize a plan to its on-disk YAML form. */
|
|
54
|
+
export declare function serializePlan(plan: SavedPlan): string;
|
|
55
|
+
/** Parse and validate a plan file's text. Returns the plan, or a single error message describing why it is invalid. */
|
|
56
|
+
export declare function parsePlan(content: string): {
|
|
57
|
+
plan?: SavedPlan;
|
|
58
|
+
error?: string;
|
|
59
|
+
};
|
|
60
|
+
export {};
|
|
61
|
+
//# sourceMappingURL=plan-file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-file.d.ts","sourceRoot":"","sources":["../../src/core/plan-file.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;GAGG;AACH,eAAO,MAAM,gBAAgB,IAAI,CAAC;AA2ClC,QAAA,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAOnB,CAAC;AAEH,2FAA2F;AAC3F,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAExD,iDAAiD;AACjD,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAErD;AAED,uHAAuH;AACvH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,IAAI,CAAC,EAAE,SAAS,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAkB/E"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { parse, stringify } from 'yaml';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
/**
|
|
4
|
+
* The saved-plan format version. Bump when the shape changes incompatibly, so an
|
|
5
|
+
* `apply --plan` on an old file fails loudly instead of misreading it.
|
|
6
|
+
*/
|
|
7
|
+
export const savedPlanVersion = 1;
|
|
8
|
+
const kind = z.enum([
|
|
9
|
+
'permissionSet',
|
|
10
|
+
'permissionSetGroup',
|
|
11
|
+
'permissionSetLicense',
|
|
12
|
+
]);
|
|
13
|
+
const mode = z.enum([
|
|
14
|
+
'additive',
|
|
15
|
+
'destructive',
|
|
16
|
+
'sync',
|
|
17
|
+
]);
|
|
18
|
+
/** A resolved addition: the assignment plus the org ids needed to insert it. */
|
|
19
|
+
const resolvedAddition = z.strictObject({
|
|
20
|
+
assignee: z.string().min(1),
|
|
21
|
+
kind,
|
|
22
|
+
target: z.string().min(1),
|
|
23
|
+
expiration: z.string().min(1).optional(),
|
|
24
|
+
assigneeId: z.string().min(1),
|
|
25
|
+
targetId: z.string().min(1),
|
|
26
|
+
});
|
|
27
|
+
/** An expiration change on an existing record. */
|
|
28
|
+
const assignmentUpdate = z.strictObject({
|
|
29
|
+
recordId: z.string().min(1),
|
|
30
|
+
assignee: z.string().min(1),
|
|
31
|
+
kind,
|
|
32
|
+
target: z.string().min(1),
|
|
33
|
+
expiration: z.string().min(1).optional(),
|
|
34
|
+
previousExpiration: z.string().min(1).optional(),
|
|
35
|
+
});
|
|
36
|
+
/** An existing record to remove, carrying its id. */
|
|
37
|
+
const actualAssignment = z.strictObject({
|
|
38
|
+
recordId: z.string().min(1),
|
|
39
|
+
assignee: z.string().min(1),
|
|
40
|
+
kind,
|
|
41
|
+
target: z.string().min(1),
|
|
42
|
+
expiration: z.string().min(1).optional(),
|
|
43
|
+
});
|
|
44
|
+
const savedPlanSchema = z.strictObject({
|
|
45
|
+
version: z.literal(savedPlanVersion),
|
|
46
|
+
org: z.string().min(1),
|
|
47
|
+
mode,
|
|
48
|
+
add: z.array(resolvedAddition),
|
|
49
|
+
update: z.array(assignmentUpdate),
|
|
50
|
+
remove: z.array(actualAssignment),
|
|
51
|
+
});
|
|
52
|
+
/** Serialize a plan to its on-disk YAML form. */
|
|
53
|
+
export function serializePlan(plan) {
|
|
54
|
+
return stringify(plan);
|
|
55
|
+
}
|
|
56
|
+
/** Parse and validate a plan file's text. Returns the plan, or a single error message describing why it is invalid. */
|
|
57
|
+
export function parsePlan(content) {
|
|
58
|
+
let data;
|
|
59
|
+
try {
|
|
60
|
+
data = parse(content);
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
return { error: `invalid YAML: ${err.message}` };
|
|
64
|
+
}
|
|
65
|
+
const result = savedPlanSchema.safeParse(data);
|
|
66
|
+
if (!result.success) {
|
|
67
|
+
const detail = result.error.issues
|
|
68
|
+
.map((issue) => `${issue.path.join('.') || '(root)'}: ${issue.message}`)
|
|
69
|
+
.join('; ');
|
|
70
|
+
return { error: detail };
|
|
71
|
+
}
|
|
72
|
+
return { plan: result.data };
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=plan-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-file.js","sourceRoot":"","sources":["../../src/core/plan-file.ts"],"names":[],"mappings":"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"}
|
package/lib/core/report.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Diff, ReconcileMode } from './model.js';
|
|
2
2
|
/** What the report shows: the mode selects which operations, plus whether to list unchanged. */
|
|
3
|
-
|
|
3
|
+
type ReportOptions = {
|
|
4
4
|
mode: ReconcileMode;
|
|
5
5
|
showUnchanged: boolean;
|
|
6
6
|
};
|
|
@@ -11,4 +11,5 @@ export type ReportOptions = {
|
|
|
11
11
|
* and targets with nothing to show are omitted. Shared by plan and apply.
|
|
12
12
|
*/
|
|
13
13
|
export declare function formatDiff(diff: Diff, options: ReportOptions): string[];
|
|
14
|
+
export {};
|
|
14
15
|
//# sourceMappingURL=report.d.ts.map
|
package/lib/core/report.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/core/report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAQ,aAAa,EAAE,MAAM,YAAY,CAAC;AAiBvD,gGAAgG;AAChG,
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/core/report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAQ,aAAa,EAAE,MAAM,YAAY,CAAC;AAiBvD,gGAAgG;AAChG,KAAK,aAAa,GAAG;IACjB,IAAI,EAAE,aAAa,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;CAC1B,CAAC;AA2FF;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,GAAG,MAAM,EAAE,CAoBvE"}
|
package/lib/core/report.js
CHANGED
|
@@ -39,13 +39,8 @@ function withTransition(assignee, previous, next) {
|
|
|
39
39
|
const to = next ? canonicalExpiration(next) : 'never';
|
|
40
40
|
return `${assignee} expires ${from} → ${to}`;
|
|
41
41
|
}
|
|
42
|
-
/**
|
|
43
|
-
|
|
44
|
-
* updates, `-` removes, and `=` unchanged. The mode scopes which operations appear (additive
|
|
45
|
-
* hides removes, destructive hides adds and updates), unchanged lines appear only when asked,
|
|
46
|
-
* and targets with nothing to show are omitted. Shared by plan and apply.
|
|
47
|
-
*/
|
|
48
|
-
export function formatDiff(diff, options) {
|
|
42
|
+
/** Group a diff into per-kind, per-target buckets, keeping only the operations the mode shows. */
|
|
43
|
+
function collectBuckets(diff, options) {
|
|
49
44
|
const showAdditive = options.mode !== 'destructive';
|
|
50
45
|
const showDestructive = options.mode !== 'additive';
|
|
51
46
|
const byKind = new Map();
|
|
@@ -70,26 +65,42 @@ export function formatDiff(diff, options) {
|
|
|
70
65
|
bucketFor(byKind, assignment.kind, assignment.target).unchanged.set(assignment.assignee, assignment.expiration);
|
|
71
66
|
}
|
|
72
67
|
}
|
|
68
|
+
return byKind;
|
|
69
|
+
}
|
|
70
|
+
/** The `+`/`~`/`-`/`=` lines for one target, each group sorted by assignee. Empty when nothing shows. */
|
|
71
|
+
function renderBucket(bucket) {
|
|
72
|
+
const entries = [];
|
|
73
|
+
for (const assignee of [...bucket.adds.keys()].sort()) {
|
|
74
|
+
entries.push(` + ${withExpiry(assignee, bucket.adds.get(assignee))}`);
|
|
75
|
+
}
|
|
76
|
+
for (const assignee of [...bucket.updates.keys()].sort()) {
|
|
77
|
+
const change = bucket.updates.get(assignee);
|
|
78
|
+
entries.push(` ~ ${withTransition(assignee, change.previous, change.next)}`);
|
|
79
|
+
}
|
|
80
|
+
for (const assignee of [...bucket.removes].sort())
|
|
81
|
+
entries.push(` - ${assignee}`);
|
|
82
|
+
for (const assignee of [...bucket.unchanged.keys()].sort()) {
|
|
83
|
+
entries.push(` = ${withExpiry(assignee, bucket.unchanged.get(assignee))}`);
|
|
84
|
+
}
|
|
85
|
+
return entries;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Render a diff as a plan body, grouped by kind then target, with `+` adds, `~` expiration
|
|
89
|
+
* updates, `-` removes, and `=` unchanged. The mode scopes which operations appear (additive
|
|
90
|
+
* hides removes, destructive hides adds and updates), unchanged lines appear only when asked,
|
|
91
|
+
* and targets with nothing to show are omitted. Shared by plan and apply.
|
|
92
|
+
*/
|
|
93
|
+
export function formatDiff(diff, options) {
|
|
94
|
+
const byKind = collectBuckets(diff, options);
|
|
73
95
|
const lines = [];
|
|
74
96
|
for (const [kind] of kindKeys) {
|
|
75
97
|
const byTarget = byKind.get(kind);
|
|
76
98
|
if (!byTarget)
|
|
77
99
|
continue;
|
|
100
|
+
const sorted = [...byTarget].sort((left, right) => left[0].localeCompare(right[0]));
|
|
78
101
|
const targetLines = [];
|
|
79
|
-
for (const [target, bucket] of
|
|
80
|
-
const entries =
|
|
81
|
-
for (const assignee of [...bucket.adds.keys()].sort()) {
|
|
82
|
-
entries.push(` + ${withExpiry(assignee, bucket.adds.get(assignee))}`);
|
|
83
|
-
}
|
|
84
|
-
for (const assignee of [...bucket.updates.keys()].sort()) {
|
|
85
|
-
const change = bucket.updates.get(assignee);
|
|
86
|
-
entries.push(` ~ ${withTransition(assignee, change.previous, change.next)}`);
|
|
87
|
-
}
|
|
88
|
-
for (const assignee of [...bucket.removes].sort())
|
|
89
|
-
entries.push(` - ${assignee}`);
|
|
90
|
-
for (const assignee of [...bucket.unchanged.keys()].sort()) {
|
|
91
|
-
entries.push(` = ${withExpiry(assignee, bucket.unchanged.get(assignee))}`);
|
|
92
|
-
}
|
|
102
|
+
for (const [target, bucket] of sorted) {
|
|
103
|
+
const entries = renderBucket(bucket);
|
|
93
104
|
if (entries.length === 0)
|
|
94
105
|
continue;
|
|
95
106
|
targetLines.push(` ${target}`, ...entries);
|
package/lib/core/report.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/core/report.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAS1C,uFAAuF;AACvF,MAAM,UAAU,GAAyB;IACrC,aAAa,EAAE,iBAAiB;IAChC,kBAAkB,EAAE,uBAAuB;IAC3C,oBAAoB,EAAE,yBAAyB;CAClD,CAAC;AAQF,SAAS,SAAS,CAAC,MAA0C,EAAE,IAAU,EAAE,MAAc;IACrF,IAAI,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACZ,QAAQ,GAAG,IAAI,GAAG,EAAE,CAAC;QACrB,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAClC,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,MAAM,GAAG,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;QAC3F,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,SAAS,mBAAmB,CAAC,KAAa;IACtC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACjC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IAEvC,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC;IACjC,OAAO,OAAO,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;AAC3D,CAAC;AAED,uEAAuE;AACvE,SAAS,UAAU,CAAC,QAAgB,EAAE,UAA8B;IAChE,OAAO,UAAU,CAAC,CAAC,CAAC,GAAG,QAAQ,cAAc,mBAAmB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC9F,CAAC;AAED,oGAAoG;AACpG,SAAS,cAAc,CAAC,QAAgB,EAAE,QAA4B,EAAE,IAAwB;IAC5F,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAChE,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IACtD,OAAO,GAAG,QAAQ,cAAc,IAAI,MAAM,EAAE,EAAE,CAAC;AACnD,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/core/report.ts"],"names":[],"mappings":"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"}
|
package/lib/core/schema.d.ts
CHANGED
|
@@ -1,17 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { Finding } from './finding.js';
|
|
3
|
-
|
|
4
|
-
permissionSets: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
|
|
5
|
-
name: z.ZodString;
|
|
6
|
-
expiration: z.ZodISODateTime;
|
|
7
|
-
}, z.core.$strict>]>>>;
|
|
8
|
-
permissionSetGroups: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
|
|
9
|
-
name: z.ZodString;
|
|
10
|
-
expiration: z.ZodISODateTime;
|
|
11
|
-
}, z.core.$strict>]>>>;
|
|
12
|
-
permissionSetLicenses: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
13
|
-
}, z.core.$strict>;
|
|
14
|
-
export declare const fileSchema: z.ZodObject<{
|
|
3
|
+
declare const fileSchema: z.ZodObject<{
|
|
15
4
|
users: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
16
5
|
permissionSets: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
|
|
17
6
|
name: z.ZodString;
|
|
@@ -30,4 +19,5 @@ export declare function validateFile(data: unknown, file: string): {
|
|
|
30
19
|
data?: FileShape;
|
|
31
20
|
findings: Finding[];
|
|
32
21
|
};
|
|
22
|
+
export {};
|
|
33
23
|
//# sourceMappingURL=schema.d.ts.map
|
package/lib/core/schema.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/core/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAe,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/core/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAe,MAAM,cAAc,CAAC;AA4BpD,QAAA,MAAM,UAAU;;;;;;;;;;;;kBAEd,CAAC;AAEH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAEnD,wFAAwF;AACxF,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG;IAAE,IAAI,CAAC,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,OAAO,EAAE,CAAA;CAAE,CAUnG"}
|
package/lib/core/schema.js
CHANGED
|
@@ -14,12 +14,12 @@ const expiringList = z.array(z.union([
|
|
|
14
14
|
]));
|
|
15
15
|
/** Licenses cannot expire (PermissionSetLicenseAssign has no ExpirationDate), so names only. */
|
|
16
16
|
const plainList = z.array(name);
|
|
17
|
-
|
|
17
|
+
const userEntrySchema = z.strictObject({
|
|
18
18
|
permissionSets: expiringList.optional(),
|
|
19
19
|
permissionSetGroups: expiringList.optional(),
|
|
20
20
|
permissionSetLicenses: plainList.optional(),
|
|
21
21
|
});
|
|
22
|
-
|
|
22
|
+
const fileSchema = z.strictObject({
|
|
23
23
|
users: z.record(z.string().min(1), userEntrySchema),
|
|
24
24
|
});
|
|
25
25
|
/** Validate a parsed object against the file contract, turning issues into findings. */
|
package/lib/core/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/core/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAW,WAAW,EAAE,MAAM,cAAc,CAAC;AAEpD,0BAA0B;AAC1B,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAE/B,qCAAqC;AACrC,MAAM,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;AAEpD,0EAA0E;AAC1E,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CACxB,CAAC,CAAC,KAAK,CAAC;IACJ,IAAI;IACJ,CAAC,CAAC,YAAY,CAAC;QACX,IAAI;QACJ,UAAU;KACb,CAAC;CACL,CAAC,CACL,CAAC;AAEF,gGAAgG;AAChG,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAEhC,MAAM,
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/core/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAW,WAAW,EAAE,MAAM,cAAc,CAAC;AAEpD,0BAA0B;AAC1B,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAE/B,qCAAqC;AACrC,MAAM,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;AAEpD,0EAA0E;AAC1E,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CACxB,CAAC,CAAC,KAAK,CAAC;IACJ,IAAI;IACJ,CAAC,CAAC,YAAY,CAAC;QACX,IAAI;QACJ,UAAU;KACb,CAAC;CACL,CAAC,CACL,CAAC;AAEF,gGAAgG;AAChG,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAEhC,MAAM,eAAe,GAAG,CAAC,CAAC,YAAY,CAAC;IACnC,cAAc,EAAE,YAAY,CAAC,QAAQ,EAAE;IACvC,mBAAmB,EAAE,YAAY,CAAC,QAAQ,EAAE;IAC5C,qBAAqB,EAAE,SAAS,CAAC,QAAQ,EAAE;CAC9C,CAAC,CAAC;AAEH,MAAM,UAAU,GAAG,CAAC,CAAC,YAAY,CAAC;IAC9B,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC;CACtD,CAAC,CAAC;AAIH,wFAAwF;AACxF,MAAM,UAAU,YAAY,CAAC,IAAa,EAAE,IAAY;IACpD,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC/C,CAAC;IACD,OAAO;QACH,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACxC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CACrE;KACJ,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/adapters/index.ts"],"names":[],"mappings":""}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ActualAssignment, AssignmentOutcome, AssignmentUpdate, DesiredAssignment, Kind, OrgTarget, OrgUser, ResolvedAddition, TargetRef } from '../../core/
|
|
1
|
+
import { ActualAssignment, AssignmentFilter, AssignmentOutcome, AssignmentUpdate, DesiredAssignment, Kind, OrgTarget, OrgUser, ResolvedAddition, TargetRef } from '../../core/index.js';
|
|
2
2
|
/**
|
|
3
3
|
* Port: the org operations a service needs, in domain terms. Declared here, by the
|
|
4
4
|
* consumer, so services depend on the abstraction and the adapter implements it.
|
|
@@ -8,8 +8,8 @@ export interface OrgClient {
|
|
|
8
8
|
findUsers(usernames: string[]): Promise<OrgUser[]>;
|
|
9
9
|
/** The targets (with ids) that exist in the org, among the given names of one kind. */
|
|
10
10
|
findTargets(kind: Kind, names: string[]): Promise<OrgTarget[]>;
|
|
11
|
-
/** Every assignable permission set, group, and license assignment held by active users. */
|
|
12
|
-
listAssignments(): Promise<DesiredAssignment[]>;
|
|
11
|
+
/** Every assignable permission set, group, and license assignment held by active users, narrowed by the filter. */
|
|
12
|
+
listAssignments(filter?: AssignmentFilter): Promise<DesiredAssignment[]>;
|
|
13
13
|
/** The current assignments of the given managed targets, with their record ids. */
|
|
14
14
|
currentAssignments(targets: TargetRef[]): Promise<ActualAssignment[]>;
|
|
15
15
|
/** Insert the given assignments, reporting per-record success or failure. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"org-client.d.ts","sourceRoot":"","sources":["../../../src/services/adapters/org-client.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,IAAI,EACJ,SAAS,EACT,OAAO,EACP,gBAAgB,EAChB,SAAS,EACZ,MAAM,qBAAqB,CAAC;AAE7B;;;GAGG;AACH,MAAM,WAAW,SAAS;IACtB,kEAAkE;IAClE,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACnD,uFAAuF;IACvF,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAC/D,
|
|
1
|
+
{"version":3,"file":"org-client.d.ts","sourceRoot":"","sources":["../../../src/services/adapters/org-client.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,IAAI,EACJ,SAAS,EACT,OAAO,EACP,gBAAgB,EAChB,SAAS,EACZ,MAAM,qBAAqB,CAAC;AAE7B;;;GAGG;AACH,MAAM,WAAW,SAAS;IACtB,kEAAkE;IAClE,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACnD,uFAAuF;IACvF,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAC/D,mHAAmH;IACnH,eAAe,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACzE,mFAAmF;IACnF,kBAAkB,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACtE,6EAA6E;IAC7E,cAAc,CAAC,SAAS,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAC5E,+FAA+F;IAC/F,iBAAiB,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAC7E,0FAA0F;IAC1F,iBAAiB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;CACjF"}
|
package/lib/services/apply.d.ts
CHANGED
|
@@ -1,12 +1,18 @@
|
|
|
1
|
-
import { AssignmentOutcome, Diff } from '../core/
|
|
2
|
-
import {
|
|
3
|
-
import { OrgClient } from './adapters/org-client.js';
|
|
1
|
+
import { AssignmentOutcome, Diff, SavedPlan, Finding } from '../core/index.js';
|
|
2
|
+
import { OrgClient } from './adapters/index.js';
|
|
4
3
|
export type ApplyMode = 'additive' | 'destructive' | 'sync';
|
|
4
|
+
/** How the service asks its caller to approve a destructive batch before applying it. */
|
|
5
|
+
export type ConfirmDeletions = (count: number) => Promise<boolean>;
|
|
5
6
|
export type ApplyInput = {
|
|
6
7
|
mode: ApplyMode;
|
|
7
8
|
maxDeletes: number;
|
|
8
9
|
dryRun: boolean;
|
|
9
10
|
};
|
|
11
|
+
/** The inputs a saved-plan apply needs. The mode is already baked into the plan. */
|
|
12
|
+
export type ApplyPlanInput = {
|
|
13
|
+
maxDeletes: number;
|
|
14
|
+
dryRun: boolean;
|
|
15
|
+
};
|
|
10
16
|
/** How a run ended, so the command can report and set the exit code. */
|
|
11
17
|
export type ApplyStatus = 'applied' | 'dry-run' | 'declined' | 'max-deletes-exceeded' | 'invalid';
|
|
12
18
|
export type ApplyResult = {
|
|
@@ -24,17 +30,21 @@ export type ApplyResult = {
|
|
|
24
30
|
failed: boolean;
|
|
25
31
|
};
|
|
26
32
|
/**
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
33
|
+
* Load the files, resolve every reference to an org id, diff against the org's
|
|
34
|
+
* current state, then add and/or remove per the mode. Deletions are capped by
|
|
35
|
+
* maxDeletes and gated by an injected confirmation.
|
|
30
36
|
*/
|
|
31
37
|
export declare class ApplyService {
|
|
32
38
|
private readonly org;
|
|
33
|
-
private readonly files;
|
|
34
|
-
private readonly input;
|
|
35
39
|
private readonly confirmDeletions;
|
|
36
|
-
constructor(org: OrgClient,
|
|
37
|
-
run(): Promise<ApplyResult>;
|
|
38
|
-
|
|
40
|
+
constructor(org: OrgClient, confirmDeletions: ConfirmDeletions);
|
|
41
|
+
run(files: string[], input: ApplyInput): Promise<ApplyResult>;
|
|
42
|
+
/**
|
|
43
|
+
* Apply a saved plan verbatim: no load, resolve, or diff. The plan is already
|
|
44
|
+
* mode-scoped and resolved, so there is no drift and no findings. maxDeletes and
|
|
45
|
+
* the deletion confirmation still guard the run.
|
|
46
|
+
*/
|
|
47
|
+
runPlan(plan: SavedPlan, input: ApplyPlanInput): Promise<ApplyResult>;
|
|
48
|
+
private executeResolved;
|
|
39
49
|
}
|
|
40
50
|
//# sourceMappingURL=apply.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../../src/services/apply.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../../src/services/apply.ts"],"names":[],"mappings":"AAAA,OAAO,EAKH,iBAAiB,EAEjB,IAAI,EAEJ,SAAS,EACT,OAAO,EAEV,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGhD,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,aAAa,GAAG,MAAM,CAAC;AAE5D,yFAAyF;AACzF,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAEnE,MAAM,MAAM,UAAU,GAAG;IACrB,IAAI,EAAE,SAAS,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,oFAAoF;AACpF,MAAM,MAAM,cAAc,GAAG;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;CACnB,CAAC;AAIF,wEAAwE;AACxE,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,sBAAsB,GAAG,SAAS,CAAC;AAElG,MAAM,MAAM,WAAW,GAAG;IACtB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,IAAI,EAAE,IAAI,CAAC;IACX,+DAA+D;IAC/D,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1D,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;CACnB,CAAC;AAiBF;;;;GAIG;AACH,qBAAa,YAAY;IAEjB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,gBAAgB;gBADhB,GAAG,EAAE,SAAS,EACd,gBAAgB,EAAE,gBAAgB;IAG1C,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IAqD1E;;;;OAIG;IACU,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC;YA0BpE,eAAe;CAiBhC"}
|
package/lib/services/apply.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { loadFiles } from '../core/
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
import { ResolutionService, managedTargets } from './resolution.js';
|
|
1
|
+
import { loadFiles, diffAssignments, scopeToMode, countFindings, } from '../core/index.js';
|
|
2
|
+
import { ResolutionService, managedTargets, resolveAdditions } from './resolution.js';
|
|
3
|
+
const noDrift = { adds: 0, updates: 0, removes: 0 };
|
|
5
4
|
const emptyDiff = { toAdd: [], toUpdate: [], toRemove: [], unchanged: [] };
|
|
6
5
|
/** An aborted-before-any-change result, carrying the findings that explain why. */
|
|
7
6
|
function invalidResult(files, findings) {
|
|
@@ -16,43 +15,37 @@ function invalidResult(files, findings) {
|
|
|
16
15
|
};
|
|
17
16
|
}
|
|
18
17
|
/**
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
18
|
+
* Load the files, resolve every reference to an org id, diff against the org's
|
|
19
|
+
* current state, then add and/or remove per the mode. Deletions are capped by
|
|
20
|
+
* maxDeletes and gated by an injected confirmation.
|
|
22
21
|
*/
|
|
23
22
|
export class ApplyService {
|
|
24
23
|
org;
|
|
25
|
-
files;
|
|
26
|
-
input;
|
|
27
24
|
confirmDeletions;
|
|
28
|
-
constructor(org,
|
|
25
|
+
constructor(org, confirmDeletions) {
|
|
29
26
|
this.org = org;
|
|
30
|
-
this.files = files;
|
|
31
|
-
this.input = input;
|
|
32
27
|
this.confirmDeletions = confirmDeletions;
|
|
33
28
|
}
|
|
34
|
-
async run() {
|
|
35
|
-
const loaded = await loadFiles(
|
|
36
|
-
|
|
29
|
+
async run(files, input) {
|
|
30
|
+
const loaded = await loadFiles(files);
|
|
31
|
+
const loadCounts = countFindings(loaded.findings);
|
|
32
|
+
if (loadCounts.errors > 0) {
|
|
37
33
|
return invalidResult(loaded.files, loaded.findings);
|
|
38
34
|
}
|
|
39
|
-
const resolutionService = new ResolutionService(this.org
|
|
40
|
-
const resolution = await resolutionService.run();
|
|
41
|
-
const findings = [
|
|
42
|
-
|
|
35
|
+
const resolutionService = new ResolutionService(this.org);
|
|
36
|
+
const resolution = await resolutionService.run(loaded.assignments);
|
|
37
|
+
const findings = [
|
|
38
|
+
...loaded.findings,
|
|
39
|
+
...resolution.findings,
|
|
40
|
+
];
|
|
41
|
+
const findingCounts = countFindings(findings);
|
|
42
|
+
if (findingCounts.errors > 0) {
|
|
43
43
|
return invalidResult(loaded.files, findings);
|
|
44
44
|
}
|
|
45
45
|
const actual = await this.org.currentAssignments(managedTargets(resolution));
|
|
46
46
|
const diff = diffAssignments(loaded.assignments, actual);
|
|
47
|
-
const { mode, maxDeletes, dryRun } =
|
|
48
|
-
const additions
|
|
49
|
-
const updates = mode === 'destructive' ? [] : diff.toUpdate;
|
|
50
|
-
const removals = mode === 'additive' ? [] : diff.toRemove;
|
|
51
|
-
const drift = {
|
|
52
|
-
adds: mode === 'destructive' ? diff.toAdd.length : 0,
|
|
53
|
-
updates: mode === 'destructive' ? diff.toUpdate.length : 0,
|
|
54
|
-
removes: mode === 'additive' ? diff.toRemove.length : 0,
|
|
55
|
-
};
|
|
47
|
+
const { mode, maxDeletes, dryRun } = input;
|
|
48
|
+
const { additions, updates, removals, drift } = scopeToMode(diff, mode);
|
|
56
49
|
if (removals.length > maxDeletes) {
|
|
57
50
|
return {
|
|
58
51
|
files: loaded.files,
|
|
@@ -73,22 +66,46 @@ export class ApplyService {
|
|
|
73
66
|
return { files: loaded.files, findings, diff, drift, outcomes: [], status: 'declined', failed: false };
|
|
74
67
|
}
|
|
75
68
|
}
|
|
76
|
-
const outcomes = await this.
|
|
69
|
+
const outcomes = await this.executeResolved(resolveAdditions(additions, resolution), updates, removals);
|
|
77
70
|
const failed = outcomes.some((outcome) => !outcome.success);
|
|
78
71
|
return { files: loaded.files, findings, diff, drift, outcomes, status: 'applied', failed };
|
|
79
72
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
73
|
+
/**
|
|
74
|
+
* Apply a saved plan verbatim: no load, resolve, or diff. The plan is already
|
|
75
|
+
* mode-scoped and resolved, so there is no drift and no findings. maxDeletes and
|
|
76
|
+
* the deletion confirmation still guard the run.
|
|
77
|
+
*/
|
|
78
|
+
async runPlan(plan, input) {
|
|
79
|
+
const diff = { toAdd: plan.add, toUpdate: plan.update, toRemove: plan.remove, unchanged: [] };
|
|
80
|
+
const { maxDeletes, dryRun } = input;
|
|
81
|
+
const base = { files: [], findings: [], diff, drift: noDrift, outcomes: [] };
|
|
82
|
+
if (plan.remove.length > maxDeletes) {
|
|
83
|
+
return { ...base, status: 'max-deletes-exceeded', failed: true };
|
|
84
|
+
}
|
|
85
|
+
if (dryRun) {
|
|
86
|
+
return { ...base, status: 'dry-run', failed: false };
|
|
87
|
+
}
|
|
88
|
+
if (plan.remove.length > 0) {
|
|
89
|
+
const confirmed = await this.confirmDeletions(plan.remove.length);
|
|
90
|
+
if (!confirmed) {
|
|
91
|
+
return { ...base, status: 'declined', failed: false };
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
const outcomes = await this.executeResolved(plan.add, plan.update, plan.remove);
|
|
95
|
+
const failed = outcomes.some((outcome) => !outcome.success);
|
|
96
|
+
return { ...base, outcomes, status: 'applied', failed };
|
|
97
|
+
}
|
|
98
|
+
async executeResolved(additions, updates, removals) {
|
|
86
99
|
const [added, updated, removed] = await Promise.all([
|
|
87
|
-
|
|
100
|
+
additions.length > 0 ? this.org.addAssignments(additions) : Promise.resolve([]),
|
|
88
101
|
updates.length > 0 ? this.org.updateAssignments(updates) : Promise.resolve([]),
|
|
89
102
|
removals.length > 0 ? this.org.removeAssignments(removals) : Promise.resolve([]),
|
|
90
103
|
]);
|
|
91
|
-
return [
|
|
104
|
+
return [
|
|
105
|
+
...added,
|
|
106
|
+
...updated,
|
|
107
|
+
...removed,
|
|
108
|
+
];
|
|
92
109
|
}
|
|
93
110
|
}
|
|
94
111
|
//# sourceMappingURL=apply.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apply.js","sourceRoot":"","sources":["../../src/services/apply.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"apply.js","sourceRoot":"","sources":["../../src/services/apply.ts"],"names":[],"mappings":"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"}
|
package/lib/services/check.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { DesiredAssignment } from '../core/
|
|
2
|
-
import { Finding } from '../core/finding.js';
|
|
1
|
+
import { DesiredAssignment, Finding } from '../core/index.js';
|
|
3
2
|
export type CheckResult = {
|
|
4
3
|
files: string[];
|
|
5
4
|
assignments: DesiredAssignment[];
|
|
@@ -8,11 +7,8 @@ export type CheckResult = {
|
|
|
8
7
|
warnings: number;
|
|
9
8
|
failed: boolean;
|
|
10
9
|
};
|
|
11
|
-
/**
|
|
10
|
+
/** Load the files, validate them, and summarize the findings. No org needed. */
|
|
12
11
|
export declare class CheckService {
|
|
13
|
-
|
|
14
|
-
private readonly strict;
|
|
15
|
-
constructor(files: string[], strict: boolean);
|
|
16
|
-
run(): Promise<CheckResult>;
|
|
12
|
+
run(files: string[], strict: boolean): Promise<CheckResult>;
|
|
17
13
|
}
|
|
18
14
|
//# sourceMappingURL=check.d.ts.map
|