@memberjunction/codegen-lib 6.1.0-edge.4 → 6.1.0-edge.6

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 (136) hide show
  1. package/README.md +20 -0
  2. package/dist/Angular/angular-codegen.d.ts +9 -6
  3. package/dist/Angular/angular-codegen.d.ts.map +1 -1
  4. package/dist/Angular/angular-codegen.js +80 -51
  5. package/dist/Angular/angular-codegen.js.map +1 -1
  6. package/dist/Angular/join-grid-related-entity-component.d.ts.map +1 -1
  7. package/dist/Angular/join-grid-related-entity-component.js +5 -2
  8. package/dist/Angular/join-grid-related-entity-component.js.map +1 -1
  9. package/dist/Angular/related-entity-components.d.ts +11 -0
  10. package/dist/Angular/related-entity-components.d.ts.map +1 -1
  11. package/dist/Angular/related-entity-components.js +23 -0
  12. package/dist/Angular/related-entity-components.js.map +1 -1
  13. package/dist/Angular/timeline-related-entity-component.d.ts.map +1 -1
  14. package/dist/Angular/timeline-related-entity-component.js +3 -2
  15. package/dist/Angular/timeline-related-entity-component.js.map +1 -1
  16. package/dist/Config/config.d.ts +216 -12
  17. package/dist/Config/config.d.ts.map +1 -1
  18. package/dist/Config/config.js +88 -6
  19. package/dist/Config/config.js.map +1 -1
  20. package/dist/Config/schema-output.d.ts +33 -0
  21. package/dist/Config/schema-output.d.ts.map +1 -0
  22. package/dist/Config/schema-output.js +52 -0
  23. package/dist/Config/schema-output.js.map +1 -0
  24. package/dist/Database/codeGenDatabaseProvider.d.ts +68 -1
  25. package/dist/Database/codeGenDatabaseProvider.d.ts.map +1 -1
  26. package/dist/Database/codeGenDatabaseProvider.js +142 -3
  27. package/dist/Database/codeGenDatabaseProvider.js.map +1 -1
  28. package/dist/Database/dbSchema.js +2 -1
  29. package/dist/Database/dbSchema.js.map +1 -1
  30. package/dist/Database/decision-metadata-format.d.ts +124 -0
  31. package/dist/Database/decision-metadata-format.d.ts.map +1 -0
  32. package/dist/Database/decision-metadata-format.js +279 -0
  33. package/dist/Database/decision-metadata-format.js.map +1 -0
  34. package/dist/Database/decision-metadata-writer.d.ts +48 -0
  35. package/dist/Database/decision-metadata-writer.d.ts.map +1 -0
  36. package/dist/Database/decision-metadata-writer.js +482 -0
  37. package/dist/Database/decision-metadata-writer.js.map +1 -0
  38. package/dist/Database/entity-field-change-tracking.d.ts +53 -0
  39. package/dist/Database/entity-field-change-tracking.d.ts.map +1 -0
  40. package/dist/Database/entity-field-change-tracking.js +120 -0
  41. package/dist/Database/entity-field-change-tracking.js.map +1 -0
  42. package/dist/Database/entity-level-tree-cycles.d.ts.map +1 -1
  43. package/dist/Database/entity-level-tree-cycles.js +3 -2
  44. package/dist/Database/entity-level-tree-cycles.js.map +1 -1
  45. package/dist/Database/exclude-tables.d.ts +26 -0
  46. package/dist/Database/exclude-tables.d.ts.map +1 -0
  47. package/dist/Database/exclude-tables.js +38 -0
  48. package/dist/Database/exclude-tables.js.map +1 -0
  49. package/dist/Database/field-metadata-lock.d.ts +47 -0
  50. package/dist/Database/field-metadata-lock.d.ts.map +1 -0
  51. package/dist/Database/field-metadata-lock.js +159 -0
  52. package/dist/Database/field-metadata-lock.js.map +1 -0
  53. package/dist/Database/manage-metadata.d.ts +142 -42
  54. package/dist/Database/manage-metadata.d.ts.map +1 -1
  55. package/dist/Database/manage-metadata.js +625 -287
  56. package/dist/Database/manage-metadata.js.map +1 -1
  57. package/dist/Database/providers/postgresql/PostgreSQLCodeGenProvider.d.ts +2 -2
  58. package/dist/Database/providers/postgresql/PostgreSQLCodeGenProvider.d.ts.map +1 -1
  59. package/dist/Database/providers/postgresql/PostgreSQLCodeGenProvider.js +90 -41
  60. package/dist/Database/providers/postgresql/PostgreSQLCodeGenProvider.js.map +1 -1
  61. package/dist/Database/providers/postgresql/metadataSupportObjects.js +31 -8
  62. package/dist/Database/providers/postgresql/metadataSupportObjects.js.map +1 -1
  63. package/dist/Database/providers/sqlserver/SQLServerCodeGenProvider.d.ts +3 -1
  64. package/dist/Database/providers/sqlserver/SQLServerCodeGenProvider.d.ts.map +1 -1
  65. package/dist/Database/providers/sqlserver/SQLServerCodeGenProvider.js +58 -23
  66. package/dist/Database/providers/sqlserver/SQLServerCodeGenProvider.js.map +1 -1
  67. package/dist/Database/providers/sqlserver/__tests__/BaseViewEmissionGoldenMaster.test.js +15 -2
  68. package/dist/Database/providers/sqlserver/__tests__/BaseViewEmissionGoldenMaster.test.js.map +1 -1
  69. package/dist/Database/providers/sqlserver/__tests__/SQLServerCodeGenProvider.test.js +17 -0
  70. package/dist/Database/providers/sqlserver/__tests__/SQLServerCodeGenProvider.test.js.map +1 -1
  71. package/dist/Database/sql_codegen.d.ts +24 -0
  72. package/dist/Database/sql_codegen.d.ts.map +1 -1
  73. package/dist/Database/sql_codegen.js +108 -29
  74. package/dist/Database/sql_codegen.js.map +1 -1
  75. package/dist/Manifest/GenerateClassRegistrationsManifest.d.ts +22 -0
  76. package/dist/Manifest/GenerateClassRegistrationsManifest.d.ts.map +1 -1
  77. package/dist/Manifest/GenerateClassRegistrationsManifest.js +115 -7
  78. package/dist/Manifest/GenerateClassRegistrationsManifest.js.map +1 -1
  79. package/dist/Misc/action_subclasses_codegen.js +2 -2
  80. package/dist/Misc/action_subclasses_codegen.js.map +1 -1
  81. package/dist/Misc/advanced_generation.d.ts +7 -5
  82. package/dist/Misc/advanced_generation.d.ts.map +1 -1
  83. package/dist/Misc/advanced_generation.js +34 -23
  84. package/dist/Misc/advanced_generation.js.map +1 -1
  85. package/dist/Misc/codegen-reporter.d.ts +5 -0
  86. package/dist/Misc/codegen-reporter.d.ts.map +1 -1
  87. package/dist/Misc/codegen-reporter.js +9 -2
  88. package/dist/Misc/codegen-reporter.js.map +1 -1
  89. package/dist/Misc/emit-stats.d.ts +28 -0
  90. package/dist/Misc/emit-stats.d.ts.map +1 -0
  91. package/dist/Misc/emit-stats.js +43 -0
  92. package/dist/Misc/emit-stats.js.map +1 -0
  93. package/dist/Misc/entity_subclasses_codegen.d.ts +20 -2
  94. package/dist/Misc/entity_subclasses_codegen.d.ts.map +1 -1
  95. package/dist/Misc/entity_subclasses_codegen.js +120 -51
  96. package/dist/Misc/entity_subclasses_codegen.js.map +1 -1
  97. package/dist/Misc/file-write.d.ts +15 -0
  98. package/dist/Misc/file-write.d.ts.map +1 -0
  99. package/dist/Misc/file-write.js +33 -0
  100. package/dist/Misc/file-write.js.map +1 -0
  101. package/dist/Misc/graphql_server_codegen.d.ts +12 -2
  102. package/dist/Misc/graphql_server_codegen.d.ts.map +1 -1
  103. package/dist/Misc/graphql_server_codegen.js +72 -16
  104. package/dist/Misc/graphql_server_codegen.js.map +1 -1
  105. package/dist/Misc/remote_operations_codegen.d.ts.map +1 -1
  106. package/dist/Misc/remote_operations_codegen.js +4 -3
  107. package/dist/Misc/remote_operations_codegen.js.map +1 -1
  108. package/dist/Misc/runCommand.d.ts +5 -0
  109. package/dist/Misc/runCommand.d.ts.map +1 -1
  110. package/dist/Misc/runCommand.js +43 -17
  111. package/dist/Misc/runCommand.js.map +1 -1
  112. package/dist/Misc/schema-emit.d.ts +123 -0
  113. package/dist/Misc/schema-emit.d.ts.map +1 -0
  114. package/dist/Misc/schema-emit.js +221 -0
  115. package/dist/Misc/schema-emit.js.map +1 -0
  116. package/dist/Misc/sql_logging.d.ts +63 -8
  117. package/dist/Misc/sql_logging.d.ts.map +1 -1
  118. package/dist/Misc/sql_logging.js +169 -42
  119. package/dist/Misc/sql_logging.js.map +1 -1
  120. package/dist/Misc/util.d.ts +12 -0
  121. package/dist/Misc/util.d.ts.map +1 -1
  122. package/dist/Misc/util.js +71 -8
  123. package/dist/Misc/util.js.map +1 -1
  124. package/dist/index.d.ts +8 -0
  125. package/dist/index.d.ts.map +1 -1
  126. package/dist/index.js +8 -0
  127. package/dist/index.js.map +1 -1
  128. package/dist/plugins/index.d.ts +3 -0
  129. package/dist/plugins/index.d.ts.map +1 -1
  130. package/dist/plugins/index.js +28 -1
  131. package/dist/plugins/index.js.map +1 -1
  132. package/dist/runCodeGen.d.ts +20 -2
  133. package/dist/runCodeGen.d.ts.map +1 -1
  134. package/dist/runCodeGen.js +186 -33
  135. package/dist/runCodeGen.js.map +1 -1
  136. package/package.json +29 -29
@@ -0,0 +1,482 @@
1
+ import fs from 'fs-extra';
2
+ import path from 'path';
3
+ import { BaseSingleton, ordinalCompare } from '@memberjunction/global';
4
+ import { configInfo, outputDir } from '../Config/config.js';
5
+ import { CodeGenReporter } from '../Misc/codegen-reporter.js';
6
+ import { ALLOWED_ENTITY_DECISION_COLUMNS, ALLOWED_FIELD_DECISION_COLUMNS, ALLOWED_SETTING_DECISION_NAMES, ALLOWED_APP_ENTITY_DECISION_COLUMNS, DISALLOWED_COLUMNS, buildDecisionComments, buildEntityLookup, buildFieldLookup, buildSettingLookup, buildAppEntityLookup, getDecisionFileName, formatDecisionRecordData, writeIfChanged } from './decision-metadata-format.js';
7
+ import { canonicalJSONStringify } from '../Misc/util.js';
8
+ /**
9
+ * Singleton writer that collects CodeGen decision outputs (field categories,
10
+ * display names, extended types, search flags, name fields, entity icons, etc.)
11
+ * during a run and persists them as declarative JSON records under
12
+ * metadata/entities/decisions/.
13
+ */
14
+ export class DecisionMetadataWriter extends BaseSingleton {
15
+ constructor() {
16
+ super();
17
+ this._warnedMissingDir = false;
18
+ this.droppedDisallowedColumnCount = 0;
19
+ this.recordsRemovedCount = 0;
20
+ this.recordsUnchangedCount = 0;
21
+ this.recordsWrittenCount = 0;
22
+ this.recordsSkippedCount = 0;
23
+ // In-memory decision buffers keyed by normalized entity name
24
+ this._entityDecisions = new Map();
25
+ this._fieldDecisions = new Map();
26
+ this._settingDecisions = new Map();
27
+ this._appEntityDecisions = new Map();
28
+ this._configOwnedEntityColumns = null;
29
+ this._configOwnedFieldColumns = null;
30
+ this._loggedConflicts = new Set();
31
+ }
32
+ static get Instance() {
33
+ return super.getInstance();
34
+ }
35
+ clear() {
36
+ this._warnedMissingDir = false;
37
+ this.droppedDisallowedColumnCount = 0;
38
+ this.recordsRemovedCount = 0;
39
+ this.recordsUnchangedCount = 0;
40
+ this.recordsWrittenCount = 0;
41
+ this.recordsSkippedCount = 0;
42
+ this._entityDecisions.clear();
43
+ this._fieldDecisions.clear();
44
+ this._settingDecisions.clear();
45
+ this._appEntityDecisions.clear();
46
+ this._configOwnedEntityColumns = null;
47
+ this._configOwnedFieldColumns = null;
48
+ this._loggedConflicts.clear();
49
+ }
50
+ ensureConfigOwnedColumnsLoaded() {
51
+ if (this._configOwnedEntityColumns !== null)
52
+ return;
53
+ this._configOwnedEntityColumns = new Map();
54
+ this._configOwnedFieldColumns = new Map();
55
+ if (!configInfo.additionalSchemaInfo)
56
+ return;
57
+ const configPath = path.isAbsolute(configInfo.additionalSchemaInfo)
58
+ ? configInfo.additionalSchemaInfo
59
+ : path.join(process.cwd(), configInfo.additionalSchemaInfo);
60
+ if (!fs.existsSync(configPath))
61
+ return;
62
+ try {
63
+ const raw = fs.readFileSync(configPath, 'utf8');
64
+ const config = JSON.parse(raw);
65
+ this.loadConfigOwnedColumns(config);
66
+ }
67
+ catch {
68
+ // ignore parse errors
69
+ }
70
+ }
71
+ loadConfigOwnedColumns(config) {
72
+ if (!this._configOwnedEntityColumns)
73
+ this._configOwnedEntityColumns = new Map();
74
+ if (!this._configOwnedFieldColumns)
75
+ this._configOwnedFieldColumns = new Map();
76
+ // 1. Entities[]
77
+ const entities = Array.isArray(config.Entities) ? config.Entities : [];
78
+ const reservedKeys = new Set(['basetable', 'schemaname', 'entityname', 'tablename']);
79
+ for (const ec of entities) {
80
+ if (typeof ec === 'object' && ec !== null) {
81
+ const rec = ec;
82
+ const entityKey = String(rec.EntityName ?? rec.BaseTable ?? '').trim().toLowerCase();
83
+ if (entityKey) {
84
+ let cols = this._configOwnedEntityColumns.get(entityKey);
85
+ if (!cols) {
86
+ cols = new Set();
87
+ this._configOwnedEntityColumns.set(entityKey, cols);
88
+ }
89
+ for (const k of Object.keys(rec)) {
90
+ if (!reservedKeys.has(k.toLowerCase())) {
91
+ cols.add(k.toLowerCase());
92
+ }
93
+ }
94
+ }
95
+ }
96
+ }
97
+ // 2. PrimaryKey & ForeignKeys from Tables or Schema-as-key
98
+ const tableConfigs = [];
99
+ if (Array.isArray(config.Tables)) {
100
+ tableConfigs.push(...config.Tables);
101
+ }
102
+ for (const [key, val] of Object.entries(config)) {
103
+ if (key !== 'Tables' && key !== 'Entities' && key !== 'Schemas' && Array.isArray(val)) {
104
+ tableConfigs.push(...val);
105
+ }
106
+ }
107
+ for (const tc of tableConfigs) {
108
+ const entityKey = String(tc.TableName ?? '').trim().toLowerCase();
109
+ if (!entityKey)
110
+ continue;
111
+ let eMap = this._configOwnedFieldColumns.get(entityKey);
112
+ if (!eMap) {
113
+ eMap = new Map();
114
+ this._configOwnedFieldColumns.set(entityKey, eMap);
115
+ }
116
+ if (Array.isArray(tc.PrimaryKey)) {
117
+ for (const pk of tc.PrimaryKey) {
118
+ const fKey = String(pk.FieldName ?? '').trim().toLowerCase();
119
+ if (!fKey)
120
+ continue;
121
+ let cols = eMap.get(fKey);
122
+ if (!cols) {
123
+ cols = new Set();
124
+ eMap.set(fKey, cols);
125
+ }
126
+ cols.add('isprimarykey');
127
+ cols.add('issoftprimarykey');
128
+ }
129
+ }
130
+ if (Array.isArray(tc.ForeignKeys)) {
131
+ for (const fk of tc.ForeignKeys) {
132
+ const fKey = String(fk.FieldName ?? '').trim().toLowerCase();
133
+ if (!fKey)
134
+ continue;
135
+ let cols = eMap.get(fKey);
136
+ if (!cols) {
137
+ cols = new Set();
138
+ eMap.set(fKey, cols);
139
+ }
140
+ cols.add('relatedentityid');
141
+ cols.add('relatedentityfieldname');
142
+ cols.add('issoftforeignkey');
143
+ cols.add('autoupdaterelatedentityinfo');
144
+ }
145
+ }
146
+ }
147
+ }
148
+ isEntityColumnOwnedByConfig(entityName, column) {
149
+ this.ensureConfigOwnedColumnsLoaded();
150
+ if (!this._configOwnedEntityColumns)
151
+ return false;
152
+ const nameLower = (entityName ?? '').trim().toLowerCase();
153
+ const baseLower = nameLower.includes(':') ? nameLower.split(':').pop().trim() : nameLower;
154
+ const cols = this._configOwnedEntityColumns.get(nameLower) ?? this._configOwnedEntityColumns.get(baseLower);
155
+ return cols ? cols.has(column.toLowerCase()) : false;
156
+ }
157
+ isFieldColumnOwnedByConfig(entityName, fieldName, column) {
158
+ this.ensureConfigOwnedColumnsLoaded();
159
+ if (!this._configOwnedFieldColumns)
160
+ return false;
161
+ const nameLower = (entityName ?? '').trim().toLowerCase();
162
+ const baseLower = nameLower.includes(':') ? nameLower.split(':').pop().trim() : nameLower;
163
+ const eMap = this._configOwnedFieldColumns.get(nameLower) ?? this._configOwnedFieldColumns.get(baseLower);
164
+ if (!eMap)
165
+ return false;
166
+ const cols = eMap.get((fieldName ?? '').trim().toLowerCase());
167
+ return cols ? cols.has(column.toLowerCase()) : false;
168
+ }
169
+ logConfigConflictOnce(entityName, fieldName, column) {
170
+ const key = `${entityName}:${fieldName ?? ''}:${column}`.toLowerCase();
171
+ if (!this._loggedConflicts.has(key)) {
172
+ this._loggedConflicts.add(key);
173
+ const target = fieldName ? `${entityName}.${fieldName}.${column}` : `${entityName}.${column}`;
174
+ console.warn(`[DecisionMetadataWriter] Skipping '${target}' owned by additionalSchemaInfo config.`);
175
+ }
176
+ }
177
+ // ─── Recording API ──────────────────────────────────────────────────────────
178
+ recordEntityDecision(entityName, column, value) {
179
+ if (DISALLOWED_COLUMNS.has(column)) {
180
+ this.droppedDisallowedColumnCount++;
181
+ return;
182
+ }
183
+ if (!ALLOWED_ENTITY_DECISION_COLUMNS.has(column)) {
184
+ return;
185
+ }
186
+ if (this.isEntityColumnOwnedByConfig(entityName, column)) {
187
+ this.logConfigConflictOnce(entityName, undefined, column);
188
+ this.recordsSkippedCount++;
189
+ CodeGenReporter.Instance.counter('metadata.decisionRecordsSkipped', 1);
190
+ return;
191
+ }
192
+ const key = (entityName ?? '').trim();
193
+ if (!key)
194
+ return;
195
+ let map = this._entityDecisions.get(key);
196
+ if (!map) {
197
+ map = new Map();
198
+ this._entityDecisions.set(key, map);
199
+ }
200
+ map.set(column, value);
201
+ }
202
+ recordFieldDecision(entityName, fieldName, column, value) {
203
+ if (DISALLOWED_COLUMNS.has(column)) {
204
+ this.droppedDisallowedColumnCount++;
205
+ return;
206
+ }
207
+ if (!ALLOWED_FIELD_DECISION_COLUMNS.has(column)) {
208
+ return;
209
+ }
210
+ if (this.isFieldColumnOwnedByConfig(entityName, fieldName, column)) {
211
+ this.logConfigConflictOnce(entityName, fieldName, column);
212
+ this.recordsSkippedCount++;
213
+ CodeGenReporter.Instance.counter('metadata.decisionRecordsSkipped', 1);
214
+ return;
215
+ }
216
+ const eKey = (entityName ?? '').trim();
217
+ const fKey = (fieldName ?? '').trim();
218
+ if (!eKey || !fKey)
219
+ return;
220
+ let eMap = this._fieldDecisions.get(eKey);
221
+ if (!eMap) {
222
+ eMap = new Map();
223
+ this._fieldDecisions.set(eKey, eMap);
224
+ }
225
+ let fMap = eMap.get(fKey);
226
+ if (!fMap) {
227
+ fMap = new Map();
228
+ eMap.set(fKey, fMap);
229
+ }
230
+ fMap.set(column, value);
231
+ }
232
+ recordEntitySetting(entityName, settingName, value) {
233
+ if (!ALLOWED_SETTING_DECISION_NAMES.has(settingName)) {
234
+ return;
235
+ }
236
+ const eKey = (entityName ?? '').trim();
237
+ const sKey = (settingName ?? '').trim();
238
+ if (!eKey || !sKey)
239
+ return;
240
+ let map = this._settingDecisions.get(eKey);
241
+ if (!map) {
242
+ map = new Map();
243
+ this._settingDecisions.set(eKey, map);
244
+ }
245
+ map.set(sKey, value);
246
+ }
247
+ recordApplicationEntityDecision(entityName, appName, column, value) {
248
+ if (!ALLOWED_APP_ENTITY_DECISION_COLUMNS.has(column)) {
249
+ return;
250
+ }
251
+ const eKey = (entityName ?? '').trim();
252
+ const aKey = (appName ?? '').trim();
253
+ if (!eKey || !aKey)
254
+ return;
255
+ let eMap = this._appEntityDecisions.get(eKey);
256
+ if (!eMap) {
257
+ eMap = new Map();
258
+ this._appEntityDecisions.set(eKey, eMap);
259
+ }
260
+ let aMap = eMap.get(aKey);
261
+ if (!aMap) {
262
+ aMap = new Map();
263
+ eMap.set(aKey, aMap);
264
+ }
265
+ aMap.set(column, value);
266
+ }
267
+ // ─── Directory Resolution & Persistence ────────────────────────────────────
268
+ resolveDecisionsDirectory() {
269
+ const enabledSetting = configInfo.decisionMetadata?.enabled;
270
+ if (enabledSetting === false) {
271
+ return null;
272
+ }
273
+ const metaDir = outputDir('MetadataSync', false) ?? (configInfo.metadataDirectory ? path.resolve(process.cwd(), configInfo.metadataDirectory) : null);
274
+ if (!metaDir) {
275
+ if (!this._warnedMissingDir) {
276
+ console.warn(`[DecisionMetadataWriter] No 'MetadataSync' output entry found in config. Decision metadata writes disabled.`);
277
+ this._warnedMissingDir = true;
278
+ }
279
+ return null;
280
+ }
281
+ const resolvedMetaDir = path.resolve(metaDir);
282
+ const entitiesDir = path.join(resolvedMetaDir, 'entities');
283
+ const syncConfigPath = path.join(entitiesDir, '.mj-sync.json');
284
+ if (!fs.existsSync(syncConfigPath)) {
285
+ if (!this._warnedMissingDir) {
286
+ console.warn(`[DecisionMetadataWriter] Metadata directory '${entitiesDir}' lacks .mj-sync.json. Decision metadata writes disabled.`);
287
+ this._warnedMissingDir = true;
288
+ }
289
+ return null;
290
+ }
291
+ return path.join(entitiesDir, 'decisions');
292
+ }
293
+ /**
294
+ * Flush pending decision metadata for an entity to disk.
295
+ */
296
+ async flushEntity(entity) {
297
+ const entityName = (entity.Name ?? '').trim();
298
+ const schemaName = (entity.SchemaName ?? 'dbo').trim();
299
+ if (!entityName)
300
+ return;
301
+ const decisionsDir = this.resolveDecisionsDirectory();
302
+ if (!decisionsDir) {
303
+ // Record skipped decisions
304
+ const fieldDecs = this._fieldDecisions.get(entityName);
305
+ const entityDecs = this._entityDecisions.get(entityName);
306
+ const settingDecs = this._settingDecisions.get(entityName);
307
+ const appDecs = this._appEntityDecisions.get(entityName);
308
+ const totalDecisions = (fieldDecs?.size ?? 0) + (entityDecs ? 1 : 0) + (settingDecs?.size ?? 0) + (appDecs?.size ?? 0);
309
+ if (totalDecisions > 0) {
310
+ this.recordsSkippedCount += totalDecisions;
311
+ CodeGenReporter.Instance.counter('metadata.decisionRecordsSkipped', totalDecisions);
312
+ }
313
+ return;
314
+ }
315
+ const fileName = getDecisionFileName(schemaName, entityName);
316
+ const filePath = path.join(decisionsDir, fileName);
317
+ const fileExists = await fs.pathExists(filePath);
318
+ const hasEntityDecs = this._entityDecisions.has(entityName);
319
+ const hasFieldDecs = this._fieldDecisions.has(entityName);
320
+ const hasSettingDecs = this._settingDecisions.has(entityName);
321
+ const hasAppDecs = this._appEntityDecisions.has(entityName);
322
+ const hasAnyDecisions = hasEntityDecs || hasFieldDecs || hasSettingDecs || hasAppDecs;
323
+ // Rule: a run that decides nothing writes nothing if no file exists
324
+ if (!hasAnyDecisions && !fileExists) {
325
+ return;
326
+ }
327
+ let records = [];
328
+ if (fileExists) {
329
+ try {
330
+ const parsed = await fs.readJson(filePath);
331
+ records = Array.isArray(parsed) ? parsed : [parsed];
332
+ }
333
+ catch {
334
+ records = [];
335
+ }
336
+ }
337
+ let mainRecord;
338
+ if (records.length > 0) {
339
+ mainRecord = records[0];
340
+ if (!mainRecord.fields)
341
+ mainRecord.fields = { Name: entityName };
342
+ if (!mainRecord.primaryKey)
343
+ mainRecord.primaryKey = { ID: buildEntityLookup(entityName) };
344
+ }
345
+ else {
346
+ mainRecord = {
347
+ _comments: buildDecisionComments(entityName, schemaName),
348
+ fields: { Name: entityName },
349
+ primaryKey: { ID: buildEntityLookup(entityName) },
350
+ relatedEntities: {}
351
+ };
352
+ records = [mainRecord];
353
+ }
354
+ // Apply entity decisions
355
+ const entityDecMap = this._entityDecisions.get(entityName);
356
+ if (entityDecMap) {
357
+ for (const [col, val] of entityDecMap) {
358
+ mainRecord.fields[col] = val;
359
+ }
360
+ }
361
+ if (!mainRecord.relatedEntities) {
362
+ mainRecord.relatedEntities = {};
363
+ }
364
+ // Handle MJ: Entity Fields
365
+ let existingFieldRecords = mainRecord.relatedEntities['MJ: Entity Fields'] ?? [];
366
+ const validFieldNamesLower = new Set(entity.Fields.map(f => (f.Name ?? '').trim().toLowerCase()));
367
+ // Reconcile dropped/renamed fields
368
+ const initialFieldCount = existingFieldRecords.length;
369
+ existingFieldRecords = existingFieldRecords.filter(fr => {
370
+ const fName = String(fr.fields?.Name ?? '').trim().toLowerCase();
371
+ return validFieldNamesLower.has(fName);
372
+ });
373
+ const removedCount = initialFieldCount - existingFieldRecords.length;
374
+ if (removedCount > 0) {
375
+ this.recordsRemovedCount += removedCount;
376
+ CodeGenReporter.Instance.counter('metadata.decisionRecordsRemoved', removedCount);
377
+ }
378
+ const fieldDecMap = this._fieldDecisions.get(entityName);
379
+ if (fieldDecMap) {
380
+ for (const [fieldName, colMap] of fieldDecMap) {
381
+ let fieldRec = existingFieldRecords.find(fr => String(fr.fields?.Name ?? '').trim().toLowerCase() === fieldName.toLowerCase());
382
+ if (!fieldRec) {
383
+ fieldRec = {
384
+ fields: { Name: fieldName },
385
+ primaryKey: { ID: buildFieldLookup(entityName, fieldName) }
386
+ };
387
+ existingFieldRecords.push(fieldRec);
388
+ }
389
+ for (const [col, val] of colMap) {
390
+ fieldRec.fields[col] = val;
391
+ }
392
+ }
393
+ }
394
+ // Sort MJ: Entity Fields by entity field Sequence, then Name
395
+ const seqMap = new Map();
396
+ for (const f of entity.Fields) {
397
+ seqMap.set(f.Name.toLowerCase(), f.Sequence ?? 0);
398
+ }
399
+ existingFieldRecords.sort((a, b) => {
400
+ const nameA = String(a.fields?.Name ?? '');
401
+ const nameB = String(b.fields?.Name ?? '');
402
+ const seqA = seqMap.get(nameA.toLowerCase()) ?? 0;
403
+ const seqB = seqMap.get(nameB.toLowerCase()) ?? 0;
404
+ if (seqA !== seqB)
405
+ return seqA - seqB;
406
+ return ordinalCompare(nameA, nameB);
407
+ });
408
+ if (existingFieldRecords.length > 0) {
409
+ mainRecord.relatedEntities['MJ: Entity Fields'] = existingFieldRecords;
410
+ }
411
+ else {
412
+ delete mainRecord.relatedEntities['MJ: Entity Fields'];
413
+ }
414
+ // Handle MJ: Entity Settings
415
+ let existingSettingRecords = mainRecord.relatedEntities['MJ: Entity Settings'] ?? [];
416
+ const settingDecMap = this._settingDecisions.get(entityName);
417
+ if (settingDecMap) {
418
+ for (const [settingName, val] of settingDecMap) {
419
+ let sRec = existingSettingRecords.find(sr => String(sr.fields?.Name ?? '').trim().toLowerCase() === settingName.toLowerCase());
420
+ if (!sRec) {
421
+ sRec = {
422
+ fields: { Name: settingName, Value: {} },
423
+ primaryKey: { ID: buildSettingLookup(entityName, settingName) }
424
+ };
425
+ existingSettingRecords.push(sRec);
426
+ }
427
+ if (typeof val === 'object' && val !== null) {
428
+ sRec.fields.Value = JSON.parse(canonicalJSONStringify(val));
429
+ }
430
+ else {
431
+ sRec.fields.Value = val;
432
+ }
433
+ }
434
+ }
435
+ existingSettingRecords.sort((a, b) => ordinalCompare(String(a.fields?.Name ?? ''), String(b.fields?.Name ?? '')));
436
+ if (existingSettingRecords.length > 0) {
437
+ mainRecord.relatedEntities['MJ: Entity Settings'] = existingSettingRecords;
438
+ }
439
+ else {
440
+ delete mainRecord.relatedEntities['MJ: Entity Settings'];
441
+ }
442
+ // Handle MJ: Application Entities
443
+ let existingAppRecords = mainRecord.relatedEntities['MJ: Application Entities'] ?? [];
444
+ const appDecMap = this._appEntityDecisions.get(entityName);
445
+ if (appDecMap) {
446
+ for (const [appName, colMap] of appDecMap) {
447
+ let aRec = existingAppRecords.find(ar => String(ar.fields?.Application ?? '').trim().toLowerCase() === appName.toLowerCase());
448
+ if (!aRec) {
449
+ aRec = {
450
+ fields: { Application: appName, Entity: entityName },
451
+ primaryKey: { ID: buildAppEntityLookup(appName, entityName) }
452
+ };
453
+ existingAppRecords.push(aRec);
454
+ }
455
+ for (const [col, val] of colMap) {
456
+ aRec.fields[col] = val;
457
+ }
458
+ }
459
+ }
460
+ if (existingAppRecords.length > 0) {
461
+ mainRecord.relatedEntities['MJ: Application Entities'] = existingAppRecords;
462
+ }
463
+ else {
464
+ delete mainRecord.relatedEntities['MJ: Application Entities'];
465
+ }
466
+ // If relatedEntities is now empty, clean it up
467
+ if (Object.keys(mainRecord.relatedEntities).length === 0) {
468
+ delete mainRecord.relatedEntities;
469
+ }
470
+ const formatted = formatDecisionRecordData(records);
471
+ const written = await writeIfChanged(filePath, formatted);
472
+ if (written) {
473
+ this.recordsWrittenCount++;
474
+ CodeGenReporter.Instance.counter('metadata.decisionRecordsWritten');
475
+ }
476
+ else {
477
+ this.recordsUnchangedCount++;
478
+ CodeGenReporter.Instance.counter('metadata.decisionRecordsUnchanged');
479
+ }
480
+ }
481
+ }
482
+ //# sourceMappingURL=decision-metadata-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decision-metadata-writer.js","sourceRoot":"","sources":["../../src/Database/decision-metadata-writer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /** Columns the schema sync may rewrite. `Sequence` is deliberately absent: a renumber is not a change (FM3). */
2
+ export declare const TRACKED_FIELD_COLUMNS: readonly ["Description", "Type", "Length", "Precision", "Scale", "AllowsNull", "DefaultValue", "AutoIncrement", "IsVirtual", "IsComputed", "RelatedEntityID", "RelatedEntityFieldName", "IsPrimaryKey", "IsUnique", "AllowUpdateAPI"];
3
+ export type FieldChangeReason = typeof TRACKED_FIELD_COLUMNS[number];
4
+ /** Reasons that re-open DisplayName (§3.4). */
5
+ export declare const DISPLAYNAME_REOPEN_REASONS: ReadonlySet<FieldChangeReason>;
6
+ /** Reasons that re-open the type-derived columns (§3.4). */
7
+ export declare const TYPE_REOPEN_REASONS: ReadonlySet<FieldChangeReason>;
8
+ export interface EntityFieldSnapshotRow {
9
+ ID: string;
10
+ EntityID: string;
11
+ EntityName: string;
12
+ Name: string;
13
+ Description: string | null;
14
+ Type: string;
15
+ Length: number | null;
16
+ Precision: number | null;
17
+ Scale: number | null;
18
+ AllowsNull: boolean;
19
+ DefaultValue: string | null;
20
+ AutoIncrement: boolean;
21
+ IsVirtual: boolean;
22
+ IsComputed: boolean;
23
+ RelatedEntityID: string | null;
24
+ RelatedEntityFieldName: string | null;
25
+ IsPrimaryKey: boolean;
26
+ IsUnique: boolean;
27
+ AllowUpdateAPI: boolean;
28
+ }
29
+ export interface EntityFieldChange {
30
+ entityID: string;
31
+ entityName: string;
32
+ fieldID: string;
33
+ fieldName: string;
34
+ reasons: FieldChangeReason[];
35
+ }
36
+ /**
37
+ * Normalizes a field value according to column comparison semantics:
38
+ * - Description, DefaultValue, RelatedEntityFieldName: trimmed strings, null ≡ ''
39
+ * - RelatedEntityID: trimmed, lowercased, null ≡ ''
40
+ * - Boolean/bit columns: coerced with Boolean()
41
+ * - Numbers: number or null
42
+ * - Strings: trimmed
43
+ */
44
+ export declare function normalizeSnapshotValue(column: FieldChangeReason, value: unknown): unknown;
45
+ /**
46
+ * Compares before and after snapshots of EntityField rows.
47
+ * Rows keyed by ID. A row only in `after` is new this run and is not a change;
48
+ * `isNew` excludes the INSERT sites' rows too.
49
+ * A row only in `before` was deleted and is ignored.
50
+ * Returns changes sorted by entityName then fieldName using ordinalCompare.
51
+ */
52
+ export declare function diffEntityFieldSnapshots(before: ReadonlyMap<string, EntityFieldSnapshotRow>, after: ReadonlyMap<string, EntityFieldSnapshotRow>, isNew: (entityID: string, name: string) => boolean): EntityFieldChange[];
53
+ //# sourceMappingURL=entity-field-change-tracking.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-field-change-tracking.d.ts","sourceRoot":"","sources":["../../src/Database/entity-field-change-tracking.ts"],"names":[],"mappings":"AAEA,gHAAgH;AAChH,eAAO,MAAM,qBAAqB,uOAgBxB,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,OAAO,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAErE,+CAA+C;AAC/C,eAAO,MAAM,0BAA0B,EAAE,WAAW,CAAC,iBAAiB,CAA4B,CAAC;AAEnG,4DAA4D;AAC5D,eAAO,MAAM,mBAAmB,EAAE,WAAW,CAAC,iBAAiB,CAAmE,CAAC;AAEnI,MAAM,WAAW,sBAAsB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,cAAc,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAqCzF;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACrC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,sBAAsB,CAAC,EACnD,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,sBAAsB,CAAC,EAClD,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,GAClD,iBAAiB,EAAE,CAyCrB"}