@memberjunction/core 6.2.0-edge.4 → 6.2.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 (150) hide show
  1. package/dist/generic/BaseEntitySaveQueue.d.ts +22 -0
  2. package/dist/generic/BaseEntitySaveQueue.d.ts.map +1 -1
  3. package/dist/generic/BaseEntitySaveQueue.js +43 -4
  4. package/dist/generic/BaseEntitySaveQueue.js.map +1 -1
  5. package/dist/generic/JSONType-interfaces/IEntityConfiguration.d.ts +18 -0
  6. package/dist/generic/JSONType-interfaces/IEntityConfiguration.d.ts.map +1 -1
  7. package/dist/generic/alternateBaseViews.d.ts +119 -0
  8. package/dist/generic/alternateBaseViews.d.ts.map +1 -0
  9. package/dist/generic/alternateBaseViews.js +223 -0
  10. package/dist/generic/alternateBaseViews.js.map +1 -0
  11. package/dist/generic/baseEngine.d.ts +82 -14
  12. package/dist/generic/baseEngine.d.ts.map +1 -1
  13. package/dist/generic/baseEngine.js +311 -46
  14. package/dist/generic/baseEngine.js.map +1 -1
  15. package/dist/generic/baseEngineRegistry.d.ts.map +1 -1
  16. package/dist/generic/baseEngineRegistry.js +2 -1
  17. package/dist/generic/baseEngineRegistry.js.map +1 -1
  18. package/dist/generic/baseEntity.d.ts +194 -14
  19. package/dist/generic/baseEntity.d.ts.map +1 -1
  20. package/dist/generic/baseEntity.js +638 -218
  21. package/dist/generic/baseEntity.js.map +1 -1
  22. package/dist/generic/baseInfo.d.ts +31 -3
  23. package/dist/generic/baseInfo.d.ts.map +1 -1
  24. package/dist/generic/baseInfo.js +138 -40
  25. package/dist/generic/baseInfo.js.map +1 -1
  26. package/dist/generic/contextTokens.d.ts +136 -0
  27. package/dist/generic/contextTokens.d.ts.map +1 -0
  28. package/dist/generic/contextTokens.js +319 -0
  29. package/dist/generic/contextTokens.js.map +1 -0
  30. package/dist/generic/databaseProviderBase.d.ts +103 -13
  31. package/dist/generic/databaseProviderBase.d.ts.map +1 -1
  32. package/dist/generic/databaseProviderBase.js +321 -77
  33. package/dist/generic/databaseProviderBase.js.map +1 -1
  34. package/dist/generic/embeddedRecord.d.ts +6 -0
  35. package/dist/generic/embeddedRecord.d.ts.map +1 -1
  36. package/dist/generic/embeddedRecord.js +15 -1
  37. package/dist/generic/embeddedRecord.js.map +1 -1
  38. package/dist/generic/entityCompanion.d.ts +7 -0
  39. package/dist/generic/entityCompanion.d.ts.map +1 -1
  40. package/dist/generic/entityCompanion.js +8 -0
  41. package/dist/generic/entityCompanion.js.map +1 -1
  42. package/dist/generic/entityConfiguration.d.ts +8 -2
  43. package/dist/generic/entityConfiguration.d.ts.map +1 -1
  44. package/dist/generic/entityConfiguration.js +9 -0
  45. package/dist/generic/entityConfiguration.js.map +1 -1
  46. package/dist/generic/entityInfo.d.ts +306 -12
  47. package/dist/generic/entityInfo.d.ts.map +1 -1
  48. package/dist/generic/entityInfo.js +894 -92
  49. package/dist/generic/entityInfo.js.map +1 -1
  50. package/dist/generic/entityValueFieldSecurity.d.ts +139 -0
  51. package/dist/generic/entityValueFieldSecurity.d.ts.map +1 -0
  52. package/dist/generic/entityValueFieldSecurity.js +250 -0
  53. package/dist/generic/entityValueFieldSecurity.js.map +1 -0
  54. package/dist/generic/fieldSecuritySQLGate.d.ts +350 -0
  55. package/dist/generic/fieldSecuritySQLGate.d.ts.map +1 -0
  56. package/dist/generic/fieldSecuritySQLGate.js +898 -0
  57. package/dist/generic/fieldSecuritySQLGate.js.map +1 -0
  58. package/dist/generic/indexRestrictedFields.d.ts +47 -0
  59. package/dist/generic/indexRestrictedFields.d.ts.map +1 -0
  60. package/dist/generic/indexRestrictedFields.js +129 -0
  61. package/dist/generic/indexRestrictedFields.js.map +1 -0
  62. package/dist/generic/infoProviderResolution.d.ts +16 -0
  63. package/dist/generic/infoProviderResolution.d.ts.map +1 -0
  64. package/dist/generic/infoProviderResolution.js +17 -0
  65. package/dist/generic/infoProviderResolution.js.map +1 -0
  66. package/dist/generic/interfaces.d.ts +39 -2
  67. package/dist/generic/interfaces.d.ts.map +1 -1
  68. package/dist/generic/interfaces.js.map +1 -1
  69. package/dist/generic/localCacheManager.d.ts +318 -51
  70. package/dist/generic/localCacheManager.d.ts.map +1 -1
  71. package/dist/generic/localCacheManager.js +675 -109
  72. package/dist/generic/localCacheManager.js.map +1 -1
  73. package/dist/generic/logging.d.ts.map +1 -1
  74. package/dist/generic/logging.js +7 -1
  75. package/dist/generic/logging.js.map +1 -1
  76. package/dist/generic/metadata.d.ts +3 -2
  77. package/dist/generic/metadata.d.ts.map +1 -1
  78. package/dist/generic/metadata.js +5 -2
  79. package/dist/generic/metadata.js.map +1 -1
  80. package/dist/generic/mjapiUrl.d.ts +21 -0
  81. package/dist/generic/mjapiUrl.d.ts.map +1 -0
  82. package/dist/generic/mjapiUrl.js +25 -0
  83. package/dist/generic/mjapiUrl.js.map +1 -0
  84. package/dist/generic/platformSQL.d.ts +54 -0
  85. package/dist/generic/platformSQL.d.ts.map +1 -1
  86. package/dist/generic/platformSQL.js +55 -0
  87. package/dist/generic/platformSQL.js.map +1 -1
  88. package/dist/generic/providerBase.d.ts +370 -57
  89. package/dist/generic/providerBase.d.ts.map +1 -1
  90. package/dist/generic/providerBase.js +1085 -284
  91. package/dist/generic/providerBase.js.map +1 -1
  92. package/dist/generic/queryInfo.d.ts +23 -9
  93. package/dist/generic/queryInfo.d.ts.map +1 -1
  94. package/dist/generic/queryInfo.js +73 -33
  95. package/dist/generic/queryInfo.js.map +1 -1
  96. package/dist/generic/queryInfoInterfaces.d.ts +8 -0
  97. package/dist/generic/queryInfoInterfaces.d.ts.map +1 -1
  98. package/dist/generic/queryTemplateContext.d.ts +49 -0
  99. package/dist/generic/queryTemplateContext.d.ts.map +1 -0
  100. package/dist/generic/queryTemplateContext.js +113 -0
  101. package/dist/generic/queryTemplateContext.js.map +1 -0
  102. package/dist/generic/recordChangeFieldSecurity.d.ts.map +1 -1
  103. package/dist/generic/recordChangeFieldSecurity.js +13 -2
  104. package/dist/generic/recordChangeFieldSecurity.js.map +1 -1
  105. package/dist/generic/relatedRecordCollection.d.ts +13 -0
  106. package/dist/generic/relatedRecordCollection.d.ts.map +1 -1
  107. package/dist/generic/relatedRecordCollection.js +44 -5
  108. package/dist/generic/relatedRecordCollection.js.map +1 -1
  109. package/dist/generic/runQuery.d.ts +42 -0
  110. package/dist/generic/runQuery.d.ts.map +1 -1
  111. package/dist/generic/runQuery.js +14 -0
  112. package/dist/generic/runQuery.js.map +1 -1
  113. package/dist/generic/runQuerySQLFilterImplementations.d.ts.map +1 -1
  114. package/dist/generic/runQuerySQLFilterImplementations.js +38 -2
  115. package/dist/generic/runQuerySQLFilterImplementations.js.map +1 -1
  116. package/dist/generic/saveEntityGraphOperation.d.ts.map +1 -1
  117. package/dist/generic/saveEntityGraphOperation.js +3 -0
  118. package/dist/generic/saveEntityGraphOperation.js.map +1 -1
  119. package/dist/generic/scoring/ReciprocalRankFusion.d.ts.map +1 -1
  120. package/dist/generic/scoring/ReciprocalRankFusion.js +10 -3
  121. package/dist/generic/scoring/ReciprocalRankFusion.js.map +1 -1
  122. package/dist/generic/securityInfo.d.ts +17 -6
  123. package/dist/generic/securityInfo.d.ts.map +1 -1
  124. package/dist/generic/securityInfo.js +25 -10
  125. package/dist/generic/securityInfo.js.map +1 -1
  126. package/dist/generic/telemetryManager.d.ts +9 -0
  127. package/dist/generic/telemetryManager.d.ts.map +1 -1
  128. package/dist/generic/telemetryManager.js +5 -1
  129. package/dist/generic/telemetryManager.js.map +1 -1
  130. package/dist/generic/util.d.ts.map +1 -1
  131. package/dist/generic/util.js +3 -0
  132. package/dist/generic/util.js.map +1 -1
  133. package/dist/generic/wellKnownUserSource.d.ts +3 -2
  134. package/dist/generic/wellKnownUserSource.d.ts.map +1 -1
  135. package/dist/generic/wellKnownUserSource.js +18 -9
  136. package/dist/generic/wellKnownUserSource.js.map +1 -1
  137. package/dist/index.d.ts +8 -0
  138. package/dist/index.d.ts.map +1 -1
  139. package/dist/index.js +8 -0
  140. package/dist/index.js.map +1 -1
  141. package/dist/views/runView.d.ts +89 -0
  142. package/dist/views/runView.d.ts.map +1 -1
  143. package/dist/views/runView.js +36 -0
  144. package/dist/views/runView.js.map +1 -1
  145. package/dist/views/viewProperties.d.ts +55 -0
  146. package/dist/views/viewProperties.d.ts.map +1 -0
  147. package/dist/views/viewProperties.js +258 -0
  148. package/dist/views/viewProperties.js.map +1 -0
  149. package/package.json +3 -3
  150. package/readme.md +29 -4
@@ -1,3 +1,4 @@
1
+ import type { IMetadataProvider } from "./interfaces.js";
1
2
  /**
2
3
  * Base class for all MemberJunction metadata info classes.
3
4
  * Provides common functionality for copying initialization data and handling default values.
@@ -9,7 +10,28 @@ export declare abstract class BaseInfo {
9
10
  */
10
11
  ID: any;
11
12
  /**
12
- * Whether `key` resolves to a settable accessor somewhere on the prototype chain.
13
+ * The metadata provider that built this Info object, when known.
14
+ *
15
+ * Info getters that resolve sibling metadata (an entity's IS-A children, a permission's RLS
16
+ * filter, a query's fields, an authorization's roles, …) must read from the SAME provider the
17
+ * object came from. In a multi-provider process — several `GraphQLDataProvider` instances with
18
+ * `separateConnection`, or a server servicing several connections — the global
19
+ * `Metadata.Provider` is a different provider or not set at all. Providers pass themselves to
20
+ * every Info constructor (`new m.class(row, provider)`), and container Info objects hand it to
21
+ * the child Info objects they construct.
22
+ *
23
+ * `undefined` for an Info object built outside a provider (tests, ad-hoc construction). Callers
24
+ * then fall back to the global provider, which is exactly the pre-existing behavior.
25
+ */
26
+ get OwningProvider(): IMetadataProvider | undefined;
27
+ /**
28
+ * Records the provider that owns this Info object. A null/undefined provider is ignored, so
29
+ * passing an optional constructor argument straight through is always safe.
30
+ * @param provider - the provider whose metadata this object belongs to
31
+ */
32
+ SetOwningProvider(provider: IMetadataProvider | null | undefined): void;
33
+ /**
34
+ * Returns the cached set of settable accessor names on `instance`'s prototype chain.
13
35
  *
14
36
  * A `@deprecated` alias for a renamed field is a get/set pair on the prototype, not an own
15
37
  * property, so `hasOwnProperty` does not see it. Without this the incoming value is silently
@@ -19,14 +41,20 @@ export declare abstract class BaseInfo {
19
41
  * Only accessors that can be WRITTEN qualify. A read-only getter has nothing to assign to, and
20
42
  * requiring a setter keeps inherited methods out of the copy.
21
43
  */
22
- private settableAccessor;
44
+ private static getSettableAccessorsForInstance;
45
+ /**
46
+ * Resolves and caches the public getter name on `instance`'s prototype chain corresponding
47
+ * to a `_`-prefixed backing field (or `null` if no matching getter exists).
48
+ */
49
+ private static resolveBackingGetterKey;
23
50
  /**
24
51
  * Copies initialization data from a plain object to the class instance.
25
52
  * Only copies properties that already exist on the class to prevent creating new fields.
26
53
  * Special handling for DefaultValue fields to extract actual values from SQL Server syntax.
27
54
  * @param initData - The initialization data object
55
+ * @param skipKeys - Optional set of property keys handled directly by the subclass constructor
28
56
  */
29
- protected copyInitData(initData: any): void;
57
+ protected copyInitData(initData: any, skipKeys?: ReadonlySet<string>): void;
30
58
  /**
31
59
  * Creates a new instance of the BaseInfo-derived class.
32
60
  * @param initData - Optional initialization data to populate the instance
@@ -1 +1 @@
1
- {"version":3,"file":"baseInfo.d.ts","sourceRoot":"","sources":["../../src/generic/baseInfo.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,8BAAsB,QAAQ;IAC1B;;OAEG;IACH,EAAE,EAAE,GAAG,CAAO;IAEd;;;;;;;;;;OAUG;IACH,OAAO,CAAC,gBAAgB;IAUxB;;;;;OAKG;IACH,SAAS,CAAC,YAAY,CAAC,QAAQ,EAAE,GAAG;IAkCpC;;;OAGG;gBACS,QAAQ,GAAE,GAAU;IAMhC;;;;;;;;;;;;;;;;;;;OAmBG;IACH,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAuCpC"}
1
+ {"version":3,"file":"baseInfo.d.ts","sourceRoot":"","sources":["../../src/generic/baseInfo.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAuBtD;;;;GAIG;AACH,8BAAsB,QAAQ;IAC1B;;OAEG;IACH,EAAE,EAAE,GAAG,CAAO;IAEd;;;;;;;;;;;;;OAaG;IACH,IAAW,cAAc,IAAI,iBAAiB,GAAG,SAAS,CAEzD;IAED;;;;OAIG;IACI,iBAAiB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI;IAM9E;;;;;;;;;;OAUG;IACH,OAAO,CAAC,MAAM,CAAC,+BAA+B;IA0B9C;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,uBAAuB;IA+BtC;;;;;;OAMG;IACH,SAAS,CAAC,YAAY,CAAC,QAAQ,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC;IA4CpE;;;OAGG;gBACS,QAAQ,GAAE,GAAU;IAMhC;;;;;;;;;;;;;;;;;;;OAmBG;IACH,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAgCpC"}
@@ -1,4 +1,22 @@
1
1
  import { ExtractActualDefaultValue } from "./util.js";
2
+ /**
3
+ * Back-references from Info objects to the metadata provider that built them. Held OUTSIDE the
4
+ * instances (a WeakMap rather than a field) so the reference can never leak into `toJSON()`,
5
+ * `Object.keys()`, `copyInitData` of a clone, or the local metadata cache — and so an Info object
6
+ * never keeps its provider reachable on its own account.
7
+ */
8
+ const owningProviders = new WeakMap();
9
+ /**
10
+ * Per-constructor cache of property names that resolve to a settable accessor (`set` function)
11
+ * on the subclass prototype chain. Avoids repeated prototype walks during `copyInitData`.
12
+ */
13
+ const settableAccessorsByClass = new WeakMap();
14
+ /**
15
+ * Per-constructor cache mapping `_`-prefixed private backing field names (e.g. `_fields`) to
16
+ * their public getter name on the prototype chain (e.g. `Fields`), or `null` when no public
17
+ * getter exists. Avoids repeated prototype walks during `toJSON()` serialization.
18
+ */
19
+ const backingGetterByClass = new WeakMap();
2
20
  /**
3
21
  * Base class for all MemberJunction metadata info classes.
4
22
  * Provides common functionality for copying initialization data and handling default values.
@@ -6,7 +24,34 @@ import { ExtractActualDefaultValue } from "./util.js";
6
24
  */
7
25
  export class BaseInfo {
8
26
  /**
9
- * Whether `key` resolves to a settable accessor somewhere on the prototype chain.
27
+ * The metadata provider that built this Info object, when known.
28
+ *
29
+ * Info getters that resolve sibling metadata (an entity's IS-A children, a permission's RLS
30
+ * filter, a query's fields, an authorization's roles, …) must read from the SAME provider the
31
+ * object came from. In a multi-provider process — several `GraphQLDataProvider` instances with
32
+ * `separateConnection`, or a server servicing several connections — the global
33
+ * `Metadata.Provider` is a different provider or not set at all. Providers pass themselves to
34
+ * every Info constructor (`new m.class(row, provider)`), and container Info objects hand it to
35
+ * the child Info objects they construct.
36
+ *
37
+ * `undefined` for an Info object built outside a provider (tests, ad-hoc construction). Callers
38
+ * then fall back to the global provider, which is exactly the pre-existing behavior.
39
+ */
40
+ get OwningProvider() {
41
+ return owningProviders.get(this);
42
+ }
43
+ /**
44
+ * Records the provider that owns this Info object. A null/undefined provider is ignored, so
45
+ * passing an optional constructor argument straight through is always safe.
46
+ * @param provider - the provider whose metadata this object belongs to
47
+ */
48
+ SetOwningProvider(provider) {
49
+ if (provider) {
50
+ owningProviders.set(this, provider);
51
+ }
52
+ }
53
+ /**
54
+ * Returns the cached set of settable accessor names on `instance`'s prototype chain.
10
55
  *
11
56
  * A `@deprecated` alias for a renamed field is a get/set pair on the prototype, not an own
12
57
  * property, so `hasOwnProperty` does not see it. Without this the incoming value is silently
@@ -16,50 +61,111 @@ export class BaseInfo {
16
61
  * Only accessors that can be WRITTEN qualify. A read-only getter has nothing to assign to, and
17
62
  * requiring a setter keeps inherited methods out of the copy.
18
63
  */
19
- settableAccessor(key) {
20
- let target = Object.getPrototypeOf(this);
64
+ static getSettableAccessorsForInstance(instance) {
65
+ const ctor = instance.constructor;
66
+ let cached = settableAccessorsByClass.get(ctor);
67
+ if (cached) {
68
+ return cached;
69
+ }
70
+ cached = new Set();
71
+ const seen = new Set();
72
+ let target = Object.getPrototypeOf(instance);
21
73
  while (target && target !== Object.prototype) {
22
- const descriptor = Object.getOwnPropertyDescriptor(target, key);
23
- if (descriptor)
24
- return typeof descriptor.set === 'function';
74
+ const descriptors = Object.getOwnPropertyDescriptors(target);
75
+ const names = Object.keys(descriptors);
76
+ for (let i = 0; i < names.length; i++) {
77
+ const name = names[i];
78
+ if (seen.has(name))
79
+ continue;
80
+ seen.add(name);
81
+ if (typeof descriptors[name].set === 'function') {
82
+ cached.add(name);
83
+ }
84
+ }
25
85
  target = Object.getPrototypeOf(target);
26
86
  }
27
- return false;
87
+ settableAccessorsByClass.set(ctor, cached);
88
+ return cached;
89
+ }
90
+ /**
91
+ * Resolves and caches the public getter name on `instance`'s prototype chain corresponding
92
+ * to a `_`-prefixed backing field (or `null` if no matching getter exists).
93
+ */
94
+ static resolveBackingGetterKey(instance, backingKey) {
95
+ const ctor = instance.constructor;
96
+ let map = backingGetterByClass.get(ctor);
97
+ if (!map) {
98
+ map = new Map();
99
+ backingGetterByClass.set(ctor, map);
100
+ }
101
+ const existing = map.get(backingKey);
102
+ if (existing !== undefined) {
103
+ return existing;
104
+ }
105
+ const lowerKey = backingKey.slice(1);
106
+ if (!lowerKey) {
107
+ map.set(backingKey, null);
108
+ return null;
109
+ }
110
+ const pascalKey = lowerKey.charAt(0).toUpperCase() + lowerKey.slice(1);
111
+ let proto = Object.getPrototypeOf(instance);
112
+ while (proto && proto !== Object.prototype) {
113
+ const targetKey = Object.prototype.hasOwnProperty.call(proto, pascalKey) ? pascalKey : lowerKey;
114
+ const desc = Object.getOwnPropertyDescriptor(proto, targetKey);
115
+ if (desc && typeof desc.get === 'function') {
116
+ map.set(backingKey, targetKey);
117
+ return targetKey;
118
+ }
119
+ proto = Object.getPrototypeOf(proto);
120
+ }
121
+ map.set(backingKey, null);
122
+ return null;
28
123
  }
29
124
  /**
30
125
  * Copies initialization data from a plain object to the class instance.
31
126
  * Only copies properties that already exist on the class to prevent creating new fields.
32
127
  * Special handling for DefaultValue fields to extract actual values from SQL Server syntax.
33
128
  * @param initData - The initialization data object
129
+ * @param skipKeys - Optional set of property keys handled directly by the subclass constructor
34
130
  */
35
- copyInitData(initData) {
131
+ copyInitData(initData, skipKeys) {
36
132
  if (initData) {
133
+ const self = this;
134
+ let settableAccessors;
37
135
  // copy the properties from the init data to the new class instance we are constructing
38
136
  const keys = Object.keys(initData);
39
137
  for (let j = 0; j < keys.length; j++) {
40
138
  const key = keys[j];
139
+ if (skipKeys && skipKeys.has(key)) {
140
+ continue;
141
+ }
142
+ const val = initData[key];
143
+ const isOwn = Object.prototype.hasOwnProperty.call(this, key);
144
+ if (isOwn && val === null && self[key] === null) {
145
+ continue;
146
+ }
41
147
  // make sure it is one of our keys, we don't want to create NEW fields
42
- if (Object.prototype.hasOwnProperty.call(this, key) || this.settableAccessor(key)) {
148
+ if (isOwn || (settableAccessors ??= BaseInfo.getSettableAccessorsForInstance(this)).has(key)) {
43
149
  // fast path for exact match first, fallback to length check + lowercasing
44
- if ((key === 'DefaultValue' || (key.length === 12 && key.toLowerCase() === 'defaultvalue')) && initData[key]) {
150
+ if ((key === 'DefaultValue' || (key.length === 12 && key.toLowerCase() === 'defaultvalue')) && val) {
45
151
  // strip parens from default value from the DB, if they exist, for example defaults might be ((1)) or (getdate())
46
152
  // could also be something like (('Pending')) in which case we'll want to remove the SYMMETRIC parens
47
- const initialValue = initData[key];
153
+ const initialValue = val;
48
154
  const trueDefault = ExtractActualDefaultValue(initialValue);
49
- this[key] = trueDefault;
155
+ self[key] = trueDefault;
50
156
  }
51
157
  else {
52
- this[key] = initData[key];
158
+ self[key] = val;
53
159
  }
54
160
  }
55
161
  else {
56
162
  const lowerUnderscoreKey = `_${key.charAt(0).toLowerCase()}${key.slice(1)}`;
57
163
  const underscoreKey = `_${key}`;
58
164
  if (Object.prototype.hasOwnProperty.call(this, lowerUnderscoreKey)) {
59
- this[lowerUnderscoreKey] = initData[key];
165
+ self[lowerUnderscoreKey] = val;
60
166
  }
61
167
  else if (Object.prototype.hasOwnProperty.call(this, underscoreKey)) {
62
- this[underscoreKey] = initData[key];
168
+ self[underscoreKey] = val;
63
169
  }
64
170
  }
65
171
  }
@@ -101,37 +207,29 @@ export class BaseInfo {
101
207
  toJSON() {
102
208
  const result = {};
103
209
  const self = this;
104
- for (const key of Object.keys(this)) {
210
+ const keys = Object.keys(this);
211
+ for (let i = 0; i < keys.length; i++) {
212
+ const key = keys[i];
105
213
  if (!key.startsWith('_')) {
106
214
  result[key] = self[key];
107
215
  continue;
108
216
  }
109
217
  // Private backing field — expose via its public getter if one exists with the same name minus the underscore
110
- const lowerKey = key.slice(1);
111
- const pascalKey = lowerKey ? lowerKey.charAt(0).toUpperCase() + lowerKey.slice(1) : '';
112
- if (!lowerKey)
113
- continue;
114
- let proto = Object.getPrototypeOf(this);
115
- while (proto && proto !== Object.prototype) {
116
- const targetKey = Object.prototype.hasOwnProperty.call(proto, pascalKey) ? pascalKey : lowerKey;
117
- const desc = Object.getOwnPropertyDescriptor(proto, targetKey);
118
- if (desc && typeof desc.get === 'function') {
119
- // A getter reached through a backing field must not abort the whole
120
- // serialization. The contract above already says computed getters can throw
121
- // when their sources are not ready; a `_`-backed getter can too — e.g.
122
- // QueryInfo.CategoryPath walks Metadata.Provider.QueryCategories, which does
123
- // not exist yet during the initial metadata load. Omitting one key is strictly
124
- // better than losing the entire snapshot: the value is recomputed lazily on
125
- // the next access, and the local metadata cache still gets written.
126
- try {
127
- result[targetKey] = self[targetKey];
128
- }
129
- catch {
130
- // intentionally omitted from the serialized shape
131
- }
132
- break;
218
+ const targetKey = BaseInfo.resolveBackingGetterKey(this, key);
219
+ if (targetKey !== null) {
220
+ // A getter reached through a backing field must not abort the whole
221
+ // serialization. The contract above already says computed getters can throw
222
+ // when their sources are not ready; a `_`-backed getter can too — e.g.
223
+ // QueryInfo.CategoryPath walks Metadata.Provider.QueryCategories, which does
224
+ // not exist yet during the initial metadata load. Omitting one key is strictly
225
+ // better than losing the entire snapshot: the value is recomputed lazily on
226
+ // the next access, and the local metadata cache still gets written.
227
+ try {
228
+ result[targetKey] = self[targetKey];
229
+ }
230
+ catch {
231
+ // intentionally omitted from the serialized shape
133
232
  }
134
- proto = Object.getPrototypeOf(proto);
135
233
  }
136
234
  }
137
235
  return result;
@@ -1 +1 @@
1
- {"version":3,"file":"baseInfo.js","sourceRoot":"","sources":["../../src/generic/baseInfo.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"baseInfo.js","sourceRoot":"","sources":["../../src/generic/baseInfo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Context tokens and property defaults.
3
+ *
4
+ * A property (a User View property, a dashboard property, a query's server-set variable) can
5
+ * default to a fixed value or to a context token: a name from a closed list, worked out from the
6
+ * context user and the clock alone. The same resolver runs in the browser and on the server, so
7
+ * the two can differ only in the time zone they are given.
8
+ *
9
+ * - User tokens (`Context.UserID`, `Context.UserEmail`, `Context.UserName`) need a context user;
10
+ * without one they throw rather than resolve to a blank.
11
+ * - **WARNING — SQL template escaping (`| sqlString`):** `Context.UserEmail` and `Context.UserName`
12
+ * resolve to raw, unescaped strings (for example `O'Brien`) and reach Nunjucks query templates with
13
+ * `autoescape: false`. Query templates **must** pipe them through `| sqlString`
14
+ * (e.g. `WHERE Email = {{ Context.UserEmail | sqlString }}` or
15
+ * `WHERE Name = {{ Context.UserName | sqlString }}`). Rendering `{{ Context.UserEmail }}` or
16
+ * `{{ Context.UserName }}` bare produces broken SQL on apostrophes and opens SQL injection.
17
+ * (User View properties are escaped automatically by `UserViewPropertyWhereClause`.)
18
+ * - Date tokens give a `YYYY-MM-DD` date in the given zone (`Context.Today`, `Context.StartOf*`),
19
+ * or an ISO 8601 instant (`Context.Now`). Only date tokens take an offset.
20
+ * - The zone is an IANA name, `'UTC'` when none is given. Weeks start on Monday (ISO 8601) unless
21
+ * the context says Sunday.
22
+ */
23
+ /** Every context token. The list is closed: an app's own context is a property value, never a token. */
24
+ export declare const CONTEXT_TOKENS: readonly ["Context.UserID", "Context.UserEmail", "Context.UserName", "Context.Now", "Context.Today", "Context.StartOfWeek", "Context.StartOfMonth", "Context.StartOfQuarter", "Context.StartOfYear"];
25
+ /** A context token: one of {@link CONTEXT_TOKENS}. */
26
+ export type ContextToken = typeof CONTEXT_TOKENS[number];
27
+ /**
28
+ * The version of what {@link CONTEXT_TOKENS} means. Approval fingerprints include it, so an approval
29
+ * given under one meaning is stale under another. Bump it whenever a token is added, removed or
30
+ * worked out differently (a new week start, a different date format, a different user field).
31
+ */
32
+ export declare const CONTEXT_TOKEN_CONTRACT_VERSION = 1;
33
+ /** The value types a property can declare. */
34
+ export declare const PROPERTY_VALUE_TYPES: readonly ["string", "number", "boolean", "date", "uuid"];
35
+ /** A property's value type: one of {@link PROPERTY_VALUE_TYPES}. */
36
+ export type PropertyValueType = typeof PROPERTY_VALUE_TYPES[number];
37
+ /** The units an offset can move a date token by. */
38
+ export declare const PROPERTY_OFFSET_UNITS: readonly ["day", "week", "month", "quarter", "year"];
39
+ /** An offset unit: one of {@link PROPERTY_OFFSET_UNITS}. */
40
+ export type PropertyOffsetUnit = typeof PROPERTY_OFFSET_UNITS[number];
41
+ /** Moves a date token: `{ Amount: -30, Unit: 'day' }` is thirty days earlier. */
42
+ export interface PropertyDefaultOffset {
43
+ /** A whole number; negative moves back. */
44
+ Amount: number;
45
+ Unit: PropertyOffsetUnit;
46
+ }
47
+ /** A property value, fixed or resolved. */
48
+ export type PropertyValue = string | number | boolean | null;
49
+ /**
50
+ * A property's default: a fixed value, or a token worked out when the value is used. Set exactly
51
+ * one of `Value` and `Token`. This is the shape the `MJ: User Views.Properties` JSON stores.
52
+ */
53
+ export interface PropertyDefault {
54
+ /** A fixed value. Set this or Token, not both. */
55
+ Value?: PropertyValue;
56
+ /** A context token. Set this or Value, not both. */
57
+ Token?: ContextToken;
58
+ /** Moves a date token; refused on a user token and on a fixed value. */
59
+ Offset?: PropertyDefaultOffset;
60
+ }
61
+ /** The comparison a User View property's value drives. */
62
+ export type UserViewPropertyOperator = '=' | '<>' | 'IN' | '>' | '>=' | '<' | '<=';
63
+ /** The field a User View property filters, and how. */
64
+ export interface UserViewPropertyTarget {
65
+ /** A field of the view's entity. */
66
+ Field: string;
67
+ Operator: UserViewPropertyOperator;
68
+ }
69
+ /**
70
+ * One declared property of a User View: a named, typed input that adds one predicate on its
71
+ * target field when a run gives it a value or it has a default. Stored as a JSON array in the
72
+ * `Properties` column of `MJ: User Views`.
73
+ */
74
+ export interface UserViewProperty {
75
+ /** Unique within the view. */
76
+ Name: string;
77
+ /** The value's type. A value of another type is refused. */
78
+ Type: PropertyValueType;
79
+ /** Shown to whoever sets the property. */
80
+ Description?: string;
81
+ /** Used when a run gives no value: a fixed value or a context token. */
82
+ Default?: PropertyDefault;
83
+ /** True: a run with no value and no default is refused. */
84
+ IsRequired?: boolean;
85
+ /** False: only server code may set it, and a client value is refused. Default true. */
86
+ AllowOverride?: boolean;
87
+ /** The predicate the value drives. */
88
+ Target: UserViewPropertyTarget;
89
+ }
90
+ /** What a token is worked out from. */
91
+ export interface PropertyResolutionContext {
92
+ /** The context user. Required by the user tokens. `UserInfo` fits. */
93
+ User?: {
94
+ ID: string;
95
+ Email?: string;
96
+ Name?: string;
97
+ };
98
+ /** The clock. Defaults to the current time. */
99
+ Now?: Date;
100
+ /** IANA time zone the date tokens are worked out in. Defaults to `'UTC'`. */
101
+ TimeZone?: string;
102
+ /** First day of the week for `Context.StartOfWeek`: 1 = Monday (default, ISO 8601), 0 = Sunday. */
103
+ WeekStartsOn?: 0 | 1;
104
+ }
105
+ /**
106
+ * The request header that carries the caller's IANA time zone. `GraphQLDataProvider` sends it;
107
+ * MJServer reads it into `UserPayload.TimeZone`.
108
+ */
109
+ export declare const TIME_ZONE_HEADER = "x-mj-timezone";
110
+ /** True when `name` is a time zone this runtime's `Intl` accepts (an IANA name such as `'Europe/Paris'`). */
111
+ export declare function IsValidTimeZone(name: string | null | undefined): boolean;
112
+ /** This runtime's own IANA time zone, or undefined where `Intl` gives none. */
113
+ export declare function GetLocalTimeZone(): string | undefined;
114
+ /** True when `token` is one of {@link CONTEXT_TOKENS}. */
115
+ export declare function IsContextToken(token: string | null | undefined): token is ContextToken;
116
+ /**
117
+ * Works out a property default: the fixed value, or the token resolved by {@link ResolveContextToken}.
118
+ * @throws when the default is malformed (see {@link ValidatePropertyDefault}) or the token cannot be resolved
119
+ */
120
+ export declare function ResolvePropertyDefault(def: PropertyDefault, ctx: PropertyResolutionContext): PropertyValue;
121
+ /**
122
+ * Works out one context token.
123
+ * @returns the user's ID, email or name; a `YYYY-MM-DD` date in the context's zone; or, for
124
+ * `Context.Now`, an ISO 8601 instant
125
+ * @throws on an unknown token, a bad offset, an offset on a user token, a user token with no
126
+ * context user, or an invalid time zone
127
+ */
128
+ export declare function ResolveContextToken(token: ContextToken, offset: PropertyDefaultOffset | undefined, ctx: PropertyResolutionContext): string;
129
+ /**
130
+ * Checks a property default against the property's type, as when the definition is saved.
131
+ * @returns the problems found; empty when the default is valid
132
+ */
133
+ export declare function ValidatePropertyDefault(def: PropertyDefault, type: PropertyValueType): string[];
134
+ /** True when a value fits the property type: a finite number, a boolean, a valid UUID or ISO date, or a string. Null fits every type. */
135
+ export declare function IsPropertyValueOfType(value: PropertyValue, type: PropertyValueType): boolean;
136
+ //# sourceMappingURL=contextTokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contextTokens.d.ts","sourceRoot":"","sources":["../../src/generic/contextTokens.ts"],"names":[],"mappings":"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"}