@syntax-syllogism/warden-core 0.2.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/CHANGELOG.md +22 -0
- package/LICENSE +21 -0
- package/README.md +111 -0
- package/lib/access/assignees.d.ts +27 -0
- package/lib/access/assignees.js +139 -0
- package/lib/access/assignees.js.map +1 -0
- package/lib/access/messages.d.ts +1 -0
- package/lib/access/messages.js +24 -0
- package/lib/access/messages.js.map +1 -0
- package/lib/access/metadata.d.ts +41 -0
- package/lib/access/metadata.js +168 -0
- package/lib/access/metadata.js.map +1 -0
- package/lib/access/muting.d.ts +7 -0
- package/lib/access/muting.js +22 -0
- package/lib/access/muting.js.map +1 -0
- package/lib/access/output.d.ts +12 -0
- package/lib/access/output.js +108 -0
- package/lib/access/output.js.map +1 -0
- package/lib/access/resolvers/field.d.ts +2 -0
- package/lib/access/resolvers/field.js +93 -0
- package/lib/access/resolvers/field.js.map +1 -0
- package/lib/access/resolvers/index.d.ts +2 -0
- package/lib/access/resolvers/index.js +22 -0
- package/lib/access/resolvers/index.js.map +1 -0
- package/lib/access/resolvers/object.d.ts +2 -0
- package/lib/access/resolvers/object.js +101 -0
- package/lib/access/resolvers/object.js.map +1 -0
- package/lib/access/resolvers/recordType.d.ts +2 -0
- package/lib/access/resolvers/recordType.js +181 -0
- package/lib/access/resolvers/recordType.js.map +1 -0
- package/lib/access/resolvers/setupEntity.d.ts +4 -0
- package/lib/access/resolvers/setupEntity.js +43 -0
- package/lib/access/resolvers/setupEntity.js.map +1 -0
- package/lib/access/resolvers/tab.d.ts +2 -0
- package/lib/access/resolvers/tab.js +36 -0
- package/lib/access/resolvers/tab.js.map +1 -0
- package/lib/access/reverse.d.ts +9 -0
- package/lib/access/reverse.js +429 -0
- package/lib/access/reverse.js.map +1 -0
- package/lib/access/soql.d.ts +6 -0
- package/lib/access/soql.js +31 -0
- package/lib/access/soql.js.map +1 -0
- package/lib/access/targetValidation.d.ts +7 -0
- package/lib/access/targetValidation.js +110 -0
- package/lib/access/targetValidation.js.map +1 -0
- package/lib/access/types.d.ts +88 -0
- package/lib/access/types.js +20 -0
- package/lib/access/types.js.map +1 -0
- package/lib/errors.d.ts +18 -0
- package/lib/errors.js +39 -0
- package/lib/errors.js.map +1 -0
- package/lib/index.d.ts +37 -0
- package/lib/index.js +33 -0
- package/lib/index.js.map +1 -0
- package/lib/lifecycle/assignmentState.d.ts +62 -0
- package/lib/lifecycle/assignmentState.js +89 -0
- package/lib/lifecycle/assignmentState.js.map +1 -0
- package/lib/lifecycle/conformance.d.ts +10 -0
- package/lib/lifecycle/conformance.js +59 -0
- package/lib/lifecycle/conformance.js.map +1 -0
- package/lib/lifecycle/diffOutput.d.ts +7 -0
- package/lib/lifecycle/diffOutput.js +94 -0
- package/lib/lifecycle/diffOutput.js.map +1 -0
- package/lib/lifecycle/dmlRunner.d.ts +30 -0
- package/lib/lifecycle/dmlRunner.js +45 -0
- package/lib/lifecycle/dmlRunner.js.map +1 -0
- package/lib/lifecycle/errors.d.ts +5 -0
- package/lib/lifecycle/errors.js +8 -0
- package/lib/lifecycle/errors.js.map +1 -0
- package/lib/lifecycle/freezeState.d.ts +28 -0
- package/lib/lifecycle/freezeState.js +88 -0
- package/lib/lifecycle/freezeState.js.map +1 -0
- package/lib/lifecycle/messages.d.ts +1 -0
- package/lib/lifecycle/messages.js +20 -0
- package/lib/lifecycle/messages.js.map +1 -0
- package/lib/lifecycle/output.d.ts +23 -0
- package/lib/lifecycle/output.js +148 -0
- package/lib/lifecycle/output.js.map +1 -0
- package/lib/lifecycle/snapshotState.d.ts +12 -0
- package/lib/lifecycle/snapshotState.js +353 -0
- package/lib/lifecycle/snapshotState.js.map +1 -0
- package/lib/lifecycle/stripApply.d.ts +3 -0
- package/lib/lifecycle/stripApply.js +17 -0
- package/lib/lifecycle/stripApply.js.map +1 -0
- package/lib/lifecycle/stripPlan.d.ts +75 -0
- package/lib/lifecycle/stripPlan.js +192 -0
- package/lib/lifecycle/stripPlan.js.map +1 -0
- package/lib/lifecycle/targeting.d.ts +32 -0
- package/lib/lifecycle/targeting.js +195 -0
- package/lib/lifecycle/targeting.js.map +1 -0
- package/lib/lifecycle/types.d.ts +88 -0
- package/lib/lifecycle/types.js +2 -0
- package/lib/lifecycle/types.js.map +1 -0
- package/lib/lifecycle/userDiff.d.ts +70 -0
- package/lib/lifecycle/userDiff.js +393 -0
- package/lib/lifecycle/userDiff.js.map +1 -0
- package/lib/matching/index.d.ts +53 -0
- package/lib/matching/index.js +181 -0
- package/lib/matching/index.js.map +1 -0
- package/lib/provisioning/assignmentPlan.d.ts +53 -0
- package/lib/provisioning/assignmentPlan.js +90 -0
- package/lib/provisioning/assignmentPlan.js.map +1 -0
- package/lib/provisioning/definitionReader.d.ts +38 -0
- package/lib/provisioning/definitionReader.js +77 -0
- package/lib/provisioning/definitionReader.js.map +1 -0
- package/lib/provisioning/errors.d.ts +9 -0
- package/lib/provisioning/errors.js +14 -0
- package/lib/provisioning/errors.js.map +1 -0
- package/lib/provisioning/licenseUsage.d.ts +15 -0
- package/lib/provisioning/licenseUsage.js +53 -0
- package/lib/provisioning/licenseUsage.js.map +1 -0
- package/lib/provisioning/messages.d.ts +4 -0
- package/lib/provisioning/messages.js +72 -0
- package/lib/provisioning/messages.js.map +1 -0
- package/lib/provisioning/planner.d.ts +63 -0
- package/lib/provisioning/planner.js +407 -0
- package/lib/provisioning/planner.js.map +1 -0
- package/lib/provisioning/provisionUserUseCase.d.ts +52 -0
- package/lib/provisioning/provisionUserUseCase.js +200 -0
- package/lib/provisioning/provisionUserUseCase.js.map +1 -0
- package/lib/provisioning/referenceResolution.d.ts +4 -0
- package/lib/provisioning/referenceResolution.js +173 -0
- package/lib/provisioning/referenceResolution.js.map +1 -0
- package/lib/provisioning/userPlan.d.ts +85 -0
- package/lib/provisioning/userPlan.js +162 -0
- package/lib/provisioning/userPlan.js.map +1 -0
- package/lib/provisioning/userSave.d.ts +24 -0
- package/lib/provisioning/userSave.js +119 -0
- package/lib/provisioning/userSave.js.map +1 -0
- package/lib/relatedRecords/apply.d.ts +18 -0
- package/lib/relatedRecords/apply.js +121 -0
- package/lib/relatedRecords/apply.js.map +1 -0
- package/lib/relatedRecords/catalog.d.ts +7 -0
- package/lib/relatedRecords/catalog.js +108 -0
- package/lib/relatedRecords/catalog.js.map +1 -0
- package/lib/relatedRecords/errors.d.ts +5 -0
- package/lib/relatedRecords/errors.js +8 -0
- package/lib/relatedRecords/errors.js.map +1 -0
- package/lib/relatedRecords/messages.d.ts +1 -0
- package/lib/relatedRecords/messages.js +2 -0
- package/lib/relatedRecords/messages.js.map +1 -0
- package/lib/relatedRecords/plan.d.ts +22 -0
- package/lib/relatedRecords/plan.js +271 -0
- package/lib/relatedRecords/plan.js.map +1 -0
- package/lib/relatedRecords/preflight.d.ts +29 -0
- package/lib/relatedRecords/preflight.js +164 -0
- package/lib/relatedRecords/preflight.js.map +1 -0
- package/lib/relatedRecords/sources.d.ts +25 -0
- package/lib/relatedRecords/sources.js +65 -0
- package/lib/relatedRecords/sources.js.map +1 -0
- package/lib/relatedRecords/types.d.ts +46 -0
- package/lib/relatedRecords/types.js +2 -0
- package/lib/relatedRecords/types.js.map +1 -0
- package/lib/shared/csv.d.ts +26 -0
- package/lib/shared/csv.js +237 -0
- package/lib/shared/csv.js.map +1 -0
- package/lib/shared/output.d.ts +25 -0
- package/lib/shared/output.js +74 -0
- package/lib/shared/output.js.map +1 -0
- package/lib/shared/prompt.d.ts +4 -0
- package/lib/shared/prompt.js +15 -0
- package/lib/shared/prompt.js.map +1 -0
- package/lib/shared/sfUtils.d.ts +19 -0
- package/lib/shared/sfUtils.js +42 -0
- package/lib/shared/sfUtils.js.map +1 -0
- package/lib/shared/userFields.d.ts +23 -0
- package/lib/shared/userFields.js +41 -0
- package/lib/shared/userFields.js.map +1 -0
- package/lib/spec/index.d.ts +10 -0
- package/lib/spec/index.js +6 -0
- package/lib/spec/index.js.map +1 -0
- package/lib/spec/parse.d.ts +32 -0
- package/lib/spec/parse.js +77 -0
- package/lib/spec/parse.js.map +1 -0
- package/lib/spec/personaDefinitions.d.ts +56 -0
- package/lib/spec/personaDefinitions.js +25 -0
- package/lib/spec/personaDefinitions.js.map +1 -0
- package/lib/spec/relatedCatalog.d.ts +61 -0
- package/lib/spec/relatedCatalog.js +32 -0
- package/lib/spec/relatedCatalog.js.map +1 -0
- package/lib/spec/snapshot.d.ts +42 -0
- package/lib/spec/snapshot.js +32 -0
- package/lib/spec/snapshot.js.map +1 -0
- package/lib/spec/usersDefinition.d.ts +19 -0
- package/lib/spec/usersDefinition.js +21 -0
- package/lib/spec/usersDefinition.js.map +1 -0
- package/package.json +78 -0
- package/schemas/persona-definitions.schema.json +108 -0
- package/schemas/related-catalog.schema.json +141 -0
- package/schemas/snapshot.schema.json +128 -0
- package/schemas/users-definition.schema.json +36 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/matching/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { GroupMemberRow, PermissionSetAssignmentRow } from '../lifecycle/assignmentState.js';
|
|
2
|
+
import type { LabelMap } from '../lifecycle/types.js';
|
|
3
|
+
import { type PersonaDefinition } from './planner.js';
|
|
4
|
+
export type ResolvedRefs = {
|
|
5
|
+
profilesByRef: Map<string, string>;
|
|
6
|
+
rolesByRef: Map<string, string>;
|
|
7
|
+
permissionSetIdsByRef: Map<string, string>;
|
|
8
|
+
permissionSetGroupIdsByRef: Map<string, string>;
|
|
9
|
+
publicGroupIdsByRef: Map<string, string>;
|
|
10
|
+
queueIdsByRef: Map<string, string>;
|
|
11
|
+
labels?: LabelMap;
|
|
12
|
+
warnings: string[];
|
|
13
|
+
};
|
|
14
|
+
export type AssignmentCategoryDelta = {
|
|
15
|
+
adds: string[];
|
|
16
|
+
removes: string[];
|
|
17
|
+
inBoth: string[];
|
|
18
|
+
onlyInOrg: string[];
|
|
19
|
+
mode?: 'additive' | 'sync';
|
|
20
|
+
};
|
|
21
|
+
export type AssignmentDelta = {
|
|
22
|
+
permissionSets: AssignmentCategoryDelta;
|
|
23
|
+
permissionSetGroups: AssignmentCategoryDelta;
|
|
24
|
+
publicGroups: AssignmentCategoryDelta;
|
|
25
|
+
queues: AssignmentCategoryDelta;
|
|
26
|
+
};
|
|
27
|
+
export type AssignmentDmlPlan = {
|
|
28
|
+
permissionSets: {
|
|
29
|
+
adds: string[];
|
|
30
|
+
removes: string[];
|
|
31
|
+
};
|
|
32
|
+
permissionSetGroups: {
|
|
33
|
+
adds: string[];
|
|
34
|
+
removes: string[];
|
|
35
|
+
};
|
|
36
|
+
publicGroups: {
|
|
37
|
+
adds: string[];
|
|
38
|
+
removes: string[];
|
|
39
|
+
};
|
|
40
|
+
queues: {
|
|
41
|
+
adds: string[];
|
|
42
|
+
removes: string[];
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
export declare const hasAssignmentIntent: (persona: PersonaDefinition, refs: ResolvedRefs) => boolean;
|
|
46
|
+
export declare const extractCurrentIds: (assignmentRows: PermissionSetAssignmentRow[], membershipRows: GroupMemberRow[]) => {
|
|
47
|
+
permissionSets: string[];
|
|
48
|
+
permissionSetGroups: string[];
|
|
49
|
+
publicGroups: string[];
|
|
50
|
+
queues: string[];
|
|
51
|
+
};
|
|
52
|
+
export declare const computeAssignmentDeltaFromState: (persona: PersonaDefinition, refs: ResolvedRefs, assignmentRows: PermissionSetAssignmentRow[], membershipRows: GroupMemberRow[]) => AssignmentDelta;
|
|
53
|
+
export declare const toDmlPlan: (delta: AssignmentDelta, assignmentRows: PermissionSetAssignmentRow[], membershipRows: GroupMemberRow[]) => AssignmentDmlPlan;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { normalizeMode } from './planner.js';
|
|
2
|
+
export const hasAssignmentIntent = (persona, refs) => {
|
|
3
|
+
const targetCounts = [
|
|
4
|
+
...(persona.permissionSets ?? []).map((ref) => refs.permissionSetIdsByRef.get(ref)),
|
|
5
|
+
...(persona.permissionSetGroups ?? []).map((ref) => refs.permissionSetGroupIdsByRef.get(ref)),
|
|
6
|
+
...(persona.publicGroups ?? []).map((ref) => refs.publicGroupIdsByRef.get(ref)),
|
|
7
|
+
...(persona.queues ?? []).map((ref) => refs.queueIdsByRef.get(ref)),
|
|
8
|
+
].filter(Boolean);
|
|
9
|
+
return (targetCounts.length > 0 ||
|
|
10
|
+
normalizeMode(persona.permissionSetMode) === 'sync' ||
|
|
11
|
+
normalizeMode(persona.permissionSetGroupMode) === 'sync' ||
|
|
12
|
+
normalizeMode(persona.publicGroupMode) === 'sync' ||
|
|
13
|
+
normalizeMode(persona.queueMode) === 'sync');
|
|
14
|
+
};
|
|
15
|
+
const resolveTargets = (refs, resolved) => (refs ?? []).map((ref) => resolved.get(ref)).filter((value) => Boolean(value));
|
|
16
|
+
const computeCategoryDelta = (currentIds, targetIds, modeRaw) => {
|
|
17
|
+
const current = new Set(currentIds);
|
|
18
|
+
const target = new Set(targetIds);
|
|
19
|
+
const mode = normalizeMode(modeRaw);
|
|
20
|
+
const extras = [...current].filter((id) => !target.has(id));
|
|
21
|
+
const removes = mode === 'sync' ? extras : [];
|
|
22
|
+
return {
|
|
23
|
+
adds: [...target].filter((id) => !current.has(id)),
|
|
24
|
+
removes,
|
|
25
|
+
inBoth: [...target].filter((id) => current.has(id)),
|
|
26
|
+
onlyInOrg: extras.filter((id) => !removes.includes(id)),
|
|
27
|
+
mode,
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
export const extractCurrentIds = (assignmentRows, membershipRows) => {
|
|
31
|
+
const permissionSets = assignmentRows
|
|
32
|
+
.filter((row) => row.PermissionSetGroupId == null && row.PermissionSet?.IsOwnedByProfile !== true)
|
|
33
|
+
.map((row) => row.PermissionSetId)
|
|
34
|
+
.filter((value) => Boolean(value));
|
|
35
|
+
const permissionSetGroups = assignmentRows
|
|
36
|
+
.map((row) => row.PermissionSetGroupId)
|
|
37
|
+
.filter((value) => Boolean(value));
|
|
38
|
+
const publicGroups = membershipRows.filter((row) => row.Group?.Type === 'Regular').map((row) => row.GroupId);
|
|
39
|
+
const queues = membershipRows.filter((row) => row.Group?.Type === 'Queue').map((row) => row.GroupId);
|
|
40
|
+
return { permissionSets, permissionSetGroups, publicGroups, queues };
|
|
41
|
+
};
|
|
42
|
+
export const computeAssignmentDeltaFromState = (persona, refs, assignmentRows, membershipRows) => {
|
|
43
|
+
const permissionSetTargets = resolveTargets(persona.permissionSets, refs.permissionSetIdsByRef);
|
|
44
|
+
const permissionSetGroupTargets = resolveTargets(persona.permissionSetGroups, refs.permissionSetGroupIdsByRef);
|
|
45
|
+
const publicTargets = resolveTargets(persona.publicGroups, refs.publicGroupIdsByRef);
|
|
46
|
+
const queueTargets = resolveTargets(persona.queues, refs.queueIdsByRef);
|
|
47
|
+
const current = extractCurrentIds(assignmentRows, membershipRows);
|
|
48
|
+
return {
|
|
49
|
+
permissionSets: computeCategoryDelta(current.permissionSets, permissionSetTargets, persona.permissionSetMode),
|
|
50
|
+
permissionSetGroups: computeCategoryDelta(current.permissionSetGroups, permissionSetGroupTargets, persona.permissionSetGroupMode),
|
|
51
|
+
publicGroups: computeCategoryDelta(current.publicGroups, publicTargets, persona.publicGroupMode),
|
|
52
|
+
queues: computeCategoryDelta(current.queues, queueTargets, persona.queueMode),
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
export const toDmlPlan = (delta, assignmentRows, membershipRows) => {
|
|
56
|
+
const findAssignmentIds = (ids, getValue) => {
|
|
57
|
+
const wanted = new Set(ids);
|
|
58
|
+
return assignmentRows
|
|
59
|
+
.filter((row) => {
|
|
60
|
+
const value = getValue(row);
|
|
61
|
+
return value ? wanted.has(value) : false;
|
|
62
|
+
})
|
|
63
|
+
.map((row) => row.Id);
|
|
64
|
+
};
|
|
65
|
+
const findMembershipIds = (ids, groupType) => {
|
|
66
|
+
const wanted = new Set(ids);
|
|
67
|
+
return membershipRows
|
|
68
|
+
.filter((row) => row.Group?.Type === groupType && wanted.has(row.GroupId))
|
|
69
|
+
.map((row) => row.Id);
|
|
70
|
+
};
|
|
71
|
+
return {
|
|
72
|
+
permissionSets: {
|
|
73
|
+
adds: delta.permissionSets.adds,
|
|
74
|
+
removes: findAssignmentIds(delta.permissionSets.removes, (row) => row.PermissionSetId),
|
|
75
|
+
},
|
|
76
|
+
permissionSetGroups: {
|
|
77
|
+
adds: delta.permissionSetGroups.adds,
|
|
78
|
+
removes: findAssignmentIds(delta.permissionSetGroups.removes, (row) => row.PermissionSetGroupId),
|
|
79
|
+
},
|
|
80
|
+
publicGroups: {
|
|
81
|
+
adds: delta.publicGroups.adds,
|
|
82
|
+
removes: findMembershipIds(delta.publicGroups.removes, 'Regular'),
|
|
83
|
+
},
|
|
84
|
+
queues: {
|
|
85
|
+
adds: delta.queues.adds,
|
|
86
|
+
removes: findMembershipIds(delta.queues.removes, 'Queue'),
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
};
|
|
90
|
+
//# sourceMappingURL=assignmentPlan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assignmentPlan.js","sourceRoot":"","sources":["../../src/provisioning/assignmentPlan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { type InputFormat } from '../shared/csv.js';
|
|
2
|
+
import type { UserFieldMeta } from '../matching/index.js';
|
|
3
|
+
export type ProvisionDefinitionDocuments = {
|
|
4
|
+
usersDoc: Record<string, unknown>;
|
|
5
|
+
personasDoc: Record<string, unknown>;
|
|
6
|
+
personasSupplied: boolean;
|
|
7
|
+
/** Parsed `--related-def` catalog document, when one was supplied. JSON only. */
|
|
8
|
+
relatedDoc?: Record<string, unknown>;
|
|
9
|
+
};
|
|
10
|
+
export type DefinitionMessages = {
|
|
11
|
+
invalidPersonaDefinition: () => string;
|
|
12
|
+
personasWithoutDefinition: (userKey: string) => string;
|
|
13
|
+
invalidJson: (path: string, error: string) => string;
|
|
14
|
+
};
|
|
15
|
+
export type DefinitionSource = {
|
|
16
|
+
usersDoc?: Record<string, unknown>;
|
|
17
|
+
personasDoc?: Record<string, unknown>;
|
|
18
|
+
usersPath?: string;
|
|
19
|
+
personasPath?: string;
|
|
20
|
+
relatedDoc?: Record<string, unknown>;
|
|
21
|
+
relatedPath?: string;
|
|
22
|
+
personasSupplied?: boolean;
|
|
23
|
+
inputFormat?: InputFormat;
|
|
24
|
+
csvListDelimiter?: string;
|
|
25
|
+
};
|
|
26
|
+
export type DefinitionReaderOptions = {
|
|
27
|
+
inputFormat?: InputFormat;
|
|
28
|
+
csvListDelimiter?: string;
|
|
29
|
+
fieldMap?: Map<string, UserFieldMeta>;
|
|
30
|
+
relatedPath?: string;
|
|
31
|
+
};
|
|
32
|
+
type JsonErrorMessage = (filePath: string, error: string) => string;
|
|
33
|
+
export declare const assertValidDefinitions: (usersDoc: Record<string, unknown>, personasDoc: Record<string, unknown>, personasSupplied: boolean, message?: DefinitionMessages) => void;
|
|
34
|
+
export declare const readUsersDefinition: (path: string, options?: DefinitionReaderOptions, jsonErrorMessage?: JsonErrorMessage) => Promise<Record<string, unknown>>;
|
|
35
|
+
export declare const readProvisionDefinitions: (usersPath: string, personasPath?: string, options?: DefinitionReaderOptions, jsonErrorMessage?: JsonErrorMessage) => Promise<ProvisionDefinitionDocuments>;
|
|
36
|
+
export declare const resolveDefinitions: (source: DefinitionSource, fieldMap: Map<string, UserFieldMeta>, message?: DefinitionMessages) => Promise<ProvisionDefinitionDocuments>;
|
|
37
|
+
export declare const loadValidatedDefinitions: (source: DefinitionSource, fieldMap: Map<string, UserFieldMeta>, message?: DefinitionMessages) => Promise<ProvisionDefinitionDocuments>;
|
|
38
|
+
export {};
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { detectInputFormat, readCsvUsers } from '../shared/csv.js';
|
|
2
|
+
import { readJsonOrThrow } from '../shared/sfUtils.js';
|
|
3
|
+
import { parsePersonaDefinitions, parseRelatedCatalog, parseUsersDefinition } from '../spec/parse.js';
|
|
4
|
+
import { findFirstUserWithPersonas } from './planner.js';
|
|
5
|
+
import { DefinitionError } from './errors.js';
|
|
6
|
+
import { provisioningMessage } from './messages.js';
|
|
7
|
+
const defaultDefinitionMessages = {
|
|
8
|
+
invalidPersonaDefinition: () => provisioningMessage('errorInvalidPersonaDefinition'),
|
|
9
|
+
personasWithoutDefinition: (userKey) => provisioningMessage('errorPersonasWithoutDefinition', [userKey]),
|
|
10
|
+
invalidJson: (path, error) => provisioningMessage('errorInvalidJson', [path, error]),
|
|
11
|
+
};
|
|
12
|
+
const defaultJsonErrorMessage = (filePath, error) => provisioningMessage('errorInvalidJson', [filePath, error]);
|
|
13
|
+
const readDefinitionJson = async (path, message) => (await readJsonOrThrow(path, message));
|
|
14
|
+
export const assertValidDefinitions = (usersDoc, personasDoc, personasSupplied, message = defaultDefinitionMessages) => {
|
|
15
|
+
const users = parseUsersDefinition(usersDoc);
|
|
16
|
+
parsePersonaDefinitions(personasDoc);
|
|
17
|
+
const firstUserWithPersonas = personasSupplied === false ? findFirstUserWithPersonas(users.users) : undefined;
|
|
18
|
+
if (firstUserWithPersonas) {
|
|
19
|
+
throw new DefinitionError('errorPersonasWithoutDefinition', message.personasWithoutDefinition(firstUserWithPersonas));
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
export const readUsersDefinition = async (path, options = {}, jsonErrorMessage = defaultJsonErrorMessage) => {
|
|
23
|
+
if (detectInputFormat(path, options.inputFormat) === 'json')
|
|
24
|
+
return parseUsersDefinition(await readDefinitionJson(path, jsonErrorMessage));
|
|
25
|
+
if (!options.fieldMap) {
|
|
26
|
+
throw new DefinitionError('errorMissingUserFieldMap', 'A User field map is required to read CSV user definitions.', { path });
|
|
27
|
+
}
|
|
28
|
+
return readCsvUsers(path, options.fieldMap, options.csvListDelimiter);
|
|
29
|
+
};
|
|
30
|
+
export const readProvisionDefinitions = async (usersPath, personasPath, options = {}, jsonErrorMessage = defaultJsonErrorMessage) => {
|
|
31
|
+
const relatedDoc = options.relatedPath
|
|
32
|
+
? parseRelatedCatalog(await readDefinitionJson(options.relatedPath, jsonErrorMessage))
|
|
33
|
+
: undefined;
|
|
34
|
+
return {
|
|
35
|
+
usersDoc: await readUsersDefinition(usersPath, options, jsonErrorMessage),
|
|
36
|
+
personasDoc: personasPath
|
|
37
|
+
? parsePersonaDefinitions(await readDefinitionJson(personasPath, jsonErrorMessage))
|
|
38
|
+
: { personas: {} },
|
|
39
|
+
personasSupplied: Boolean(personasPath),
|
|
40
|
+
// Omit the key entirely when no catalog was supplied so callers (and deep-equality
|
|
41
|
+
// assertions) never see an own property holding `undefined`.
|
|
42
|
+
...(relatedDoc ? { relatedDoc } : {}),
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
export const resolveDefinitions = async (source, fieldMap, message = defaultDefinitionMessages) => {
|
|
46
|
+
if (source.usersDoc) {
|
|
47
|
+
const relatedDoc = source.relatedDoc ??
|
|
48
|
+
(source.relatedPath
|
|
49
|
+
? parseRelatedCatalog(await readDefinitionJson(source.relatedPath, message.invalidJson))
|
|
50
|
+
: undefined);
|
|
51
|
+
return {
|
|
52
|
+
usersDoc: source.usersDoc,
|
|
53
|
+
personasDoc: source.personasDoc ?? { personas: {} },
|
|
54
|
+
personasSupplied: source.personasSupplied ?? (source.personasDoc ? true : Boolean(source.personasPath)),
|
|
55
|
+
...(relatedDoc ? { relatedDoc } : {}),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
if (!source.usersPath)
|
|
59
|
+
throw new DefinitionError('errorInvalidJson', message.invalidJson('users-def', 'missing path'));
|
|
60
|
+
return readProvisionDefinitions(source.usersPath, source.personasPath, {
|
|
61
|
+
inputFormat: source.inputFormat,
|
|
62
|
+
csvListDelimiter: source.csvListDelimiter,
|
|
63
|
+
fieldMap,
|
|
64
|
+
relatedPath: source.relatedPath,
|
|
65
|
+
}, message.invalidJson);
|
|
66
|
+
};
|
|
67
|
+
export const loadValidatedDefinitions = async (source, fieldMap, message = defaultDefinitionMessages) => {
|
|
68
|
+
if (source.usersDoc) {
|
|
69
|
+
assertValidDefinitions(source.usersDoc, source.personasDoc ?? { personas: {} }, source.personasSupplied ?? Boolean(source.personasDoc), message);
|
|
70
|
+
}
|
|
71
|
+
const definitions = await resolveDefinitions(source, fieldMap, message);
|
|
72
|
+
const usersDoc = parseUsersDefinition(definitions.usersDoc);
|
|
73
|
+
const personasDoc = parsePersonaDefinitions(definitions.personasDoc);
|
|
74
|
+
assertValidDefinitions(usersDoc, personasDoc, source.personasSupplied ?? definitions.personasSupplied, message);
|
|
75
|
+
return { ...definitions, usersDoc, personasDoc };
|
|
76
|
+
};
|
|
77
|
+
//# sourceMappingURL=definitionReader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definitionReader.js","sourceRoot":"","sources":["../../src/provisioning/definitionReader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { WardenError } from '../errors.js';
|
|
2
|
+
export type ProvisioningErrorCode = 'errorDuplicateExternalIdMatch' | 'errorMissingRequiredFields' | 'errorMissingSaveId' | 'errorPromptDeclined' | 'errorInvalidJson' | 'errorInvalidPersonaDefinition' | 'errorPersonasWithoutDefinition';
|
|
3
|
+
export declare class ProvisioningError extends WardenError<ProvisioningErrorCode> {
|
|
4
|
+
constructor(code: ProvisioningErrorCode, message: string, data?: unknown);
|
|
5
|
+
}
|
|
6
|
+
export type DefinitionErrorCode = 'errorInvalidCsv' | 'errorInvalidJson' | 'errorInvalidPersonaDefinition' | 'errorMissingUserFieldMap' | 'errorPersonasWithoutDefinition' | 'schema-invalid' | 'schema-version-unsupported';
|
|
7
|
+
export declare class DefinitionError extends WardenError<DefinitionErrorCode> {
|
|
8
|
+
constructor(code: DefinitionErrorCode, message: string, data?: unknown);
|
|
9
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { WardenError } from '../errors.js';
|
|
2
|
+
export class ProvisioningError extends WardenError {
|
|
3
|
+
constructor(code, message, data) {
|
|
4
|
+
super(code, message, data);
|
|
5
|
+
this.name = 'ProvisioningError';
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
export class DefinitionError extends WardenError {
|
|
9
|
+
constructor(code, message, data) {
|
|
10
|
+
super(code, message, data);
|
|
11
|
+
this.name = 'DefinitionError';
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/provisioning/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAW3C,MAAM,OAAO,iBAAkB,SAAQ,WAAkC;IACvE,YAAmB,IAA2B,EAAE,OAAe,EAAE,IAAc;QAC7E,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAWD,MAAM,OAAO,eAAgB,SAAQ,WAAgC;IACnE,YAAmB,IAAyB,EAAE,OAAe,EAAE,IAAc;QAC3E,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Connection } from '@salesforce/core';
|
|
2
|
+
import type { UserPlan } from './provisionUserUseCase.js';
|
|
3
|
+
export type UserLicenseUsage = {
|
|
4
|
+
licenseName: string;
|
|
5
|
+
required: number;
|
|
6
|
+
available: number | null;
|
|
7
|
+
unlimited: boolean;
|
|
8
|
+
shortfall: number;
|
|
9
|
+
note?: string;
|
|
10
|
+
};
|
|
11
|
+
export type PermissionSetLicenseSummary = {
|
|
12
|
+
evaluated: false;
|
|
13
|
+
note: 'not evaluated';
|
|
14
|
+
};
|
|
15
|
+
export declare const calculateUserLicenseUsage: (conn: Connection, plans: UserPlan[]) => Promise<UserLicenseUsage[]>;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { soqlIn } from '../shared/sfUtils.js';
|
|
2
|
+
export const calculateUserLicenseUsage = async (conn, plans) => {
|
|
3
|
+
const requiredByProfile = new Map();
|
|
4
|
+
for (const plan of plans) {
|
|
5
|
+
if (plan.existing)
|
|
6
|
+
continue;
|
|
7
|
+
if (plan.errors.length > 0)
|
|
8
|
+
continue;
|
|
9
|
+
const profileId = typeof plan.target.ProfileId === 'string' ? plan.target.ProfileId : undefined;
|
|
10
|
+
if (profileId)
|
|
11
|
+
requiredByProfile.set(profileId, (requiredByProfile.get(profileId) ?? 0) + 1);
|
|
12
|
+
}
|
|
13
|
+
if (requiredByProfile.size === 0)
|
|
14
|
+
return [];
|
|
15
|
+
const profileRows = (await conn.query(`SELECT Id, UserLicenseId, UserLicense.Name, UserLicense.MasterLabel FROM Profile WHERE Id IN (${soqlIn([
|
|
16
|
+
...requiredByProfile.keys(),
|
|
17
|
+
])})`)).records;
|
|
18
|
+
const requiredByLicense = new Map();
|
|
19
|
+
for (const profile of profileRows) {
|
|
20
|
+
if (!profile.UserLicenseId)
|
|
21
|
+
continue;
|
|
22
|
+
const required = requiredByProfile.get(profile.Id) ?? 0;
|
|
23
|
+
const current = requiredByLicense.get(profile.UserLicenseId);
|
|
24
|
+
requiredByLicense.set(profile.UserLicenseId, {
|
|
25
|
+
required: (current?.required ?? 0) + required,
|
|
26
|
+
profileLicenseName: current?.profileLicenseName ?? profile.UserLicense?.MasterLabel ?? profile.UserLicense?.Name,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
if (requiredByLicense.size === 0)
|
|
30
|
+
return [];
|
|
31
|
+
const licenseRows = (await conn.query(`SELECT Id, Name, MasterLabel, TotalLicenses, UsedLicenses, Status FROM UserLicense WHERE Id IN (${soqlIn([
|
|
32
|
+
...requiredByLicense.keys(),
|
|
33
|
+
])})`)).records;
|
|
34
|
+
const licensesById = new Map(licenseRows.map((license) => [license.Id, license]));
|
|
35
|
+
return [...requiredByLicense.entries()].map(([licenseId, requirement]) => {
|
|
36
|
+
const license = licensesById.get(licenseId);
|
|
37
|
+
const total = Number(license?.TotalLicenses ?? 0);
|
|
38
|
+
const used = Number(license?.UsedLicenses ?? 0);
|
|
39
|
+
const unlimited = total < 0;
|
|
40
|
+
const active = license?.Status?.toLowerCase() === 'active';
|
|
41
|
+
const available = unlimited ? null : active ? total - used : 0;
|
|
42
|
+
const shortfall = unlimited ? 0 : Math.max(requirement.required - (available ?? 0), 0);
|
|
43
|
+
return {
|
|
44
|
+
licenseName: license?.MasterLabel ?? license?.Name ?? requirement.profileLicenseName ?? licenseId,
|
|
45
|
+
required: requirement.required,
|
|
46
|
+
available,
|
|
47
|
+
unlimited,
|
|
48
|
+
shortfall,
|
|
49
|
+
...(unlimited ? { note: 'unlimited' } : !active ? { note: `status ${license?.Status ?? 'unknown'}` } : {}),
|
|
50
|
+
};
|
|
51
|
+
});
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=licenseUsage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"licenseUsage.js","sourceRoot":"","sources":["../../src/provisioning/licenseUsage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
const TEXT = {
|
|
2
|
+
errorInvalidJson: 'Failed to parse JSON file %s: %s',
|
|
3
|
+
errorInvalidPersonaDefinition: 'persona-def.json must contain a personas object.',
|
|
4
|
+
promptWarningsContinue: 'Validation warnings were found. Continue?',
|
|
5
|
+
errorPromptDeclined: 'Provisioning cancelled because warnings were not confirmed.',
|
|
6
|
+
warningPromptTimeout: 'Warning confirmation timed out after 10 seconds.',
|
|
7
|
+
warningReferenceMissing: '%s reference "%s" was not found.',
|
|
8
|
+
errorFieldNotWritable: 'Field %s is not %s.',
|
|
9
|
+
errorReferenceRequiredMissing: 'Required %s reference "%s" was not found.',
|
|
10
|
+
errorDuplicateExternalIdMatch: 'Multiple users matched %s="%s".',
|
|
11
|
+
errorInvalidUserMatchField: 'match must name a valid filterable User field: %s.',
|
|
12
|
+
errorInvalidFuzzyUsername: 'fuzzyUsername must be a boolean. Got: %s.',
|
|
13
|
+
errorUserMatchFieldEmpty: 'match field %s must be populated on the user.',
|
|
14
|
+
errorMissingRequiredFields: 'Missing required fields for insert: %s.',
|
|
15
|
+
errorMissingSaveId: 'Save operation returned no user id.',
|
|
16
|
+
errorCrossReferenceCandidates: 'Cross-reference update candidates for this user: %s',
|
|
17
|
+
errorNoPersonas: 'Each user must include a non-empty personas array.',
|
|
18
|
+
errorPersonasWithoutDefinition: 'User "%s" lists personas but no --personas-def was supplied.',
|
|
19
|
+
errorLegacyPersonaKey: '"persona" is no longer supported; use "personas": [ ... ].',
|
|
20
|
+
errorUnknownPersona: 'Unknown persona "%s".',
|
|
21
|
+
errorPersonaConflictProfile: 'Personas conflict on profile: %s.',
|
|
22
|
+
errorPersonaConflictRole: 'Personas conflict on role: %s.',
|
|
23
|
+
errorPersonaConflictUserAttribute: 'Personas conflict on userAttribute "%s".',
|
|
24
|
+
errorPersonaConflictMode: 'Personas conflict on %s.',
|
|
25
|
+
errorUserProfileConflict: 'Set either "profile" or "ProfileId" on a user, not both.',
|
|
26
|
+
errorUserRoleConflict: 'Set either "role" or "UserRoleId" on a user, not both.',
|
|
27
|
+
errorInvalidUserProfile: 'user "profile" must be a string (a profile name or Id). Got: %s',
|
|
28
|
+
errorInvalidUserRole: 'user "role" must be a string (a role name/DeveloperName or Id). Got: %s',
|
|
29
|
+
errorRelatedRequiresJson: '--related-def requires a JSON --users-def. CSV user definitions cannot select relationships.',
|
|
30
|
+
errorInvalidRelatedCatalog: 'related-def.json must contain a relationships object.',
|
|
31
|
+
errorRelationshipInvalidDefinition: 'Relationship "%s" must be an object.',
|
|
32
|
+
errorRelationshipInvalidSobject: 'Relationship "%s" must declare a non-empty "sobject".',
|
|
33
|
+
errorRelationshipMissingPhase: 'Relationship "%s" must declare "phase". The only supported value is "after".',
|
|
34
|
+
errorRelationshipInvalidPhase: 'Relationship "%s" has an invalid phase "%s". The only supported value is "after".',
|
|
35
|
+
errorPhaseBeforeUnsupported: 'Relationship "%s" uses phase "before". Before-phase relationships are not supported in this release; they ship with related-record provisioning v2.',
|
|
36
|
+
errorLinkUserUnsupported: 'Relationship "%s" uses "linkUser". Writing a value back onto the User is not supported in this release; it ships with related-record provisioning v2.',
|
|
37
|
+
errorRelatedContextUnsupported: 'Relationship "%s" field "%s" uses a "context." source. Related-context sources are not supported in this release; they ship with related-record provisioning v2.',
|
|
38
|
+
errorRelationshipInvalidMatch: 'Relationship "%s" must declare "match" with non-empty "field" and "from" strings.',
|
|
39
|
+
errorRelationshipMatchFromUserId: 'Relationship "%s" cannot match on "user.Id" because matching runs before the User is saved.',
|
|
40
|
+
errorRelationshipInvalidFields: 'Relationship "%s" must declare a non-empty "fields" object.',
|
|
41
|
+
errorRelationshipInvalidSource: 'Relationship "%s" field "%s" must declare exactly one of "from" or "value".',
|
|
42
|
+
errorRelationshipInvalidFrom: 'Relationship "%s" field "%s" has an invalid source "%s". Expected "user.<Field>" or "user.Id".',
|
|
43
|
+
errorRelationshipUnknownUserField: 'Relationship "%s" field "%s" references unknown User field "%s".',
|
|
44
|
+
errorRelationshipUnwritableField: 'Relationship "%s" cannot write "%s"; the field is not writable.',
|
|
45
|
+
errorRelationshipInvalidMode: 'Relationship "%s" has an invalid mode "%s". Expected setIfEmpty or sync.',
|
|
46
|
+
errorRelationshipInvalidRecordType: 'Relationship "%s" recordType must declare a non-empty "developerName".',
|
|
47
|
+
errorRelatedSobjectUnavailable: 'sObject %s could not be described.',
|
|
48
|
+
errorRelatedSobjectNotQueryable: 'sObject %s is not queryable.',
|
|
49
|
+
errorRelatedUnknownFields: '%s is missing configured fields: %s.',
|
|
50
|
+
errorRelatedMatchFieldNotUnique: 'Match field %s on %s must be filterable and either an External ID or Unique.',
|
|
51
|
+
errorRelatedFieldsNotReadable: 'Related fields on %s are not readable and cannot be inspected: %s.',
|
|
52
|
+
errorRelatedFieldsNotWritable: '%s configured fields are neither createable nor updateable: %s.',
|
|
53
|
+
errorRelatedFieldsNotWritableForOperation: 'Related fields on %s are not %s for this planned write: %s.',
|
|
54
|
+
errorRelatedRecordTypeUnavailable: 'Record type "%s" is not available on %s.',
|
|
55
|
+
errorRelatedPersonAccountRecordTypeRequired: 'An Account relationship must declare an available Person Account record type.',
|
|
56
|
+
warningRelationshipSkipped: 'Relationship "%s" will be skipped: %s',
|
|
57
|
+
errorInvalidRelatedKey: 'related must be an array of relationship names. Got: %s.',
|
|
58
|
+
errorUnknownRelationship: 'Unknown relationship "%s".',
|
|
59
|
+
errorDuplicateRelationshipSelection: 'Relationship "%s" is listed more than once.',
|
|
60
|
+
errorRelatedWithoutCatalog: 'related was supplied but no --related-def catalog was provided.',
|
|
61
|
+
errorRelatedSourceEmpty: 'Relationship "%s" field "%s" resolved to an empty value from User.%s.',
|
|
62
|
+
errorRelatedInvalidSourceValue: 'Relationship "%s" field "%s" has an unresolvable source "%s".',
|
|
63
|
+
errorAmbiguousRelatedMatch: 'Relationship "%s" matched multiple %s records on %s="%s".',
|
|
64
|
+
errorRelatedMatchCollision: 'Relationship "%s" resolves to %s="%s" for more than one user.',
|
|
65
|
+
errorRelatedRecordTypeMismatch: 'Relationship "%s" matched an existing %s record whose record type is not "%s"; warden never retags an existing record.',
|
|
66
|
+
};
|
|
67
|
+
export const provisioningMessage = (code, args = []) => {
|
|
68
|
+
const template = TEXT[code] ?? code;
|
|
69
|
+
let index = 0;
|
|
70
|
+
return template.replaceAll('%s', () => args[index++] ?? '');
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/provisioning/messages.ts"],"names":[],"mappings":"AAAA,MAAM,IAAI,GAA2B;IACnC,gBAAgB,EAAE,kCAAkC;IACpD,6BAA6B,EAAE,kDAAkD;IACjF,sBAAsB,EAAE,2CAA2C;IACnE,mBAAmB,EAAE,6DAA6D;IAClF,oBAAoB,EAAE,kDAAkD;IACxE,uBAAuB,EAAE,kCAAkC;IAC3D,qBAAqB,EAAE,qBAAqB;IAC5C,6BAA6B,EAAE,2CAA2C;IAC1E,6BAA6B,EAAE,iCAAiC;IAChE,0BAA0B,EAAE,oDAAoD;IAChF,yBAAyB,EAAE,2CAA2C;IACtE,wBAAwB,EAAE,+CAA+C;IACzE,0BAA0B,EAAE,yCAAyC;IACrE,kBAAkB,EAAE,qCAAqC;IACzD,6BAA6B,EAAE,qDAAqD;IACpF,eAAe,EAAE,oDAAoD;IACrE,8BAA8B,EAAE,8DAA8D;IAC9F,qBAAqB,EAAE,4DAA4D;IACnF,mBAAmB,EAAE,uBAAuB;IAC5C,2BAA2B,EAAE,mCAAmC;IAChE,wBAAwB,EAAE,gCAAgC;IAC1D,iCAAiC,EAAE,0CAA0C;IAC7E,wBAAwB,EAAE,0BAA0B;IACpD,wBAAwB,EAAE,0DAA0D;IACpF,qBAAqB,EAAE,wDAAwD;IAC/E,uBAAuB,EAAE,iEAAiE;IAC1F,oBAAoB,EAAE,yEAAyE;IAC/F,wBAAwB,EACtB,8FAA8F;IAChG,0BAA0B,EAAE,uDAAuD;IACnF,kCAAkC,EAAE,sCAAsC;IAC1E,+BAA+B,EAAE,uDAAuD;IACxF,6BAA6B,EAAE,8EAA8E;IAC7G,6BAA6B,EAAE,mFAAmF;IAClH,2BAA2B,EACzB,qJAAqJ;IACvJ,wBAAwB,EACtB,uJAAuJ;IACzJ,8BAA8B,EAC5B,kKAAkK;IACpK,6BAA6B,EAAE,mFAAmF;IAClH,gCAAgC,EAC9B,6FAA6F;IAC/F,8BAA8B,EAAE,6DAA6D;IAC7F,8BAA8B,EAAE,6EAA6E;IAC7G,4BAA4B,EAC1B,gGAAgG;IAClG,iCAAiC,EAAE,kEAAkE;IACrG,gCAAgC,EAAE,iEAAiE;IACnG,4BAA4B,EAAE,0EAA0E;IACxG,kCAAkC,EAAE,wEAAwE;IAC5G,8BAA8B,EAAE,oCAAoC;IACpE,+BAA+B,EAAE,8BAA8B;IAC/D,yBAAyB,EAAE,sCAAsC;IACjE,+BAA+B,EAAE,8EAA8E;IAC/G,6BAA6B,EAAE,oEAAoE;IACnG,6BAA6B,EAAE,iEAAiE;IAChG,yCAAyC,EAAE,6DAA6D;IACxG,iCAAiC,EAAE,0CAA0C;IAC7E,2CAA2C,EACzC,+EAA+E;IACjF,0BAA0B,EAAE,uCAAuC;IACnE,sBAAsB,EAAE,0DAA0D;IAClF,wBAAwB,EAAE,4BAA4B;IACtD,mCAAmC,EAAE,6CAA6C;IAClF,0BAA0B,EAAE,iEAAiE;IAC7F,uBAAuB,EAAE,uEAAuE;IAChG,8BAA8B,EAAE,+DAA+D;IAC/F,0BAA0B,EAAE,2DAA2D;IACvF,0BAA0B,EAAE,+DAA+D;IAC3F,8BAA8B,EAC5B,wHAAwH;CAC3H,CAAC;AAIF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,IAAY,EAAE,OAAiB,EAAE,EAAU,EAAE;IAC/E,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;IACpC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,OAAO,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AAC9D,CAAC,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { UserFieldMeta } from '../matching/index.js';
|
|
2
|
+
import { type CsvRowInfo } from '../shared/csv.js';
|
|
3
|
+
import type { PersonaDefinition } from '../spec/personaDefinitions.js';
|
|
4
|
+
import type { UserInput } from '../spec/usersDefinition.js';
|
|
5
|
+
export type AssignmentMode = 'additive' | 'sync';
|
|
6
|
+
export type { PersonaDefinition, UserInput };
|
|
7
|
+
export type ValidationWarning = {
|
|
8
|
+
message: string;
|
|
9
|
+
userKey?: string;
|
|
10
|
+
};
|
|
11
|
+
export type ValidationError = {
|
|
12
|
+
code: 'errorInvalidUserMatchField' | 'errorInvalidFuzzyUsername' | 'errorUserMatchFieldEmpty' | 'errorNoPersonas' | 'errorLegacyPersonaKey' | 'errorUnknownPersona' | 'errorPersonaConflictProfile' | 'errorPersonaConflictRole' | 'errorPersonaConflictUserAttribute' | 'errorPersonaConflictMode' | 'errorUserProfileConflict' | 'errorUserRoleConflict' | 'errorInvalidUserProfile' | 'errorInvalidUserRole' | 'errorInvalidRelatedKey' | 'errorUnknownRelationship' | 'errorDuplicateRelationshipSelection' | 'errorRelatedWithoutCatalog' | 'errorRelatedSourceEmpty' | 'errorRelatedInvalidSourceValue' | 'errorAmbiguousRelatedMatch' | 'errorRelatedMatchCollision' | 'errorRelatedRecordTypeMismatch';
|
|
13
|
+
messageArgs: string[];
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Relationship names available to a user's `related` meta key.
|
|
17
|
+
* `catalogSupplied` is false when no `--related-def` was passed, which turns a stale
|
|
18
|
+
* `related` key into a per-user failure rather than a batch-wide abort.
|
|
19
|
+
*/
|
|
20
|
+
export type RelatedSelectionContext = {
|
|
21
|
+
catalogSupplied: boolean;
|
|
22
|
+
names: Set<string>;
|
|
23
|
+
};
|
|
24
|
+
export type CanonicalizedUser = {
|
|
25
|
+
inputKey: string;
|
|
26
|
+
personas: string[];
|
|
27
|
+
effectivePersona: PersonaDefinition;
|
|
28
|
+
profileRef?: string;
|
|
29
|
+
roleRef?: string;
|
|
30
|
+
matchField?: string;
|
|
31
|
+
fuzzyUsername?: boolean;
|
|
32
|
+
/** Relationship names selected by this user's `related` meta key. Never persona-inferred. */
|
|
33
|
+
related?: string[];
|
|
34
|
+
fields: Record<string, unknown>;
|
|
35
|
+
validationErrors?: ValidationError[];
|
|
36
|
+
source?: CsvRowInfo;
|
|
37
|
+
};
|
|
38
|
+
export declare const modeKeys: readonly ["permissionSetMode", "permissionSetGroupMode", "publicGroupMode", "queueMode"];
|
|
39
|
+
export declare const assignmentListKeys: readonly ["permissionSets", "permissionSetGroups", "publicGroups", "queues"];
|
|
40
|
+
export type { UserFieldMeta } from '../matching/index.js';
|
|
41
|
+
/**
|
|
42
|
+
* Lightweight shape check only.
|
|
43
|
+
* Callers should apply object-specific Id prefix filtering at use sites.
|
|
44
|
+
*/
|
|
45
|
+
export declare const isSalesforceId: (value: string) => boolean;
|
|
46
|
+
export declare const normalizeMode: (value: unknown) => AssignmentMode;
|
|
47
|
+
export declare const buildFieldMap: (fields: UserFieldMeta[]) => Map<string, UserFieldMeta>;
|
|
48
|
+
export declare const canonicalizeFieldObject: (source: Record<string, unknown> | undefined, fieldMap: Map<string, UserFieldMeta>, context: string) => Record<string, unknown>;
|
|
49
|
+
export declare const validateExternalIdField: (externalId: string, fieldMap: Map<string, UserFieldMeta>) => UserFieldMeta;
|
|
50
|
+
export declare const validateExternalIdFieldForFlag: (externalId: string | undefined, fieldMap: Map<string, UserFieldMeta>) => UserFieldMeta | undefined;
|
|
51
|
+
export declare const mergeUserFields: (personaUserAttributes: Record<string, unknown>, userFields: Record<string, unknown>) => Record<string, unknown>;
|
|
52
|
+
export declare const mergePersonas: (names: string[], personas: Record<string, PersonaDefinition>, userOverrideFields: Record<string, unknown>, fieldMap: Map<string, UserFieldMeta>, hasProfileOverride?: boolean, hasRoleOverride?: boolean) => {
|
|
53
|
+
effective: PersonaDefinition;
|
|
54
|
+
errors: ValidationError[];
|
|
55
|
+
};
|
|
56
|
+
export declare const buildDefaultAlias: (firstName?: unknown, lastName?: unknown) => string | undefined;
|
|
57
|
+
export declare const buildDefaultUsername: (email: unknown, myDomain: string) => string | undefined;
|
|
58
|
+
export declare const deriveMyDomain: (instanceUrl: string) => string | undefined;
|
|
59
|
+
export declare const findFirstUserWithPersonas: (rawUsers: unknown) => string | undefined;
|
|
60
|
+
export declare const validateAndCanonicalizeUsers: (rawUsers: unknown, personas: Record<string, PersonaDefinition>, fieldMap: Map<string, UserFieldMeta>, personasSupplied?: boolean, related?: RelatedSelectionContext) => CanonicalizedUser[];
|
|
61
|
+
export declare const validatePersonaModes: (personas: Record<string, PersonaDefinition>) => void;
|
|
62
|
+
export declare const practicalRequiredUserFields: readonly ["Username", "LastName", "Alias", "TimeZoneSidKey", "LocaleSidKey", "EmailEncodingKey", "LanguageLocaleKey"];
|
|
63
|
+
export declare const missingRequiredFieldsForInsert: (fields: Record<string, unknown>, profileIntended: boolean) => string[];
|