@memberjunction/core 6.1.0-edge.1 → 6.1.0-edge.3

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 (99) hide show
  1. package/LICENSE +180 -4
  2. package/dist/generic/InMemoryLocalStorageProvider.d.ts +6 -0
  3. package/dist/generic/InMemoryLocalStorageProvider.d.ts.map +1 -1
  4. package/dist/generic/InMemoryLocalStorageProvider.js +6 -0
  5. package/dist/generic/InMemoryLocalStorageProvider.js.map +1 -1
  6. package/dist/generic/JSONType-interfaces/IEntityConfiguration.d.ts +120 -0
  7. package/dist/generic/JSONType-interfaces/IEntityConfiguration.d.ts.map +1 -0
  8. package/dist/generic/JSONType-interfaces/IEntityConfiguration.js +6 -0
  9. package/dist/generic/JSONType-interfaces/IEntityConfiguration.js.map +1 -0
  10. package/dist/generic/JSONType-interfaces/IEntityFieldConfiguration.d.ts +31 -0
  11. package/dist/generic/JSONType-interfaces/IEntityFieldConfiguration.d.ts.map +1 -0
  12. package/dist/generic/JSONType-interfaces/IEntityFieldConfiguration.js +6 -0
  13. package/dist/generic/JSONType-interfaces/IEntityFieldConfiguration.js.map +1 -0
  14. package/dist/generic/JSONType-interfaces/IEntityRelationshipConfiguration.d.ts +75 -0
  15. package/dist/generic/JSONType-interfaces/IEntityRelationshipConfiguration.d.ts.map +1 -0
  16. package/dist/generic/JSONType-interfaces/IEntityRelationshipConfiguration.js +6 -0
  17. package/dist/generic/JSONType-interfaces/IEntityRelationshipConfiguration.js.map +1 -0
  18. package/dist/generic/JSONType-interfaces/IFileStorageProviderConfiguration.d.ts +19 -0
  19. package/dist/generic/JSONType-interfaces/IFileStorageProviderConfiguration.d.ts.map +1 -0
  20. package/dist/generic/JSONType-interfaces/IFileStorageProviderConfiguration.js +6 -0
  21. package/dist/generic/JSONType-interfaces/IFileStorageProviderConfiguration.js.map +1 -0
  22. package/dist/generic/authTypes.d.ts +69 -0
  23. package/dist/generic/authTypes.d.ts.map +1 -1
  24. package/dist/generic/baseEngine.d.ts +14 -0
  25. package/dist/generic/baseEngine.d.ts.map +1 -1
  26. package/dist/generic/baseEngine.js +53 -13
  27. package/dist/generic/baseEngine.js.map +1 -1
  28. package/dist/generic/baseEntity.d.ts +150 -23
  29. package/dist/generic/baseEntity.d.ts.map +1 -1
  30. package/dist/generic/baseEntity.js +435 -66
  31. package/dist/generic/baseEntity.js.map +1 -1
  32. package/dist/generic/baseInfo.d.ts.map +1 -1
  33. package/dist/generic/baseInfo.js +16 -4
  34. package/dist/generic/baseInfo.js.map +1 -1
  35. package/dist/generic/compositeKey.d.ts +30 -0
  36. package/dist/generic/compositeKey.d.ts.map +1 -1
  37. package/dist/generic/compositeKey.js +97 -0
  38. package/dist/generic/compositeKey.js.map +1 -1
  39. package/dist/generic/dataHooks.d.ts +5 -0
  40. package/dist/generic/dataHooks.d.ts.map +1 -1
  41. package/dist/generic/dataHooks.js +27 -3
  42. package/dist/generic/dataHooks.js.map +1 -1
  43. package/dist/generic/databaseProviderBase.d.ts.map +1 -1
  44. package/dist/generic/databaseProviderBase.js +9 -5
  45. package/dist/generic/databaseProviderBase.js.map +1 -1
  46. package/dist/generic/embeddedRecord.d.ts +123 -0
  47. package/dist/generic/embeddedRecord.d.ts.map +1 -0
  48. package/dist/generic/embeddedRecord.js +356 -0
  49. package/dist/generic/embeddedRecord.js.map +1 -0
  50. package/dist/generic/entityCompanion.d.ts +20 -2
  51. package/dist/generic/entityCompanion.d.ts.map +1 -1
  52. package/dist/generic/entityCompanion.js +17 -1
  53. package/dist/generic/entityCompanion.js.map +1 -1
  54. package/dist/generic/entityConfiguration.d.ts +131 -0
  55. package/dist/generic/entityConfiguration.d.ts.map +1 -0
  56. package/dist/generic/entityConfiguration.js +346 -0
  57. package/dist/generic/entityConfiguration.js.map +1 -0
  58. package/dist/generic/entityInfo.d.ts +274 -4
  59. package/dist/generic/entityInfo.d.ts.map +1 -1
  60. package/dist/generic/entityInfo.js +502 -14
  61. package/dist/generic/entityInfo.js.map +1 -1
  62. package/dist/generic/entitySavePlan.d.ts +40 -11
  63. package/dist/generic/entitySavePlan.d.ts.map +1 -1
  64. package/dist/generic/entitySavePlan.js +70 -2
  65. package/dist/generic/entitySavePlan.js.map +1 -1
  66. package/dist/generic/interfaces.d.ts +35 -24
  67. package/dist/generic/interfaces.d.ts.map +1 -1
  68. package/dist/generic/interfaces.js +6 -24
  69. package/dist/generic/interfaces.js.map +1 -1
  70. package/dist/generic/localCacheManager.d.ts +123 -5
  71. package/dist/generic/localCacheManager.d.ts.map +1 -1
  72. package/dist/generic/localCacheManager.js +264 -9
  73. package/dist/generic/localCacheManager.js.map +1 -1
  74. package/dist/generic/providerBase.d.ts +118 -0
  75. package/dist/generic/providerBase.d.ts.map +1 -1
  76. package/dist/generic/providerBase.js +311 -11
  77. package/dist/generic/providerBase.js.map +1 -1
  78. package/dist/generic/relatedRecordCollection.d.ts +36 -4
  79. package/dist/generic/relatedRecordCollection.d.ts.map +1 -1
  80. package/dist/generic/relatedRecordCollection.js +70 -8
  81. package/dist/generic/relatedRecordCollection.js.map +1 -1
  82. package/dist/generic/runQuery.d.ts +14 -0
  83. package/dist/generic/runQuery.d.ts.map +1 -1
  84. package/dist/generic/runQuery.js.map +1 -1
  85. package/dist/generic/saveEntityGraphOperation.js +1 -1
  86. package/dist/generic/saveEntityGraphOperation.js.map +1 -1
  87. package/dist/generic/securityInfo.d.ts.map +1 -1
  88. package/dist/generic/securityInfo.js +15 -5
  89. package/dist/generic/securityInfo.js.map +1 -1
  90. package/dist/index.d.ts +3 -0
  91. package/dist/index.d.ts.map +1 -1
  92. package/dist/index.js +3 -0
  93. package/dist/index.js.map +1 -1
  94. package/dist/views/runView.d.ts +58 -0
  95. package/dist/views/runView.d.ts.map +1 -1
  96. package/dist/views/runView.js +20 -0
  97. package/dist/views/runView.js.map +1 -1
  98. package/package.json +5 -4
  99. package/readme.md +64 -1
@@ -0,0 +1,131 @@
1
+ export declare const DEFAULT_AUTO_LEFT_NAV_AT = 8;
2
+ export declare const DEFAULT_PRIMARY_RELATED_BUDGET = 6;
3
+ export declare const RELATED_ROLE_SCORE: {
4
+ readonly RelatedRecordCollection: 200;
5
+ readonly CustomDisplayComponent: 150;
6
+ readonly SameSchema: 100;
7
+ readonly OneToMany: 50;
8
+ readonly BeforeFieldTabs: 40;
9
+ /**
10
+ * Cap for the inbound-relationship hub boost. A related entity that many
11
+ * other entities point at (Order Headers) outranks a satellite with two
12
+ * incoming keys (Task Activities). Applied as `min(cap, 20 * log2(count))`.
13
+ */
14
+ readonly InboundHubCap: 120;
15
+ readonly CreatedByJoin: -90;
16
+ readonly SatelliteName: -70;
17
+ readonly PlatformSchema: -80;
18
+ };
19
+ export declare const PLATFORM_SCHEMA_NAME = "__mj";
20
+ export type FormLayout = 'accordion' | 'left-nav' | 'auto';
21
+ export type RelatedRolePolicy = 'keep-all-primary' | 'smart';
22
+ export type FormRole = 'Primary' | 'Detail';
23
+ /** L1 membership on a parent form. None never reaches the ranker. */
24
+ export type FormInclusion = 'Primary' | 'More' | 'None';
25
+ import { IEntityConfiguration, IEntityFormConfiguration } from './JSONType-interfaces/IEntityConfiguration.js';
26
+ import { IEntityFieldConfiguration } from './JSONType-interfaces/IEntityFieldConfiguration.js';
27
+ import { IEntityRelationshipConfiguration } from './JSONType-interfaces/IEntityRelationshipConfiguration.js';
28
+ export * from './JSONType-interfaces/IEntityConfiguration.js';
29
+ export * from './JSONType-interfaces/IEntityFieldConfiguration.js';
30
+ export * from './JSONType-interfaces/IEntityRelationshipConfiguration.js';
31
+ export interface IEntityRelationshipJoin {
32
+ mode: 'any';
33
+ fields: string[];
34
+ }
35
+ export type RelatedFormRoleReason = 'explicit-primary' | 'explicit-detail' | 'explicit-none' | 'join-sibling-none' | 'ranked-primary' | 'ranked-detail' | 'keep-all-primary' | 'under-budget' | 'install-primary' | 'install-more' | 'install-none';
36
+ export type FormChromeRuleTargetKind = 'Relationship' | 'Contribution';
37
+ /**
38
+ * One install-overlay (L3) pin. Loaded from `MJ: Form Chrome Rules`.
39
+ * Keyed by (parent entity, related entity) or (parent entity, contributionKey).
40
+ */
41
+ export interface FormChromeRule {
42
+ EntityID: string;
43
+ TargetKind: FormChromeRuleTargetKind;
44
+ RelatedEntityID?: string | null;
45
+ ContributionKey?: string | null;
46
+ Inclusion: FormInclusion;
47
+ JoinFields?: string[] | null;
48
+ Sequence?: number | null;
49
+ /**
50
+ * Admin display title. Null / blank keeps the L1 DisplayName or
51
+ * humanized entity name. Keyed with the rule, not the previous label,
52
+ * so an OpenApp upgrade that renames the related entity does not
53
+ * overwrite a site-specific title.
54
+ */
55
+ Title?: string | null;
56
+ }
57
+ export interface RelatedFormRoleCandidate {
58
+ ID: string;
59
+ RelatedEntity: string;
60
+ RelatedEntityID: string;
61
+ RelatedEntityJoinField: string;
62
+ RelatedEntitySchemaName: string;
63
+ DisplayInForm: boolean;
64
+ DisplayLocation?: 'After Field Tabs' | 'Before Field Tabs' | null;
65
+ DisplayComponentID?: string | null;
66
+ RelatedRecordCollection?: string | null;
67
+ JoinView?: string | null;
68
+ Type?: string | null;
69
+ Sequence?: number | null;
70
+ /**
71
+ * The relationship's configuration bag, either raw JSON or already parsed.
72
+ * `EntityRelationshipInfo.Configuration` parses lazily and hands back
73
+ * {@link IEntityRelationshipConfiguration}, while callers reading straight
74
+ * from a row still supply the raw string — so both are accepted, matching
75
+ * what {@link ReadRelationshipInclusion}, {@link ReadRelationshipSortKey}
76
+ * and {@link ReadRelationshipJoinFields} already take.
77
+ */
78
+ Configuration?: string | IEntityRelationshipConfiguration | null;
79
+ /**
80
+ * How many EntityRelationships across metadata point at this related
81
+ * entity. Runtime-only — the ranker uses it as graph in-degree.
82
+ */
83
+ InboundRelationshipCount?: number | null;
84
+ }
85
+ export interface RelatedFormRoleAssignment {
86
+ RelationshipID: string;
87
+ RelatedEntity: string;
88
+ RelatedEntityID: string;
89
+ RelatedEntityJoinField: string;
90
+ Role: FormRole;
91
+ Inclusion: FormInclusion;
92
+ Score: number;
93
+ Reason: RelatedFormRoleReason;
94
+ ExplicitFormRole: FormRole | null;
95
+ ExplicitInclusion: FormInclusion | null;
96
+ JoinFields: string[] | null;
97
+ }
98
+ export interface RelatedFormRoleResolution {
99
+ Policy: RelatedRolePolicy;
100
+ Budget: number;
101
+ Assignments: RelatedFormRoleAssignment[];
102
+ }
103
+ export declare function ParseEntityConfiguration(raw: string | IEntityConfiguration | null | undefined): IEntityConfiguration | null;
104
+ export declare function ParseEntityRelationshipConfiguration(raw: string | IEntityRelationshipConfiguration | null | undefined): IEntityRelationshipConfiguration | null;
105
+ export declare function ResolveFormLayout(formConfig: IEntityFormConfiguration | null | undefined, firstClassSectionCount: number): Exclude<FormLayout, 'auto'>;
106
+ /**
107
+ * Read L1 inclusion from a relationship Configuration bag.
108
+ * `inclusion` wins. `FormRole: 'Detail'` maps to More. `FormRole: 'Primary'` maps to Primary.
109
+ */
110
+ export declare function ReadRelationshipInclusion(raw: string | IEntityRelationshipConfiguration | null | undefined): FormInclusion | null;
111
+ /** Higher = earlier among first-class related rail items. Omit / invalid = null. */
112
+ export declare function ReadRelationshipSortKey(raw: string | IEntityRelationshipConfiguration | null | undefined): number | null;
113
+ export declare function ReadRelationshipJoinFields(raw: string | IEntityRelationshipConfiguration | null | undefined): string[] | null;
114
+ /**
115
+ * Score a DisplayInForm relationship for the smart ranker. Explicit inclusion
116
+ * is not applied here — callers separate the L1 pool first.
117
+ */
118
+ export declare function ScoreRelatedFormRole(candidate: RelatedFormRoleCandidate, parentSchemaName: string): number;
119
+ export declare function ResolveRelatedFormRoles(parentSchemaName: string, formConfig: IEntityFormConfiguration | null | undefined, candidates: readonly RelatedFormRoleCandidate[]): RelatedFormRoleResolution;
120
+ /**
121
+ * L3 install overlay. Pins Inclusion / JoinFields on matching relationship
122
+ * assignments. Later Sequence wins. Contribution rules are applied by the
123
+ * chrome resolver (they are not ranker assignments).
124
+ */
125
+ export declare function ApplyFormChromeRules(parentEntityId: string, assignments: readonly RelatedFormRoleAssignment[], rules: readonly FormChromeRule[]): RelatedFormRoleAssignment[];
126
+ export declare function ContributionInclusionFromRules(parentEntityId: string, contributionKey: string, rules: readonly FormChromeRule[]): FormInclusion | null;
127
+ /**
128
+ * Safely parses an `EntityField.Configuration` JSON string or returns the object.
129
+ */
130
+ export declare function ParseEntityFieldConfiguration(raw: string | IEntityFieldConfiguration | null | undefined): IEntityFieldConfiguration | null;
131
+ //# sourceMappingURL=entityConfiguration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entityConfiguration.d.ts","sourceRoot":"","sources":["../../src/generic/entityConfiguration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,346 @@
1
+ /**
2
+ * Runtime view of `MJ: Entities.Configuration` and
3
+ * `MJ: Entity Relationships.Configuration`.
4
+ *
5
+ * Keep this file in lockstep with:
6
+ * - `metadata/entities/JSONType-interfaces/IEntityConfiguration.ts`
7
+ * - `metadata/entities/JSONType-interfaces/IEntityRelationshipConfiguration.ts`
8
+ *
9
+ * Those files are CodeGen's source of truth (the generated
10
+ * `MJEntityEntity_IEntityConfiguration` / ER counterpart). This file is what
11
+ * `EntityInfo` / the form-chrome ranker consume — `@memberjunction/core` cannot
12
+ * import the generated entity package.
13
+ *
14
+ * NULL / `{}` / omitted keys = accordion until AutoLeftNavAt, then left-nav.
15
+ * Related-role policy defaults to `'smart'`: a budgeted ranker over Auto
16
+ * leftovers. L1 `inclusion: 'None'` never enters the ranker.
17
+ *
18
+ * @see guides/FORMS_ARCHITECTURE_GUIDE.md §7d
19
+ */
20
+ import { SafeJSONParse } from '@memberjunction/global';
21
+ export const DEFAULT_AUTO_LEFT_NAV_AT = 8;
22
+ export const DEFAULT_PRIMARY_RELATED_BUDGET = 6;
23
+ export const RELATED_ROLE_SCORE = {
24
+ RelatedRecordCollection: 200,
25
+ CustomDisplayComponent: 150,
26
+ SameSchema: 100,
27
+ OneToMany: 50,
28
+ BeforeFieldTabs: 40,
29
+ /**
30
+ * Cap for the inbound-relationship hub boost. A related entity that many
31
+ * other entities point at (Order Headers) outranks a satellite with two
32
+ * incoming keys (Task Activities). Applied as `min(cap, 20 * log2(count))`.
33
+ */
34
+ InboundHubCap: 120,
35
+ CreatedByJoin: -90,
36
+ SatelliteName: -70,
37
+ PlatformSchema: -80,
38
+ };
39
+ export const PLATFORM_SCHEMA_NAME = '__mj';
40
+ export * from './JSONType-interfaces/IEntityConfiguration.js';
41
+ export * from './JSONType-interfaces/IEntityFieldConfiguration.js';
42
+ export * from './JSONType-interfaces/IEntityRelationshipConfiguration.js';
43
+ export function ParseEntityConfiguration(raw) {
44
+ if (raw == null)
45
+ return null;
46
+ if (typeof raw === 'object')
47
+ return raw;
48
+ if (typeof raw !== 'string' || raw.trim().length === 0)
49
+ return null;
50
+ return SafeJSONParse(raw, false) ?? null;
51
+ }
52
+ export function ParseEntityRelationshipConfiguration(raw) {
53
+ if (raw == null)
54
+ return null;
55
+ if (typeof raw === 'object')
56
+ return raw;
57
+ if (typeof raw !== 'string' || raw.trim().length === 0)
58
+ return null;
59
+ return SafeJSONParse(raw, false) ?? null;
60
+ }
61
+ export function ResolveFormLayout(formConfig, firstClassSectionCount) {
62
+ const layout = formConfig?.Layout ?? 'auto';
63
+ if (layout === 'accordion' || layout === 'left-nav')
64
+ return layout;
65
+ const threshold = formConfig?.AutoLeftNavAt ?? DEFAULT_AUTO_LEFT_NAV_AT;
66
+ return firstClassSectionCount >= threshold ? 'left-nav' : 'accordion';
67
+ }
68
+ /**
69
+ * Read L1 inclusion from a relationship Configuration bag.
70
+ * `inclusion` wins. `FormRole: 'Detail'` maps to More. `FormRole: 'Primary'` maps to Primary.
71
+ */
72
+ export function ReadRelationshipInclusion(raw) {
73
+ const parsed = ParseEntityRelationshipConfiguration(raw);
74
+ const ui = parsed?.UI;
75
+ if (ui?.inclusion === 'Primary' || ui?.inclusion === 'More' || ui?.inclusion === 'None') {
76
+ return ui.inclusion;
77
+ }
78
+ if (ui?.FormRole === 'Primary')
79
+ return 'Primary';
80
+ if (ui?.FormRole === 'Detail')
81
+ return 'More';
82
+ return null;
83
+ }
84
+ /** Higher = earlier among first-class related rail items. Omit / invalid = null. */
85
+ export function ReadRelationshipSortKey(raw) {
86
+ const sort = ParseEntityRelationshipConfiguration(raw)?.UI?.sortKey;
87
+ if (typeof sort !== 'number' || !Number.isFinite(sort))
88
+ return null;
89
+ return sort;
90
+ }
91
+ export function ReadRelationshipJoinFields(raw) {
92
+ const fields = ParseEntityRelationshipConfiguration(raw)?.UI?.join?.fields;
93
+ if (!fields || fields.length === 0)
94
+ return null;
95
+ const cleaned = fields.map((f) => f.trim()).filter((f) => f.length > 0);
96
+ return cleaned.length > 0 ? cleaned : null;
97
+ }
98
+ /**
99
+ * Score a DisplayInForm relationship for the smart ranker. Explicit inclusion
100
+ * is not applied here — callers separate the L1 pool first.
101
+ */
102
+ export function ScoreRelatedFormRole(candidate, parentSchemaName) {
103
+ let score = 0;
104
+ if (hasText(candidate.RelatedRecordCollection)) {
105
+ score += RELATED_ROLE_SCORE.RelatedRecordCollection;
106
+ }
107
+ if (hasText(candidate.DisplayComponentID)) {
108
+ score += RELATED_ROLE_SCORE.CustomDisplayComponent;
109
+ }
110
+ if (schemasEqual(candidate.RelatedEntitySchemaName, parentSchemaName)) {
111
+ score += RELATED_ROLE_SCORE.SameSchema;
112
+ }
113
+ if (isOneToMany(candidate)) {
114
+ score += RELATED_ROLE_SCORE.OneToMany;
115
+ }
116
+ if (candidate.DisplayLocation === 'Before Field Tabs') {
117
+ score += RELATED_ROLE_SCORE.BeforeFieldTabs;
118
+ }
119
+ score += inboundHubBoost(candidate.InboundRelationshipCount);
120
+ score += createdByJoinPenalty(candidate.RelatedEntityJoinField);
121
+ score += satelliteNamePenalty(candidate.RelatedEntity);
122
+ if (isPlatformSchema(candidate.RelatedEntitySchemaName) && !isPlatformSchema(parentSchemaName)) {
123
+ score += RELATED_ROLE_SCORE.PlatformSchema;
124
+ }
125
+ return score;
126
+ }
127
+ export function ResolveRelatedFormRoles(parentSchemaName, formConfig, candidates) {
128
+ const policy = formConfig?.RelatedRolePolicy ?? 'smart';
129
+ const budget = resolveBudget(formConfig?.PrimaryRelatedBudget);
130
+ const visible = candidates.filter((c) => c.DisplayInForm);
131
+ const assignments = [];
132
+ const untagged = [];
133
+ const joinSiblingNone = impliedJoinSiblingNoneIds(visible);
134
+ for (const candidate of visible) {
135
+ const explicit = ReadRelationshipInclusion(candidate.Configuration);
136
+ const inclusion = explicit ?? (joinSiblingNone.has(candidate.ID) ? 'None' : null);
137
+ const score = ScoreRelatedFormRole(candidate, parentSchemaName);
138
+ if (inclusion === 'None') {
139
+ const reason = explicit === 'None' ? 'explicit-none' : 'join-sibling-none';
140
+ assignments.push(toAssignment(candidate, 'Detail', 'None', score, reason, explicit));
141
+ continue;
142
+ }
143
+ if (inclusion === 'Primary') {
144
+ assignments.push(toAssignment(candidate, 'Primary', 'Primary', score, 'explicit-primary', inclusion));
145
+ continue;
146
+ }
147
+ if (inclusion === 'More') {
148
+ assignments.push(toAssignment(candidate, 'Detail', 'More', score, 'explicit-detail', inclusion));
149
+ continue;
150
+ }
151
+ untagged.push({ candidate, score });
152
+ }
153
+ if (policy === 'keep-all-primary') {
154
+ for (const item of untagged) {
155
+ assignments.push(toAssignment(item.candidate, 'Primary', 'Primary', item.score, 'keep-all-primary', null));
156
+ }
157
+ return { Policy: policy, Budget: budget, Assignments: sortAssignments(assignments) };
158
+ }
159
+ if (untagged.length <= budget) {
160
+ for (const item of untagged) {
161
+ assignments.push(toAssignment(item.candidate, 'Primary', 'Primary', item.score, 'under-budget', null));
162
+ }
163
+ return { Policy: policy, Budget: budget, Assignments: sortAssignments(assignments) };
164
+ }
165
+ const ranked = [...untagged].sort(compareUntagged);
166
+ ranked.forEach((item, index) => {
167
+ const isPrimary = index < budget;
168
+ assignments.push(toAssignment(item.candidate, isPrimary ? 'Primary' : 'Detail', isPrimary ? 'Primary' : 'More', item.score, isPrimary ? 'ranked-primary' : 'ranked-detail', null));
169
+ });
170
+ return { Policy: policy, Budget: budget, Assignments: sortAssignments(assignments) };
171
+ }
172
+ function resolveBudget(raw) {
173
+ if (raw == null || !Number.isFinite(raw))
174
+ return DEFAULT_PRIMARY_RELATED_BUDGET;
175
+ return Math.max(0, Math.floor(raw));
176
+ }
177
+ function toAssignment(candidate, role, inclusion, score, reason, explicitInclusion) {
178
+ const explicitRole = explicitInclusion === 'Primary' ? 'Primary'
179
+ : explicitInclusion === 'More' ? 'Detail'
180
+ : null;
181
+ return {
182
+ RelationshipID: candidate.ID,
183
+ RelatedEntity: candidate.RelatedEntity,
184
+ RelatedEntityID: candidate.RelatedEntityID,
185
+ RelatedEntityJoinField: candidate.RelatedEntityJoinField,
186
+ Role: role,
187
+ Inclusion: inclusion,
188
+ Score: score,
189
+ Reason: reason,
190
+ ExplicitFormRole: explicitRole,
191
+ ExplicitInclusion: explicitInclusion,
192
+ JoinFields: ReadRelationshipJoinFields(candidate.Configuration),
193
+ };
194
+ }
195
+ /**
196
+ * When one relationship to a related entity carries `join.fields`, sibling
197
+ * FKs to that same entity with no explicit inclusion are not candidates.
198
+ */
199
+ function impliedJoinSiblingNoneIds(candidates) {
200
+ const ownerKeys = new Set();
201
+ for (const candidate of candidates) {
202
+ if (ReadRelationshipJoinFields(candidate.Configuration)) {
203
+ ownerKeys.add(relatedEntityKey(candidate));
204
+ }
205
+ }
206
+ const noneIds = new Set();
207
+ if (ownerKeys.size === 0)
208
+ return noneIds;
209
+ for (const candidate of candidates) {
210
+ if (!ownerKeys.has(relatedEntityKey(candidate)))
211
+ continue;
212
+ if (ReadRelationshipInclusion(candidate.Configuration) != null)
213
+ continue;
214
+ if (ReadRelationshipJoinFields(candidate.Configuration))
215
+ continue;
216
+ noneIds.add(candidate.ID);
217
+ }
218
+ return noneIds;
219
+ }
220
+ function relatedEntityKey(candidate) {
221
+ const id = (candidate.RelatedEntityID ?? '').trim().toLowerCase();
222
+ if (id.length > 0)
223
+ return id;
224
+ return (candidate.RelatedEntity ?? '').trim().toLowerCase();
225
+ }
226
+ /**
227
+ * L3 install overlay. Pins Inclusion / JoinFields on matching relationship
228
+ * assignments. Later Sequence wins. Contribution rules are applied by the
229
+ * chrome resolver (they are not ranker assignments).
230
+ */
231
+ export function ApplyFormChromeRules(parentEntityId, assignments, rules) {
232
+ const parent = parentEntityId.trim().toLowerCase();
233
+ if (parent.length === 0 || rules.length === 0)
234
+ return [...assignments];
235
+ const applicable = rules
236
+ .filter((rule) => rule.TargetKind === 'Relationship' && idsEqual(rule.EntityID, parent))
237
+ .sort((a, b) => (a.Sequence ?? 0) - (b.Sequence ?? 0));
238
+ if (applicable.length === 0)
239
+ return [...assignments];
240
+ return assignments.map((assignment) => {
241
+ const rule = lastMatchingRelationshipRule(applicable, assignment);
242
+ return rule ? applyRelationshipRule(assignment, rule) : assignment;
243
+ });
244
+ }
245
+ export function ContributionInclusionFromRules(parentEntityId, contributionKey, rules) {
246
+ const parent = parentEntityId.trim().toLowerCase();
247
+ const key = contributionKey.trim().toLowerCase();
248
+ if (parent.length === 0 || key.length === 0)
249
+ return null;
250
+ const matches = rules
251
+ .filter((rule) => rule.TargetKind === 'Contribution'
252
+ && idsEqual(rule.EntityID, parent)
253
+ && (rule.ContributionKey ?? '').trim().toLowerCase() === key)
254
+ .sort((a, b) => (a.Sequence ?? 0) - (b.Sequence ?? 0));
255
+ return matches.at(-1)?.Inclusion ?? null;
256
+ }
257
+ function lastMatchingRelationshipRule(rules, assignment) {
258
+ const matches = rules.filter((rule) => idsEqual(rule.RelatedEntityID, assignment.RelatedEntityID));
259
+ return matches.at(-1);
260
+ }
261
+ function applyRelationshipRule(assignment, rule) {
262
+ const inclusion = rule.Inclusion;
263
+ const role = inclusion === 'Primary' ? 'Primary' : 'Detail';
264
+ const reason = inclusion === 'Primary' ? 'install-primary'
265
+ : inclusion === 'More' ? 'install-more'
266
+ : 'install-none';
267
+ const join = rule.JoinFields && rule.JoinFields.length > 0
268
+ ? rule.JoinFields
269
+ : assignment.JoinFields;
270
+ return { ...assignment, Role: role, Inclusion: inclusion, Reason: reason, JoinFields: join };
271
+ }
272
+ function idsEqual(a, b) {
273
+ return (a ?? '').trim().toLowerCase() === (b ?? '').trim().toLowerCase()
274
+ && (a ?? '').trim().length > 0;
275
+ }
276
+ function sortAssignments(assignments) {
277
+ return [...assignments].sort((a, b) => {
278
+ if (b.Score !== a.Score)
279
+ return b.Score - a.Score;
280
+ return a.RelatedEntity.localeCompare(b.RelatedEntity);
281
+ });
282
+ }
283
+ function compareUntagged(a, b) {
284
+ if (b.score !== a.score)
285
+ return b.score - a.score;
286
+ const aSeq = effectiveSequence(a.candidate.Sequence);
287
+ const bSeq = effectiveSequence(b.candidate.Sequence);
288
+ if (aSeq !== bSeq)
289
+ return aSeq - bSeq;
290
+ return a.candidate.RelatedEntity.localeCompare(b.candidate.RelatedEntity);
291
+ }
292
+ function isOneToMany(candidate) {
293
+ if (hasText(candidate.JoinView))
294
+ return false;
295
+ const type = (candidate.Type ?? '').trim().toUpperCase();
296
+ if (type.length === 0)
297
+ return true;
298
+ return type === 'ONE TO MANY';
299
+ }
300
+ function inboundHubBoost(count) {
301
+ if (count == null || count <= 2)
302
+ return 0;
303
+ return Math.min(RELATED_ROLE_SCORE.InboundHubCap, Math.round(20 * Math.log2(count)));
304
+ }
305
+ function createdByJoinPenalty(joinField) {
306
+ const field = (joinField ?? '').trim();
307
+ if (/^(CreatedBy|UpdatedBy|DeletedBy|OwnedBy)/i.test(field)) {
308
+ return RELATED_ROLE_SCORE.CreatedByJoin;
309
+ }
310
+ return 0;
311
+ }
312
+ function satelliteNamePenalty(relatedEntity) {
313
+ const name = (relatedEntity ?? '').toLowerCase();
314
+ if (/(activit|comment|log|notification|exemption|intent|assignment|dependenc|decision|tag link|stored value|payment method|entitlement|promotion code)/.test(name)) {
315
+ return RELATED_ROLE_SCORE.SatelliteName;
316
+ }
317
+ return 0;
318
+ }
319
+ function effectiveSequence(sequence) {
320
+ if (sequence == null || sequence === 0)
321
+ return 999;
322
+ return sequence;
323
+ }
324
+ function isPlatformSchema(schemaName) {
325
+ return (schemaName ?? '').trim().toLowerCase() === PLATFORM_SCHEMA_NAME;
326
+ }
327
+ function schemasEqual(a, b) {
328
+ return (a ?? '').trim().toLowerCase() === (b ?? '').trim().toLowerCase()
329
+ && (a ?? '').trim().length > 0;
330
+ }
331
+ function hasText(value) {
332
+ return value != null && value.trim().length > 0;
333
+ }
334
+ /**
335
+ * Safely parses an `EntityField.Configuration` JSON string or returns the object.
336
+ */
337
+ export function ParseEntityFieldConfiguration(raw) {
338
+ if (raw == null)
339
+ return null;
340
+ if (typeof raw === 'object')
341
+ return raw;
342
+ if (typeof raw !== 'string' || raw.trim().length === 0)
343
+ return null;
344
+ return SafeJSONParse(raw, false) ?? null;
345
+ }
346
+ //# sourceMappingURL=entityConfiguration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entityConfiguration.js","sourceRoot":"","sources":["../../src/generic/entityConfiguration.ts"],"names":[],"mappings":"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"}