@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.
Files changed (191) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/LICENSE +21 -0
  3. package/README.md +111 -0
  4. package/lib/access/assignees.d.ts +27 -0
  5. package/lib/access/assignees.js +139 -0
  6. package/lib/access/assignees.js.map +1 -0
  7. package/lib/access/messages.d.ts +1 -0
  8. package/lib/access/messages.js +24 -0
  9. package/lib/access/messages.js.map +1 -0
  10. package/lib/access/metadata.d.ts +41 -0
  11. package/lib/access/metadata.js +168 -0
  12. package/lib/access/metadata.js.map +1 -0
  13. package/lib/access/muting.d.ts +7 -0
  14. package/lib/access/muting.js +22 -0
  15. package/lib/access/muting.js.map +1 -0
  16. package/lib/access/output.d.ts +12 -0
  17. package/lib/access/output.js +108 -0
  18. package/lib/access/output.js.map +1 -0
  19. package/lib/access/resolvers/field.d.ts +2 -0
  20. package/lib/access/resolvers/field.js +93 -0
  21. package/lib/access/resolvers/field.js.map +1 -0
  22. package/lib/access/resolvers/index.d.ts +2 -0
  23. package/lib/access/resolvers/index.js +22 -0
  24. package/lib/access/resolvers/index.js.map +1 -0
  25. package/lib/access/resolvers/object.d.ts +2 -0
  26. package/lib/access/resolvers/object.js +101 -0
  27. package/lib/access/resolvers/object.js.map +1 -0
  28. package/lib/access/resolvers/recordType.d.ts +2 -0
  29. package/lib/access/resolvers/recordType.js +181 -0
  30. package/lib/access/resolvers/recordType.js.map +1 -0
  31. package/lib/access/resolvers/setupEntity.d.ts +4 -0
  32. package/lib/access/resolvers/setupEntity.js +43 -0
  33. package/lib/access/resolvers/setupEntity.js.map +1 -0
  34. package/lib/access/resolvers/tab.d.ts +2 -0
  35. package/lib/access/resolvers/tab.js +36 -0
  36. package/lib/access/resolvers/tab.js.map +1 -0
  37. package/lib/access/reverse.d.ts +9 -0
  38. package/lib/access/reverse.js +429 -0
  39. package/lib/access/reverse.js.map +1 -0
  40. package/lib/access/soql.d.ts +6 -0
  41. package/lib/access/soql.js +31 -0
  42. package/lib/access/soql.js.map +1 -0
  43. package/lib/access/targetValidation.d.ts +7 -0
  44. package/lib/access/targetValidation.js +110 -0
  45. package/lib/access/targetValidation.js.map +1 -0
  46. package/lib/access/types.d.ts +88 -0
  47. package/lib/access/types.js +20 -0
  48. package/lib/access/types.js.map +1 -0
  49. package/lib/errors.d.ts +18 -0
  50. package/lib/errors.js +39 -0
  51. package/lib/errors.js.map +1 -0
  52. package/lib/index.d.ts +37 -0
  53. package/lib/index.js +33 -0
  54. package/lib/index.js.map +1 -0
  55. package/lib/lifecycle/assignmentState.d.ts +62 -0
  56. package/lib/lifecycle/assignmentState.js +89 -0
  57. package/lib/lifecycle/assignmentState.js.map +1 -0
  58. package/lib/lifecycle/conformance.d.ts +10 -0
  59. package/lib/lifecycle/conformance.js +59 -0
  60. package/lib/lifecycle/conformance.js.map +1 -0
  61. package/lib/lifecycle/diffOutput.d.ts +7 -0
  62. package/lib/lifecycle/diffOutput.js +94 -0
  63. package/lib/lifecycle/diffOutput.js.map +1 -0
  64. package/lib/lifecycle/dmlRunner.d.ts +30 -0
  65. package/lib/lifecycle/dmlRunner.js +45 -0
  66. package/lib/lifecycle/dmlRunner.js.map +1 -0
  67. package/lib/lifecycle/errors.d.ts +5 -0
  68. package/lib/lifecycle/errors.js +8 -0
  69. package/lib/lifecycle/errors.js.map +1 -0
  70. package/lib/lifecycle/freezeState.d.ts +28 -0
  71. package/lib/lifecycle/freezeState.js +88 -0
  72. package/lib/lifecycle/freezeState.js.map +1 -0
  73. package/lib/lifecycle/messages.d.ts +1 -0
  74. package/lib/lifecycle/messages.js +20 -0
  75. package/lib/lifecycle/messages.js.map +1 -0
  76. package/lib/lifecycle/output.d.ts +23 -0
  77. package/lib/lifecycle/output.js +148 -0
  78. package/lib/lifecycle/output.js.map +1 -0
  79. package/lib/lifecycle/snapshotState.d.ts +12 -0
  80. package/lib/lifecycle/snapshotState.js +353 -0
  81. package/lib/lifecycle/snapshotState.js.map +1 -0
  82. package/lib/lifecycle/stripApply.d.ts +3 -0
  83. package/lib/lifecycle/stripApply.js +17 -0
  84. package/lib/lifecycle/stripApply.js.map +1 -0
  85. package/lib/lifecycle/stripPlan.d.ts +75 -0
  86. package/lib/lifecycle/stripPlan.js +192 -0
  87. package/lib/lifecycle/stripPlan.js.map +1 -0
  88. package/lib/lifecycle/targeting.d.ts +32 -0
  89. package/lib/lifecycle/targeting.js +195 -0
  90. package/lib/lifecycle/targeting.js.map +1 -0
  91. package/lib/lifecycle/types.d.ts +88 -0
  92. package/lib/lifecycle/types.js +2 -0
  93. package/lib/lifecycle/types.js.map +1 -0
  94. package/lib/lifecycle/userDiff.d.ts +70 -0
  95. package/lib/lifecycle/userDiff.js +393 -0
  96. package/lib/lifecycle/userDiff.js.map +1 -0
  97. package/lib/matching/index.d.ts +53 -0
  98. package/lib/matching/index.js +181 -0
  99. package/lib/matching/index.js.map +1 -0
  100. package/lib/provisioning/assignmentPlan.d.ts +53 -0
  101. package/lib/provisioning/assignmentPlan.js +90 -0
  102. package/lib/provisioning/assignmentPlan.js.map +1 -0
  103. package/lib/provisioning/definitionReader.d.ts +38 -0
  104. package/lib/provisioning/definitionReader.js +77 -0
  105. package/lib/provisioning/definitionReader.js.map +1 -0
  106. package/lib/provisioning/errors.d.ts +9 -0
  107. package/lib/provisioning/errors.js +14 -0
  108. package/lib/provisioning/errors.js.map +1 -0
  109. package/lib/provisioning/licenseUsage.d.ts +15 -0
  110. package/lib/provisioning/licenseUsage.js +53 -0
  111. package/lib/provisioning/licenseUsage.js.map +1 -0
  112. package/lib/provisioning/messages.d.ts +4 -0
  113. package/lib/provisioning/messages.js +72 -0
  114. package/lib/provisioning/messages.js.map +1 -0
  115. package/lib/provisioning/planner.d.ts +63 -0
  116. package/lib/provisioning/planner.js +407 -0
  117. package/lib/provisioning/planner.js.map +1 -0
  118. package/lib/provisioning/provisionUserUseCase.d.ts +52 -0
  119. package/lib/provisioning/provisionUserUseCase.js +200 -0
  120. package/lib/provisioning/provisionUserUseCase.js.map +1 -0
  121. package/lib/provisioning/referenceResolution.d.ts +4 -0
  122. package/lib/provisioning/referenceResolution.js +173 -0
  123. package/lib/provisioning/referenceResolution.js.map +1 -0
  124. package/lib/provisioning/userPlan.d.ts +85 -0
  125. package/lib/provisioning/userPlan.js +162 -0
  126. package/lib/provisioning/userPlan.js.map +1 -0
  127. package/lib/provisioning/userSave.d.ts +24 -0
  128. package/lib/provisioning/userSave.js +119 -0
  129. package/lib/provisioning/userSave.js.map +1 -0
  130. package/lib/relatedRecords/apply.d.ts +18 -0
  131. package/lib/relatedRecords/apply.js +121 -0
  132. package/lib/relatedRecords/apply.js.map +1 -0
  133. package/lib/relatedRecords/catalog.d.ts +7 -0
  134. package/lib/relatedRecords/catalog.js +108 -0
  135. package/lib/relatedRecords/catalog.js.map +1 -0
  136. package/lib/relatedRecords/errors.d.ts +5 -0
  137. package/lib/relatedRecords/errors.js +8 -0
  138. package/lib/relatedRecords/errors.js.map +1 -0
  139. package/lib/relatedRecords/messages.d.ts +1 -0
  140. package/lib/relatedRecords/messages.js +2 -0
  141. package/lib/relatedRecords/messages.js.map +1 -0
  142. package/lib/relatedRecords/plan.d.ts +22 -0
  143. package/lib/relatedRecords/plan.js +271 -0
  144. package/lib/relatedRecords/plan.js.map +1 -0
  145. package/lib/relatedRecords/preflight.d.ts +29 -0
  146. package/lib/relatedRecords/preflight.js +164 -0
  147. package/lib/relatedRecords/preflight.js.map +1 -0
  148. package/lib/relatedRecords/sources.d.ts +25 -0
  149. package/lib/relatedRecords/sources.js +65 -0
  150. package/lib/relatedRecords/sources.js.map +1 -0
  151. package/lib/relatedRecords/types.d.ts +46 -0
  152. package/lib/relatedRecords/types.js +2 -0
  153. package/lib/relatedRecords/types.js.map +1 -0
  154. package/lib/shared/csv.d.ts +26 -0
  155. package/lib/shared/csv.js +237 -0
  156. package/lib/shared/csv.js.map +1 -0
  157. package/lib/shared/output.d.ts +25 -0
  158. package/lib/shared/output.js +74 -0
  159. package/lib/shared/output.js.map +1 -0
  160. package/lib/shared/prompt.d.ts +4 -0
  161. package/lib/shared/prompt.js +15 -0
  162. package/lib/shared/prompt.js.map +1 -0
  163. package/lib/shared/sfUtils.d.ts +19 -0
  164. package/lib/shared/sfUtils.js +42 -0
  165. package/lib/shared/sfUtils.js.map +1 -0
  166. package/lib/shared/userFields.d.ts +23 -0
  167. package/lib/shared/userFields.js +41 -0
  168. package/lib/shared/userFields.js.map +1 -0
  169. package/lib/spec/index.d.ts +10 -0
  170. package/lib/spec/index.js +6 -0
  171. package/lib/spec/index.js.map +1 -0
  172. package/lib/spec/parse.d.ts +32 -0
  173. package/lib/spec/parse.js +77 -0
  174. package/lib/spec/parse.js.map +1 -0
  175. package/lib/spec/personaDefinitions.d.ts +56 -0
  176. package/lib/spec/personaDefinitions.js +25 -0
  177. package/lib/spec/personaDefinitions.js.map +1 -0
  178. package/lib/spec/relatedCatalog.d.ts +61 -0
  179. package/lib/spec/relatedCatalog.js +32 -0
  180. package/lib/spec/relatedCatalog.js.map +1 -0
  181. package/lib/spec/snapshot.d.ts +42 -0
  182. package/lib/spec/snapshot.js +32 -0
  183. package/lib/spec/snapshot.js.map +1 -0
  184. package/lib/spec/usersDefinition.d.ts +19 -0
  185. package/lib/spec/usersDefinition.js +21 -0
  186. package/lib/spec/usersDefinition.js.map +1 -0
  187. package/package.json +78 -0
  188. package/schemas/persona-definitions.schema.json +108 -0
  189. package/schemas/related-catalog.schema.json +141 -0
  190. package/schemas/snapshot.schema.json +128 -0
  191. package/schemas/users-definition.schema.json +36 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/relatedRecords/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,26 @@
1
+ import type { UserFieldMeta } from '../matching/index.js';
2
+ import { DefinitionError } from '../provisioning/errors.js';
3
+ export type InputFormat = 'json' | 'csv';
4
+ /** The format a path's extension settles on its own, or undefined when it does not settle one. */
5
+ export declare const inputFormatFromExtension: (path: string) => InputFormat | undefined;
6
+ export declare const detectInputFormat: (path: string, override?: InputFormat) => InputFormat;
7
+ export type CsvRowInfo = {
8
+ path: string;
9
+ line: number;
10
+ };
11
+ export declare const getCsvRowInfo: (value: unknown) => CsvRowInfo | undefined;
12
+ export declare class CsvReadError extends DefinitionError {
13
+ constructor(path: string, line: number, detail: string);
14
+ }
15
+ export type ParsedCsvRow = {
16
+ cells: string[];
17
+ line: number;
18
+ };
19
+ export declare const readCsvRows: (source: string, path: string, delimiter: string) => ParsedCsvRow[];
20
+ export declare const readCsvUsers: (path: string, fieldMap: Map<string, UserFieldMeta>, listDelimiter?: string) => Promise<{
21
+ users: Array<Record<string, unknown>>;
22
+ }>;
23
+ export declare const neutralizeCsvFormula: (value: string) => string;
24
+ export declare const restoreCsvFormula: (value: string) => string;
25
+ export declare const csvEscape: (value: unknown) => string;
26
+ export declare const serializeCsv: (rows: Array<Record<string, unknown>>, columns: string[]) => string;
@@ -0,0 +1,237 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { DefinitionError } from '../provisioning/errors.js';
3
+ const FORMULA_PREFIX = /^[=+\-@\t\r]/;
4
+ /** The format a path's extension settles on its own, or undefined when it does not settle one. */
5
+ export const inputFormatFromExtension = (path) => {
6
+ if (/\.(csv|tsv)$/i.test(path))
7
+ return 'csv';
8
+ if (/\.json$/i.test(path))
9
+ return 'json';
10
+ return undefined;
11
+ };
12
+ export const detectInputFormat = (path, override) => override ?? inputFormatFromExtension(path) ?? 'json';
13
+ const csvRowInfo = Symbol('csvRowInfo');
14
+ export const getCsvRowInfo = (value) => value && typeof value === 'object' ? value[csvRowInfo] : undefined;
15
+ export class CsvReadError extends DefinitionError {
16
+ constructor(path, line, detail) {
17
+ super('errorInvalidCsv', `${path}:${line} — ${detail}`, { path, line, detail });
18
+ this.name = 'CsvReadError';
19
+ }
20
+ }
21
+ // CSV quoting has several mutually exclusive parser states; keeping them together makes line tracking auditable.
22
+ // eslint-disable-next-line complexity
23
+ export const readCsvRows = (source, path, delimiter) => {
24
+ const text = source.charCodeAt(0) === 0xfeff ? source.slice(1) : source;
25
+ const rows = [];
26
+ let cells = [];
27
+ let cell = '';
28
+ let cellStarted = false;
29
+ let quoteClosed = false;
30
+ let inQuotes = false;
31
+ let rowTouched = false;
32
+ let rowLine = 1;
33
+ let line = 1;
34
+ const finishRow = () => {
35
+ rows.push({ cells: [...cells, cell], line: rowLine });
36
+ cells = [];
37
+ cell = '';
38
+ cellStarted = false;
39
+ quoteClosed = false;
40
+ rowTouched = false;
41
+ rowLine = line;
42
+ };
43
+ for (let index = 0; index < text.length; index += 1) {
44
+ const character = text[index];
45
+ if (inQuotes) {
46
+ if (character === '"') {
47
+ if (text[index + 1] === '"') {
48
+ cell += '"';
49
+ index += 1;
50
+ }
51
+ else {
52
+ inQuotes = false;
53
+ quoteClosed = true;
54
+ }
55
+ }
56
+ else {
57
+ cell += character;
58
+ if (character === '\r') {
59
+ if (text[index + 1] === '\n') {
60
+ cell += '\n';
61
+ index += 1;
62
+ }
63
+ line += 1;
64
+ }
65
+ else if (character === '\n') {
66
+ line += 1;
67
+ }
68
+ }
69
+ continue;
70
+ }
71
+ if (quoteClosed) {
72
+ if (character === delimiter) {
73
+ cells.push(cell);
74
+ cell = '';
75
+ cellStarted = false;
76
+ quoteClosed = false;
77
+ rowTouched = true;
78
+ continue;
79
+ }
80
+ if (character === '\r' || character === '\n') {
81
+ if (character === '\r' && text[index + 1] === '\n')
82
+ index += 1;
83
+ line += 1;
84
+ finishRow();
85
+ continue;
86
+ }
87
+ throw new CsvReadError(path, line, 'Unexpected character after a closing quote.');
88
+ }
89
+ if (character === '"') {
90
+ if (cellStarted)
91
+ throw new CsvReadError(path, line, 'Unexpected quote in an unquoted cell.');
92
+ inQuotes = true;
93
+ cellStarted = true;
94
+ rowTouched = true;
95
+ }
96
+ else if (character === delimiter) {
97
+ cells.push(cell);
98
+ cell = '';
99
+ cellStarted = false;
100
+ rowTouched = true;
101
+ }
102
+ else if (character === '\r' || character === '\n') {
103
+ if (character === '\r' && text[index + 1] === '\n')
104
+ index += 1;
105
+ line += 1;
106
+ finishRow();
107
+ }
108
+ else {
109
+ cell += character;
110
+ cellStarted = true;
111
+ rowTouched = true;
112
+ }
113
+ }
114
+ if (inQuotes)
115
+ throw new CsvReadError(path, line, 'Unterminated quoted cell.');
116
+ if (rowTouched || cells.length > 0 || cell.length > 0)
117
+ finishRow();
118
+ if (/[\r\n]$/.test(text) && rows.at(-1)?.cells.length === 1 && rows.at(-1)?.cells[0] === '')
119
+ rows.pop();
120
+ return rows;
121
+ };
122
+ const levenshtein = (left, right) => {
123
+ const previous = Array.from({ length: right.length + 1 }, (_, index) => index);
124
+ for (let row = 1; row <= left.length; row += 1) {
125
+ let diagonal = previous[0];
126
+ previous[0] = row;
127
+ for (let column = 1; column <= right.length; column += 1) {
128
+ const above = previous[column];
129
+ previous[column] = Math.min(previous[column] + 1, previous[column - 1] + 1, diagonal + (left[row - 1] === right[column - 1] ? 0 : 1));
130
+ diagonal = above;
131
+ }
132
+ }
133
+ return previous[right.length];
134
+ };
135
+ const suggestedHeader = (header, validHeaders) => {
136
+ const lowerHeader = header.toLowerCase();
137
+ const suggestion = validHeaders
138
+ .map((candidate) => ({ candidate, distance: levenshtein(lowerHeader, candidate.toLowerCase()) }))
139
+ .filter(({ distance }) => distance <= 2)
140
+ .sort((left, right) => left.distance - right.distance || left.candidate.localeCompare(right.candidate))[0];
141
+ return suggestion?.candidate;
142
+ };
143
+ const parseBoolean = (value) => {
144
+ switch (value.toLowerCase()) {
145
+ case 'true':
146
+ case '1':
147
+ case 'yes':
148
+ return true;
149
+ case 'false':
150
+ case '0':
151
+ case 'no':
152
+ return false;
153
+ default:
154
+ return undefined;
155
+ }
156
+ };
157
+ const splitList = (value, delimiter) => value
158
+ .split(delimiter)
159
+ .map((item) => item.trim())
160
+ .filter((item) => item.length > 0);
161
+ export const readCsvUsers = async (path, fieldMap, listDelimiter = ';') => {
162
+ if (listDelimiter.length === 0)
163
+ throw new CsvReadError(path, 1, '--csv-list-delimiter must not be empty.');
164
+ const delimiter = /\.tsv$/i.test(path) ? '\t' : ',';
165
+ const rows = readCsvRows(await readFile(path, 'utf8'), path, delimiter);
166
+ if (rows.length === 0)
167
+ throw new CsvReadError(path, 1, 'CSV must contain a header row.');
168
+ const headerRow = rows[0];
169
+ const metaHeaders = new Map([
170
+ ['personas', 'personas'],
171
+ ['match', 'match'],
172
+ ['fuzzyusername', 'fuzzyUsername'],
173
+ ]);
174
+ const validHeaders = [...metaHeaders.values(), ...[...fieldMap.values()].map((field) => field.name)];
175
+ const seen = new Set();
176
+ const headers = headerRow.cells.map((rawHeader) => {
177
+ const header = rawHeader.trim();
178
+ const key = header.toLowerCase();
179
+ if (seen.has(key))
180
+ throw new CsvReadError(path, headerRow.line, `Duplicate column "${rawHeader}".`);
181
+ seen.add(key);
182
+ const metaHeader = metaHeaders.get(key);
183
+ const field = fieldMap.get(key);
184
+ if (!metaHeader && !field) {
185
+ const suggestion = suggestedHeader(header, validHeaders);
186
+ const suffix = suggestion ? `; did you mean "${suggestion}"?` : '';
187
+ throw new CsvReadError(path, headerRow.line, `Unknown column "${rawHeader}"${suffix}`);
188
+ }
189
+ return { raw: rawHeader, key, name: metaHeader ?? field?.name, field };
190
+ });
191
+ const users = [];
192
+ for (const row of rows.slice(1)) {
193
+ if (row.cells.length !== headers.length) {
194
+ throw new CsvReadError(path, row.line, `Expected ${headers.length} cells but found ${row.cells.length}.`);
195
+ }
196
+ const user = {};
197
+ headers.forEach((header, index) => {
198
+ const value = row.cells[index];
199
+ if (value.length === 0)
200
+ return;
201
+ if (header.name === 'personas') {
202
+ user.personas = splitList(value, listDelimiter);
203
+ return;
204
+ }
205
+ if (header.name === 'fuzzyUsername' || header.field?.isBoolean) {
206
+ const parsed = parseBoolean(value);
207
+ if (parsed === undefined) {
208
+ throw new CsvReadError(path, row.line, `${header.raw} must be a boolean; got "${value}".`);
209
+ }
210
+ user[header.name] = parsed;
211
+ return;
212
+ }
213
+ user[header.name] = value;
214
+ });
215
+ Object.defineProperty(user, csvRowInfo, { value: { path, line: row.line }, enumerable: false });
216
+ users.push(user);
217
+ }
218
+ return { users };
219
+ };
220
+ export const neutralizeCsvFormula = (value) => {
221
+ if (value.startsWith("'") && FORMULA_PREFIX.test(value.slice(1)))
222
+ return value;
223
+ return FORMULA_PREFIX.test(value) ? `'${value}` : value;
224
+ };
225
+ export const restoreCsvFormula = (value) => value.startsWith("'") && FORMULA_PREFIX.test(value.slice(1)) ? value.slice(1) : value;
226
+ export const csvEscape = (value) => {
227
+ const text = value === null || value === undefined ? '' : String(value);
228
+ const escaped = neutralizeCsvFormula(text).replaceAll('"', '""');
229
+ return /[,"\n\r]/.test(escaped) ? `"${escaped}"` : escaped;
230
+ };
231
+ export const serializeCsv = (rows, columns) => {
232
+ const lines = [columns.join(',')];
233
+ for (const row of rows)
234
+ lines.push(columns.map((column) => csvEscape(row[column])).join(','));
235
+ return lines.join('\n');
236
+ };
237
+ //# sourceMappingURL=csv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csv.js","sourceRoot":"","sources":["../../src/shared/csv.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { LifecycleResult } from '../lifecycle/types.js';
2
+ export declare const renderSnapshotCsv: (result: LifecycleResult) => string;
3
+ export declare const renderLifecycleCsv: (result: LifecycleResult) => string;
4
+ export declare const renderRestoreCsv: (result: LifecycleResult) => string;
5
+ export declare const renderStripCsv: (result: LifecycleResult) => string;
6
+ export declare const renderProvisionCsv: (result: {
7
+ users: Array<{
8
+ key: string;
9
+ id?: string;
10
+ userName?: string;
11
+ username?: string;
12
+ personas: string[];
13
+ matchedBy: string | null;
14
+ status: string;
15
+ actions: string[];
16
+ errors: string[];
17
+ relatedRecords?: Array<{
18
+ relationship: string;
19
+ phase: string;
20
+ sobject: string;
21
+ action: string;
22
+ error?: string;
23
+ }>;
24
+ }>;
25
+ }) => string;
@@ -0,0 +1,74 @@
1
+ import { lifecycleToCsvRows } from '../lifecycle/output.js';
2
+ import { serializeCsv } from './csv.js';
3
+ const lifecycleColumns = ['key', 'id', 'status', 'actions', 'skipped', 'warnings', 'errors'];
4
+ const joinValues = (values) => values.map(String).join('; ');
5
+ export const renderSnapshotCsv = (result) => serializeCsv(result.users.map((user) => ({
6
+ key: user.key,
7
+ id: user.id ?? '',
8
+ status: user.status,
9
+ actions: joinValues(user.actions.map((action) => action.key)),
10
+ skipped: joinValues(user.skipped.map((action) => action.key)),
11
+ warnings: joinValues(user.warnings),
12
+ errors: joinValues(user.errors),
13
+ })), lifecycleColumns);
14
+ const lifecycleRows = (result) => lifecycleToCsvRows(result);
15
+ export const renderLifecycleCsv = (result) => serializeCsv(lifecycleRows(result), [
16
+ 'userKey',
17
+ 'userId',
18
+ 'userName',
19
+ 'username',
20
+ 'wasFrozen',
21
+ 'status',
22
+ 'action',
23
+ 'error',
24
+ ]);
25
+ export const renderRestoreCsv = (result) => serializeCsv(lifecycleRows(result), [
26
+ 'userKey',
27
+ 'userId',
28
+ 'userName',
29
+ 'username',
30
+ 'status',
31
+ 'action',
32
+ 'category',
33
+ 'name',
34
+ 'error',
35
+ ]);
36
+ export const renderStripCsv = (result) => serializeCsv(lifecycleRows(result), [
37
+ 'userKey',
38
+ 'userId',
39
+ 'userName',
40
+ 'username',
41
+ 'status',
42
+ 'action',
43
+ 'category',
44
+ 'itemId',
45
+ 'itemApiName',
46
+ 'error',
47
+ ]);
48
+ export const renderProvisionCsv = (result) => serializeCsv(result.users.flatMap((user) => {
49
+ const base = {
50
+ userKey: user.key,
51
+ userId: user.id ?? '',
52
+ userName: user.userName ?? '',
53
+ username: user.username ?? '',
54
+ personas: joinValues(user.personas),
55
+ matchedBy: user.matchedBy ?? '',
56
+ status: user.status,
57
+ };
58
+ const actionRows = user.actions.map((action) => ({ ...base, action, detail: '', error: '' }));
59
+ // Related records reuse the existing ten columns: `action=related` plus a composed detail.
60
+ const relatedRows = (user.relatedRecords ?? []).map((related) => ({
61
+ ...base,
62
+ action: 'related',
63
+ detail: `${related.relationship} ${related.phase} ${related.sobject} ${related.action}`,
64
+ error: related.error ?? '',
65
+ }));
66
+ const errorRows = user.errors.map((error) => ({ ...base, action: '', detail: '', error }));
67
+ const populatedRows = actionRows.concat(relatedRows);
68
+ return populatedRows.concat(errorRows.length > 0
69
+ ? errorRows
70
+ : populatedRows.length > 0
71
+ ? []
72
+ : [{ ...base, action: '', detail: '', error: '' }]);
73
+ }), ['userKey', 'userId', 'userName', 'username', 'personas', 'matchedBy', 'status', 'action', 'detail', 'error']);
74
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/shared/output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare const confirmWithTimeout: (confirm: (message: string) => Promise<boolean>, message: string, timeoutMs?: number) => Promise<{
2
+ confirmed: boolean;
3
+ timedOut: boolean;
4
+ }>;
@@ -0,0 +1,15 @@
1
+ export const confirmWithTimeout = async (confirm, message, timeoutMs = 10_000) => {
2
+ let timer;
3
+ try {
4
+ const timeoutPromise = new Promise((resolve) => {
5
+ timer = setTimeout(() => resolve({ confirmed: false, timedOut: true }), timeoutMs);
6
+ timer.unref();
7
+ });
8
+ return await Promise.race([confirm(message).then((confirmed) => ({ confirmed, timedOut: false })), timeoutPromise]);
9
+ }
10
+ finally {
11
+ if (timer)
12
+ clearTimeout(timer);
13
+ }
14
+ };
15
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/shared/prompt.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,EACrC,OAA8C,EAC9C,OAAe,EACf,SAAS,GAAG,MAAM,EACkC,EAAE;IACtD,IAAI,KAAiC,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,cAAc,GAAG,IAAI,OAAO,CAA4C,CAAC,OAAO,EAAE,EAAE;YACxF,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;YACnF,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC,CAAC,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC;IACtH,CAAC;YAAS,CAAC;QACT,IAAI,KAAK;YAAE,YAAY,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,19 @@
1
+ export type SaveError = {
2
+ message: string;
3
+ statusCode?: string;
4
+ fields?: string[];
5
+ };
6
+ export type SaveResult = {
7
+ success: boolean;
8
+ id?: string;
9
+ errors: SaveError[];
10
+ };
11
+ export declare const asArray: <T>(value: T | T[]) => T[];
12
+ export declare const readJson: (path: string) => Promise<unknown>;
13
+ export declare const readJsonOrThrow: (path: string, message: (path: string, error: string) => string) => Promise<unknown>;
14
+ export declare const formatSaveError: (error: SaveError) => string;
15
+ export declare const pushErrors: (errors: string[], saveResults: SaveResult | SaveResult[] | undefined) => void;
16
+ export declare const esc: (value: string) => string;
17
+ export declare const soqlIn: (values: string[]) => string;
18
+ export declare const batch: <T>(items: T[], size: number) => T[][];
19
+ export declare const runBatches: <T, R>(items: T[], size: number, fn: (item: T) => Promise<R>) => Promise<R[]>;
@@ -0,0 +1,42 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { DefinitionError } from '../provisioning/errors.js';
3
+ export const asArray = (value) => (Array.isArray(value) ? value : [value]);
4
+ export const readJson = async (path) => JSON.parse(await readFile(path, 'utf8'));
5
+ export const readJsonOrThrow = async (path, message) => {
6
+ try {
7
+ return await readJson(path);
8
+ }
9
+ catch (error) {
10
+ const detail = error instanceof Error ? error.message : String(error);
11
+ throw new DefinitionError('errorInvalidJson', message(path, detail), { path, detail });
12
+ }
13
+ };
14
+ export const formatSaveError = (error) => {
15
+ const fieldSuffix = error.fields && error.fields.length > 0 ? ` (fields: ${error.fields.join(', ')})` : '';
16
+ return error.statusCode ? `${error.statusCode}: ${error.message}${fieldSuffix}` : error.message;
17
+ };
18
+ export const pushErrors = (errors, saveResults) => {
19
+ if (!saveResults)
20
+ return;
21
+ for (const result of asArray(saveResults)) {
22
+ if (!result.success)
23
+ errors.push(...result.errors.map((err) => formatSaveError(err)));
24
+ }
25
+ };
26
+ export const esc = (value) => value.replaceAll('\\', '\\\\').replaceAll("'", "\\'");
27
+ export const soqlIn = (values) => values.map((value) => `'${esc(value)}'`).join(',');
28
+ export const batch = (items, size) => items.reduce((groups, item, index) => {
29
+ if (index % size === 0)
30
+ groups.push([]);
31
+ groups[groups.length - 1].push(item);
32
+ return groups;
33
+ }, []);
34
+ export const runBatches = async (items, size, fn) => {
35
+ const itemBatches = batch(items, size);
36
+ return itemBatches.reduce(async (accPromise, itemBatch) => {
37
+ const acc = await accPromise;
38
+ const next = await Promise.all(itemBatch.map(fn));
39
+ return acc.concat(next);
40
+ }, Promise.resolve([]));
41
+ };
42
+ //# sourceMappingURL=sfUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sfUtils.js","sourceRoot":"","sources":["../../src/shared/sfUtils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { Connection } from '@salesforce/core';
2
+ import { type UserFieldMeta } from '../provisioning/planner.js';
3
+ export type SobjectRecordTypeInfo = {
4
+ available: boolean;
5
+ isPersonType: boolean;
6
+ };
7
+ export type SobjectDescribeInfo = {
8
+ name: string;
9
+ queryable: boolean;
10
+ fields: Map<string, UserFieldMeta>;
11
+ recordTypeInfos: Map<string, SobjectRecordTypeInfo>;
12
+ };
13
+ /**
14
+ * Per-run describe cache. Owned by the caller (the provisioning use case) rather than
15
+ * this module so it cannot leak between orgs or between tests in the same process.
16
+ */
17
+ export type SobjectDescribeCache = Map<string, SobjectDescribeInfo>;
18
+ /** Describe any sObject, reusing the per-run cache when one is supplied. */
19
+ export declare const describeSobject: (conn: Connection, sobject: string, cache?: SobjectDescribeCache) => Promise<SobjectDescribeInfo>;
20
+ /** Describe an sObject and project it into the field map callers need. */
21
+ export declare const describeSobjectFields: (conn: Connection, sobject: string, cache?: SobjectDescribeCache) => Promise<Map<string, UserFieldMeta>>;
22
+ /** Describe the User sObject and project it into the field map callers need. */
23
+ export declare const describeUserFields: (conn: Connection, cache?: SobjectDescribeCache) => Promise<Map<string, UserFieldMeta>>;
@@ -0,0 +1,41 @@
1
+ import { buildFieldMap } from '../provisioning/planner.js';
2
+ const projectFields = (fields) => buildFieldMap(fields.map((field) => ({
3
+ name: field.name,
4
+ createable: field.createable,
5
+ updateable: field.updateable,
6
+ filterable: field.filterable,
7
+ // Older describe responses do not include this flag; preserve that distinction
8
+ // so preflight can treat an explicit false as inaccessible without breaking them.
9
+ ...(field.readable === undefined ? {} : { readable: field.readable }),
10
+ externalId: field.externalId,
11
+ // Describes that omit `unique` must not gain an own property holding `undefined`.
12
+ ...(field.unique === undefined ? {} : { unique: field.unique }),
13
+ ...(field.caseSensitive === undefined ? {} : { caseSensitive: field.caseSensitive }),
14
+ isBoolean: field.type === 'boolean',
15
+ })));
16
+ /** Describe any sObject, reusing the per-run cache when one is supplied. */
17
+ export const describeSobject = async (conn, sobject, cache) => {
18
+ const cacheKey = sobject.toLowerCase();
19
+ const cached = cache?.get(cacheKey);
20
+ if (cached)
21
+ return cached;
22
+ const described = (await conn.describe(sobject));
23
+ const info = {
24
+ name: described.name ?? sobject,
25
+ // Standard describes always carry `queryable`; treat an absent flag as queryable
26
+ // so a trimmed test fixture is not reported as an unreadable object.
27
+ queryable: described.queryable !== false,
28
+ fields: projectFields(described.fields),
29
+ recordTypeInfos: new Map((described.recordTypeInfos ?? []).map((recordType) => [
30
+ recordType.recordTypeId,
31
+ { available: recordType.available !== false, isPersonType: recordType.isPersonType === true },
32
+ ])),
33
+ };
34
+ cache?.set(cacheKey, info);
35
+ return info;
36
+ };
37
+ /** Describe an sObject and project it into the field map callers need. */
38
+ export const describeSobjectFields = async (conn, sobject, cache) => (await describeSobject(conn, sobject, cache)).fields;
39
+ /** Describe the User sObject and project it into the field map callers need. */
40
+ export const describeUserFields = async (conn, cache) => describeSobjectFields(conn, 'User', cache);
41
+ //# sourceMappingURL=userFields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"userFields.js","sourceRoot":"","sources":["../../src/shared/userFields.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAsB,MAAM,4BAA4B,CAAC;AA0C/E,MAAM,aAAa,GAAG,CAAC,MAA2B,EAA8B,EAAE,CAChF,aAAa,CACX,MAAM,CAAC,GAAG,CACR,CAAC,KAAK,EAAiB,EAAE,CAAC,CAAC;IACzB,IAAI,EAAE,KAAK,CAAC,IAAI;IAChB,UAAU,EAAE,KAAK,CAAC,UAAU;IAC5B,UAAU,EAAE,KAAK,CAAC,UAAU;IAC5B,UAAU,EAAE,KAAK,CAAC,UAAU;IAC5B,+EAA+E;IAC/E,kFAAkF;IAClF,GAAG,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;IACrE,UAAU,EAAE,KAAK,CAAC,UAAU;IAC5B,kFAAkF;IAClF,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;IAC/D,GAAG,CAAC,KAAK,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC;IACpF,SAAS,EAAE,KAAK,CAAC,IAAI,KAAK,SAAS;CACpC,CAAC,CACH,CACF,CAAC;AAEJ,4EAA4E;AAC5E,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAClC,IAAgB,EAChB,OAAe,EACf,KAA4B,EACE,EAAE;IAChC,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACvC,MAAM,MAAM,GAAG,KAAK,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;IACpC,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,MAAM,SAAS,GAAG,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAK9C,CAAC;IACF,MAAM,IAAI,GAAwB;QAChC,IAAI,EAAE,SAAS,CAAC,IAAI,IAAI,OAAO;QAC/B,iFAAiF;QACjF,qEAAqE;QACrE,SAAS,EAAE,SAAS,CAAC,SAAS,KAAK,KAAK;QACxC,MAAM,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC;QACvC,eAAe,EAAE,IAAI,GAAG,CACtB,CAAC,SAAS,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC;YACpD,UAAU,CAAC,YAAY;YACvB,EAAE,SAAS,EAAE,UAAU,CAAC,SAAS,KAAK,KAAK,EAAE,YAAY,EAAE,UAAU,CAAC,YAAY,KAAK,IAAI,EAAE;SAC9F,CAAC,CACH;KACF,CAAC;IACF,KAAK,EAAE,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC3B,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,0EAA0E;AAC1E,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,EACxC,IAAgB,EAChB,OAAe,EACf,KAA4B,EACS,EAAE,CAAC,CAAC,MAAM,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;AAE/F,gFAAgF;AAChF,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,EACrC,IAAgB,EAChB,KAA4B,EACS,EAAE,CAAC,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ export { personaDefinitionsFileSchema, personaSchema } from './personaDefinitions.js';
2
+ export { relatedCatalogSchema, relationshipDefSchema } from './relatedCatalog.js';
3
+ export { snapshotFileSchema, userSnapshotEntrySchema } from './snapshot.js';
4
+ export { userInputSchema, usersDefinitionFileSchema, USERS_CSV_COLUMNS } from './usersDefinition.js';
5
+ export { parsePersonaDefinitions, parseRelatedCatalog, parseSnapshot, parseUsersDefinition, safeParsePersonaDefinitions, safeParseRelatedCatalog, safeParseSnapshot, safeParseUsersDefinition, validatePersonaDefinitionsText, validateRelatedCatalogText, validateSnapshotText, validateUsersDefinitionText, } from './parse.js';
6
+ export type { PersonaDefinition, PersonaDefinitionsFile } from './personaDefinitions.js';
7
+ export type { RelatedCatalog, RelationshipDef, RelationshipMode, RelationshipPhase, SourceExpr, } from './relatedCatalog.js';
8
+ export type { UserSnapshotEntry, UserSnapshotFile } from './snapshot.js';
9
+ export type { UserInput, UsersDefinitionFile } from './usersDefinition.js';
10
+ export type { SchemaFailure, SchemaIssue, SchemaResult, SchemaSuccess } from './parse.js';
@@ -0,0 +1,6 @@
1
+ export { personaDefinitionsFileSchema, personaSchema } from './personaDefinitions.js';
2
+ export { relatedCatalogSchema, relationshipDefSchema } from './relatedCatalog.js';
3
+ export { snapshotFileSchema, userSnapshotEntrySchema } from './snapshot.js';
4
+ export { userInputSchema, usersDefinitionFileSchema, USERS_CSV_COLUMNS } from './usersDefinition.js';
5
+ export { parsePersonaDefinitions, parseRelatedCatalog, parseSnapshot, parseUsersDefinition, safeParsePersonaDefinitions, safeParseRelatedCatalog, safeParseSnapshot, safeParseUsersDefinition, validatePersonaDefinitionsText, validateRelatedCatalogText, validateSnapshotText, validateUsersDefinitionText, } from './parse.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/spec/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACtF,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,yBAAyB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACrG,OAAO,EACL,uBAAuB,EACvB,mBAAmB,EACnB,aAAa,EACb,oBAAoB,EACpB,2BAA2B,EAC3B,uBAAuB,EACvB,iBAAiB,EACjB,wBAAwB,EACxB,8BAA8B,EAC9B,0BAA0B,EAC1B,oBAAoB,EACpB,2BAA2B,GAC5B,MAAM,YAAY,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { DefinitionError } from '../provisioning/errors.js';
2
+ import type { PersonaDefinitionsFile } from './personaDefinitions.js';
3
+ import type { RelatedCatalog } from './relatedCatalog.js';
4
+ import type { UserSnapshotFile } from './snapshot.js';
5
+ import type { UsersDefinitionFile } from './usersDefinition.js';
6
+ export type SchemaIssue = {
7
+ path: Array<string | number>;
8
+ message: string;
9
+ };
10
+ export type SchemaSuccess<T> = {
11
+ ok: true;
12
+ data: T;
13
+ issues: [];
14
+ };
15
+ export type SchemaFailure = {
16
+ ok: false;
17
+ issues: SchemaIssue[];
18
+ error: DefinitionError;
19
+ };
20
+ export type SchemaResult<T> = SchemaSuccess<T> | SchemaFailure;
21
+ export declare const safeParsePersonaDefinitions: (input: unknown) => SchemaResult<PersonaDefinitionsFile>;
22
+ export declare const parsePersonaDefinitions: (input: unknown) => PersonaDefinitionsFile;
23
+ export declare const validatePersonaDefinitionsText: (text: string) => SchemaResult<PersonaDefinitionsFile>;
24
+ export declare const safeParseUsersDefinition: (input: unknown) => SchemaResult<UsersDefinitionFile>;
25
+ export declare const parseUsersDefinition: (input: unknown) => UsersDefinitionFile;
26
+ export declare const validateUsersDefinitionText: (text: string) => SchemaResult<UsersDefinitionFile>;
27
+ export declare const safeParseRelatedCatalog: (input: unknown) => SchemaResult<RelatedCatalog>;
28
+ export declare const parseRelatedCatalog: (input: unknown) => RelatedCatalog;
29
+ export declare const validateRelatedCatalogText: (text: string) => SchemaResult<RelatedCatalog>;
30
+ export declare const safeParseSnapshot: (input: unknown) => SchemaResult<UserSnapshotFile>;
31
+ export declare const parseSnapshot: (input: unknown) => UserSnapshotFile;
32
+ export declare const validateSnapshotText: (text: string) => SchemaResult<UserSnapshotFile>;