@memberjunction/core-entities-server 6.1.5 → 6.1.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.
- package/dist/custom/MJDataContextItemEntityServer.server.d.ts +33 -0
- package/dist/custom/MJDataContextItemEntityServer.server.d.ts.map +1 -0
- package/dist/custom/MJDataContextItemEntityServer.server.js +84 -0
- package/dist/custom/MJDataContextItemEntityServer.server.js.map +1 -0
- package/dist/custom/MJRowLevelSecurityFilterEntityServer.server.d.ts +26 -14
- package/dist/custom/MJRowLevelSecurityFilterEntityServer.server.d.ts.map +1 -1
- package/dist/custom/MJRowLevelSecurityFilterEntityServer.server.js +57 -32
- package/dist/custom/MJRowLevelSecurityFilterEntityServer.server.js.map +1 -1
- package/dist/custom/MJUserViewEntityServer.server.d.ts +26 -0
- package/dist/custom/MJUserViewEntityServer.server.d.ts.map +1 -1
- package/dist/custom/MJUserViewEntityServer.server.js +68 -4
- package/dist/custom/MJUserViewEntityServer.server.js.map +1 -1
- package/dist/custom/rowFilterValidation.d.ts +47 -2
- package/dist/custom/rowFilterValidation.d.ts.map +1 -1
- package/dist/custom/rowFilterValidation.js +122 -11
- package/dist/custom/rowFilterValidation.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +28 -28
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { EntitySaveOptions, ValidationResult } from '@memberjunction/core';
|
|
2
|
+
import { MJDataContextItemEntity } from '@memberjunction/core-entities';
|
|
3
|
+
/**
|
|
4
|
+
* Server-side `MJ: Data Context Items` entity. The SQL of a `sql` item runs when its data context is
|
|
5
|
+
* loaded, so only an administrator (Owner-type user) may save an item that is a SQL item or holds SQL
|
|
6
|
+
* text: creating it, changing any of its fields, or moving it to another data context. Other items
|
|
7
|
+
* stay writable as before.
|
|
8
|
+
*
|
|
9
|
+
* The rule reads the item's values, not which fields changed, because this entity does not track
|
|
10
|
+
* record changes and a client's `OldValues___` can decide what looks changed. A non-Owner's save of an
|
|
11
|
+
* existing item whose `Type` or `SQL` was not loaded is refused as well: those columns keep their
|
|
12
|
+
* stored values on save, and the stored item may be a SQL item.
|
|
13
|
+
*/
|
|
14
|
+
export declare class MJDataContextItemEntityServer extends MJDataContextItemEntity {
|
|
15
|
+
private static readonly SQL_WRITE_REFUSED;
|
|
16
|
+
private static readonly SQL_NOT_LOADED_REFUSED;
|
|
17
|
+
/** The columns that decide whether an item holds SQL. */
|
|
18
|
+
private static readonly SQL_COLUMNS;
|
|
19
|
+
Validate(): ValidationResult;
|
|
20
|
+
/** Applies the same rule to a `ReplayOnly` save, which skips `Validate()`. */
|
|
21
|
+
Save(options?: EntitySaveOptions): Promise<boolean>;
|
|
22
|
+
/** Returns why the acting user may not save this item, or null when they may. */
|
|
23
|
+
private saveRefusal;
|
|
24
|
+
/** True when this is an existing item whose `Type` or `SQL` was not loaded. */
|
|
25
|
+
private sqlColumnsNotLoaded;
|
|
26
|
+
/** True when the item, as loaded and changed, is a SQL item or holds SQL text. */
|
|
27
|
+
private holdsSQL;
|
|
28
|
+
/** True when the acting user is an Owner-type user. */
|
|
29
|
+
private callerIsOwner;
|
|
30
|
+
/** Records the refusal so `LatestResult.CompleteMessage` carries it, and returns false. */
|
|
31
|
+
private refuseSave;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=MJDataContextItemEntityServer.server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MJDataContextItemEntityServer.server.d.ts","sourceRoot":"","sources":["../../src/custom/MJDataContextItemEntityServer.server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,iBAAiB,EAAsD,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7J,OAAO,EAAE,uBAAuB,EAA+B,MAAM,+BAA+B,CAAC;AAErG;;;;;;;;;;GAUG;AACH,qBACa,6BAA8B,SAAQ,uBAAuB;IACtE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAC8F;IAEvI,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CACuG;IAErJ,yDAAyD;IACzD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAqE;IAExF,QAAQ,IAAI,gBAAgB;IAU5C,8EAA8E;IACxD,IAAI,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;IAQzE,iFAAiF;IACjF,OAAO,CAAC,WAAW;IAUnB,+EAA+E;IAC/E,OAAO,CAAC,mBAAmB;IAI3B,kFAAkF;IAClF,OAAO,CAAC,QAAQ;IAIhB,uDAAuD;IACvD,OAAO,CAAC,aAAa;IAKrB,2FAA2F;IAC3F,OAAO,CAAC,UAAU;CAUrB"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var MJDataContextItemEntityServer_1;
|
|
8
|
+
import { BaseEntity, BaseEntityResult, ValidationErrorInfo, ValidationErrorType } from '@memberjunction/core';
|
|
9
|
+
import { RegisterClass } from '@memberjunction/global';
|
|
10
|
+
import { MJDataContextItemEntity } from '@memberjunction/core-entities';
|
|
11
|
+
/**
|
|
12
|
+
* Server-side `MJ: Data Context Items` entity. The SQL of a `sql` item runs when its data context is
|
|
13
|
+
* loaded, so only an administrator (Owner-type user) may save an item that is a SQL item or holds SQL
|
|
14
|
+
* text: creating it, changing any of its fields, or moving it to another data context. Other items
|
|
15
|
+
* stay writable as before.
|
|
16
|
+
*
|
|
17
|
+
* The rule reads the item's values, not which fields changed, because this entity does not track
|
|
18
|
+
* record changes and a client's `OldValues___` can decide what looks changed. A non-Owner's save of an
|
|
19
|
+
* existing item whose `Type` or `SQL` was not loaded is refused as well: those columns keep their
|
|
20
|
+
* stored values on save, and the stored item may be a SQL item.
|
|
21
|
+
*/
|
|
22
|
+
let MJDataContextItemEntityServer = class MJDataContextItemEntityServer extends MJDataContextItemEntity {
|
|
23
|
+
static { MJDataContextItemEntityServer_1 = this; }
|
|
24
|
+
static { this.SQL_WRITE_REFUSED = 'Only an administrator (Owner-type user) may save a data context item that holds SQL, because that SQL runs against the database.'; }
|
|
25
|
+
static { this.SQL_NOT_LOADED_REFUSED = 'Only an administrator (Owner-type user) may save a data context item whose Type and SQL were not loaded, because the stored item may hold SQL.'; }
|
|
26
|
+
/** The columns that decide whether an item holds SQL. */
|
|
27
|
+
static { this.SQL_COLUMNS = ['Type', 'SQL']; }
|
|
28
|
+
Validate() {
|
|
29
|
+
const result = super.Validate();
|
|
30
|
+
const refusal = this.saveRefusal();
|
|
31
|
+
if (refusal) {
|
|
32
|
+
result.Errors.push(new ValidationErrorInfo('SQL', refusal, this.SQL, ValidationErrorType.Failure));
|
|
33
|
+
}
|
|
34
|
+
result.Success = result.Success && result.Errors.length === 0;
|
|
35
|
+
return result;
|
|
36
|
+
}
|
|
37
|
+
/** Applies the same rule to a `ReplayOnly` save, which skips `Validate()`. */
|
|
38
|
+
async Save(options) {
|
|
39
|
+
const refusal = options?.ReplayOnly ? this.saveRefusal() : null;
|
|
40
|
+
if (refusal) {
|
|
41
|
+
return this.refuseSave(refusal);
|
|
42
|
+
}
|
|
43
|
+
return super.Save(options);
|
|
44
|
+
}
|
|
45
|
+
/** Returns why the acting user may not save this item, or null when they may. */
|
|
46
|
+
saveRefusal() {
|
|
47
|
+
if (this.callerIsOwner()) {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
if (this.sqlColumnsNotLoaded()) {
|
|
51
|
+
return MJDataContextItemEntityServer_1.SQL_NOT_LOADED_REFUSED;
|
|
52
|
+
}
|
|
53
|
+
return this.holdsSQL() ? MJDataContextItemEntityServer_1.SQL_WRITE_REFUSED : null;
|
|
54
|
+
}
|
|
55
|
+
/** True when this is an existing item whose `Type` or `SQL` was not loaded. */
|
|
56
|
+
sqlColumnsNotLoaded() {
|
|
57
|
+
return this.IsSaved && MJDataContextItemEntityServer_1.SQL_COLUMNS.some((name) => this.GetFieldByName(name)?.NotLoaded === true);
|
|
58
|
+
}
|
|
59
|
+
/** True when the item, as loaded and changed, is a SQL item or holds SQL text. */
|
|
60
|
+
holdsSQL() {
|
|
61
|
+
return this.Type === 'sql' || !!this.SQL?.trim();
|
|
62
|
+
}
|
|
63
|
+
/** True when the acting user is an Owner-type user. */
|
|
64
|
+
callerIsOwner() {
|
|
65
|
+
const caller = this.ActiveUser;
|
|
66
|
+
return caller?.Type?.trim().toLowerCase() === 'owner';
|
|
67
|
+
}
|
|
68
|
+
/** Records the refusal so `LatestResult.CompleteMessage` carries it, and returns false. */
|
|
69
|
+
refuseSave(message) {
|
|
70
|
+
const result = new BaseEntityResult();
|
|
71
|
+
result.Success = false;
|
|
72
|
+
result.Type = this.IsSaved ? 'update' : 'create';
|
|
73
|
+
result.Message = message;
|
|
74
|
+
result.StartedAt = new Date();
|
|
75
|
+
result.EndedAt = new Date();
|
|
76
|
+
this.RegisterResultHistoryEntry(result);
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
MJDataContextItemEntityServer = MJDataContextItemEntityServer_1 = __decorate([
|
|
81
|
+
RegisterClass(BaseEntity, 'MJ: Data Context Items')
|
|
82
|
+
], MJDataContextItemEntityServer);
|
|
83
|
+
export { MJDataContextItemEntityServer };
|
|
84
|
+
//# sourceMappingURL=MJDataContextItemEntityServer.server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MJDataContextItemEntityServer.server.js","sourceRoot":"","sources":["../../src/custom/MJDataContextItemEntityServer.server.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,25 +7,37 @@ import { MJRowLevelSecurityFilterEntity } from '@memberjunction/core-entities';
|
|
|
7
7
|
* against the rule's entity when the RULE is saved; without an equivalent
|
|
8
8
|
* check when the FILTER is saved, both are trivially bypassable: attach a
|
|
9
9
|
* valid filter, then edit its text (or acquire a new, different-entity
|
|
10
|
-
* referrer) to reference anything. On a `FilterText` change
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* (fail closed). Check 6 has no single rule to anchor on here (a filter
|
|
16
|
-
* record itself carries no entity binding — see plan §5.1), so it anchors on
|
|
17
|
-
* the first referrer that DOES resolve to an entity and requires every other
|
|
18
|
-
* referrer to agree with it; zero or one resolvable referrer trivially
|
|
19
|
-
* satisfies the invariant.
|
|
10
|
+
* referrer) to reference anything. On a `FilterText` change this subclass
|
|
11
|
+
* re-validates the new text against EVERY current referrer (EntityPermission
|
|
12
|
+
* rows via their four `*RLSFilterID` columns, plus both API scope tables via
|
|
13
|
+
* `RowFilterID`) and rejects if any check fails — including referrers whose
|
|
14
|
+
* entity cannot be resolved (fail closed).
|
|
20
15
|
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
16
|
+
* Which checks apply depends on who references the filter:
|
|
17
|
+
* - **Any API-key or API-application scope rule** → the strict API-key rules
|
|
18
|
+
* (checks 4 and 6): plain columns of the referrer's entity only, and every
|
|
19
|
+
* referrer must agree on ONE entity. Check 6 has no single rule to anchor on
|
|
20
|
+
* here (a filter record carries no entity binding — see plan §5.1), so it
|
|
21
|
+
* anchors on the first referrer that resolves to an entity.
|
|
22
|
+
* - **Only role permission rows** → a role filter. Role filters legitimately use
|
|
23
|
+
* subqueries (a user's tenant memberships) and are shared across every
|
|
24
|
+
* tenant-scoped entity, so the new text is instead screened for dangerous SQL
|
|
25
|
+
* and compiled against each referencing entity's base view.
|
|
26
|
+
*
|
|
27
|
+
* Either way an invalid filter is rejected at save, where it is diagnosable,
|
|
28
|
+
* rather than failing every read of the entities it scopes with an unexplained
|
|
29
|
+
* SQL error.
|
|
25
30
|
*/
|
|
26
31
|
export declare class MJRowLevelSecurityFilterEntityServer extends MJRowLevelSecurityFilterEntity {
|
|
27
32
|
/** Enable async validation so the referrer re-validation (which queries three tables) runs on Save. */
|
|
28
33
|
get DefaultSkipAsyncValidation(): boolean;
|
|
29
34
|
ValidateAsync(): Promise<ValidationResult>;
|
|
35
|
+
/**
|
|
36
|
+
* The strict API-key rules: check 4 (FilterText's columns must resolve against every
|
|
37
|
+
* referrer's entity) and check 6 (every referrer must agree on the same entity).
|
|
38
|
+
*/
|
|
39
|
+
private validateAsApiKeyFilter;
|
|
40
|
+
/** A role filter: screened, then compiled against every referencing entity's base view. */
|
|
41
|
+
private validateAsRoleFilter;
|
|
30
42
|
}
|
|
31
43
|
//# sourceMappingURL=MJRowLevelSecurityFilterEntityServer.server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MJRowLevelSecurityFilterEntityServer.server.d.ts","sourceRoot":"","sources":["../../src/custom/MJRowLevelSecurityFilterEntityServer.server.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"MJRowLevelSecurityFilterEntityServer.server.d.ts","sourceRoot":"","sources":["../../src/custom/MJRowLevelSecurityFilterEntityServer.server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuD,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7G,OAAO,EAAE,8BAA8B,EAAE,MAAM,+BAA+B,CAAC;AAW/E;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,qBACa,oCAAqC,SAAQ,8BAA8B;IACpF,uGAAuG;IACvG,IAAoB,0BAA0B,IAAI,OAAO,CAExD;IAEqB,aAAa,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAgChE;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAuB9B,2FAA2F;YAC7E,oBAAoB;CAOrC"}
|
|
@@ -4,10 +4,10 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
4
4
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
6
|
};
|
|
7
|
-
import { BaseEntity } from '@memberjunction/core';
|
|
7
|
+
import { BaseEntity, DatabaseProviderBase } from '@memberjunction/core';
|
|
8
8
|
import { RegisterClass } from '@memberjunction/global';
|
|
9
9
|
import { MJRowLevelSecurityFilterEntity } from '@memberjunction/core-entities';
|
|
10
|
-
import { BuildSameEntityErrors, CollectRowFilterReferrers, ToValidationErrors, ValidateRowFilterTextAgainstEntity } from './rowFilterValidation.js';
|
|
10
|
+
import { BuildSameEntityErrors, CollectRowFilterReferrers, IsRoleOnlyReferrerSet, ToValidationErrors, ValidateRoleRowFilterText, ValidateRowFilterTextAgainstEntity } from './rowFilterValidation.js';
|
|
11
11
|
/**
|
|
12
12
|
* Server-side `MJ: Row Level Security Filters` entity — the SECOND enforcement
|
|
13
13
|
* point of the row-filter validation (plan §5.3). The scope-rule subclasses
|
|
@@ -15,21 +15,26 @@ import { BuildSameEntityErrors, CollectRowFilterReferrers, ToValidationErrors, V
|
|
|
15
15
|
* against the rule's entity when the RULE is saved; without an equivalent
|
|
16
16
|
* check when the FILTER is saved, both are trivially bypassable: attach a
|
|
17
17
|
* valid filter, then edit its text (or acquire a new, different-entity
|
|
18
|
-
* referrer) to reference anything. On a `FilterText` change
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
* (fail closed). Check 6 has no single rule to anchor on here (a filter
|
|
24
|
-
* record itself carries no entity binding — see plan §5.1), so it anchors on
|
|
25
|
-
* the first referrer that DOES resolve to an entity and requires every other
|
|
26
|
-
* referrer to agree with it; zero or one resolvable referrer trivially
|
|
27
|
-
* satisfies the invariant.
|
|
18
|
+
* referrer) to reference anything. On a `FilterText` change this subclass
|
|
19
|
+
* re-validates the new text against EVERY current referrer (EntityPermission
|
|
20
|
+
* rows via their four `*RLSFilterID` columns, plus both API scope tables via
|
|
21
|
+
* `RowFilterID`) and rejects if any check fails — including referrers whose
|
|
22
|
+
* entity cannot be resolved (fail closed).
|
|
28
23
|
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
24
|
+
* Which checks apply depends on who references the filter:
|
|
25
|
+
* - **Any API-key or API-application scope rule** → the strict API-key rules
|
|
26
|
+
* (checks 4 and 6): plain columns of the referrer's entity only, and every
|
|
27
|
+
* referrer must agree on ONE entity. Check 6 has no single rule to anchor on
|
|
28
|
+
* here (a filter record carries no entity binding — see plan §5.1), so it
|
|
29
|
+
* anchors on the first referrer that resolves to an entity.
|
|
30
|
+
* - **Only role permission rows** → a role filter. Role filters legitimately use
|
|
31
|
+
* subqueries (a user's tenant memberships) and are shared across every
|
|
32
|
+
* tenant-scoped entity, so the new text is instead screened for dangerous SQL
|
|
33
|
+
* and compiled against each referencing entity's base view.
|
|
34
|
+
*
|
|
35
|
+
* Either way an invalid filter is rejected at save, where it is diagnosable,
|
|
36
|
+
* rather than failing every read of the entities it scopes with an unexplained
|
|
37
|
+
* SQL error.
|
|
33
38
|
*/
|
|
34
39
|
let MJRowLevelSecurityFilterEntityServer = class MJRowLevelSecurityFilterEntityServer extends MJRowLevelSecurityFilterEntity {
|
|
35
40
|
/** Enable async validation so the referrer re-validation (which queries three tables) runs on Save. */
|
|
@@ -39,7 +44,7 @@ let MJRowLevelSecurityFilterEntityServer = class MJRowLevelSecurityFilterEntityS
|
|
|
39
44
|
async ValidateAsync() {
|
|
40
45
|
const result = await super.ValidateAsync();
|
|
41
46
|
// Only re-validate when the text changes (or on create — a new filter has
|
|
42
|
-
// no referrers yet, so
|
|
47
|
+
// no referrers yet, so there is nothing to validate against).
|
|
43
48
|
const filterTextDirty = this.GetFieldByName('FilterText')?.Dirty ?? false;
|
|
44
49
|
if (this.IsSaved && !filterTextDirty) {
|
|
45
50
|
return result;
|
|
@@ -49,22 +54,11 @@ let MJRowLevelSecurityFilterEntityServer = class MJRowLevelSecurityFilterEntityS
|
|
|
49
54
|
const filterText = this.FilterText ?? '';
|
|
50
55
|
try {
|
|
51
56
|
const referrers = await CollectRowFilterReferrers(this.ID, md, this.ContextCurrentUser);
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
if (!referrer.Entity) {
|
|
55
|
-
errors.push(`${referrer.Description} references this filter but does not resolve to an entity — the new ` +
|
|
56
|
-
`FilterText cannot be validated against it; rejecting (fail closed).`);
|
|
57
|
-
continue;
|
|
58
|
-
}
|
|
59
|
-
const validation = ValidateRowFilterTextAgainstEntity(filterText, referrer.Entity);
|
|
60
|
-
errors.push(...validation.errors.map(e => `${referrer.Description}: ${e}`));
|
|
57
|
+
if (IsRoleOnlyReferrerSet(referrers)) {
|
|
58
|
+
errors.push(...await this.validateAsRoleFilter(filterText, referrers));
|
|
61
59
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
// referrer that resolves to an entity and require every other referrer to match it.
|
|
65
|
-
const anchor = referrers.find(r => r.Entity)?.Entity;
|
|
66
|
-
if (anchor) {
|
|
67
|
-
errors.push(...BuildSameEntityErrors(referrers, anchor));
|
|
60
|
+
else {
|
|
61
|
+
errors.push(...this.validateAsApiKeyFilter(filterText, referrers));
|
|
68
62
|
}
|
|
69
63
|
}
|
|
70
64
|
catch (e) {
|
|
@@ -76,6 +70,37 @@ let MJRowLevelSecurityFilterEntityServer = class MJRowLevelSecurityFilterEntityS
|
|
|
76
70
|
}
|
|
77
71
|
return result;
|
|
78
72
|
}
|
|
73
|
+
/**
|
|
74
|
+
* The strict API-key rules: check 4 (FilterText's columns must resolve against every
|
|
75
|
+
* referrer's entity) and check 6 (every referrer must agree on the same entity).
|
|
76
|
+
*/
|
|
77
|
+
validateAsApiKeyFilter(filterText, referrers) {
|
|
78
|
+
const errors = [];
|
|
79
|
+
for (const referrer of referrers) {
|
|
80
|
+
if (!referrer.Entity) {
|
|
81
|
+
errors.push(`${referrer.Description} references this filter but does not resolve to an entity — the new ` +
|
|
82
|
+
`FilterText cannot be validated against it; rejecting (fail closed).`);
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
const validation = ValidateRowFilterTextAgainstEntity(filterText, referrer.Entity);
|
|
86
|
+
errors.push(...validation.errors.map(e => `${referrer.Description}: ${e}`));
|
|
87
|
+
}
|
|
88
|
+
// No single referrer is "the rule" here (unlike the scope-rule save path), so anchor on
|
|
89
|
+
// the first referrer that resolves to an entity and require every other referrer to match it.
|
|
90
|
+
const anchor = referrers.find(r => r.Entity)?.Entity;
|
|
91
|
+
if (anchor) {
|
|
92
|
+
errors.push(...BuildSameEntityErrors(referrers, anchor));
|
|
93
|
+
}
|
|
94
|
+
return errors;
|
|
95
|
+
}
|
|
96
|
+
/** A role filter: screened, then compiled against every referencing entity's base view. */
|
|
97
|
+
async validateAsRoleFilter(filterText, referrers) {
|
|
98
|
+
const provider = this.ProviderToUse;
|
|
99
|
+
if (!(provider instanceof DatabaseProviderBase)) {
|
|
100
|
+
return ['A role row-level-security filter can only be validated against a database provider; rejecting (fail closed).'];
|
|
101
|
+
}
|
|
102
|
+
return ValidateRoleRowFilterText(filterText, referrers, provider, this.ContextCurrentUser);
|
|
103
|
+
}
|
|
79
104
|
};
|
|
80
105
|
MJRowLevelSecurityFilterEntityServer = __decorate([
|
|
81
106
|
RegisterClass(BaseEntity, 'MJ: Row Level Security Filters')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MJRowLevelSecurityFilterEntityServer.server.js","sourceRoot":"","sources":["../../src/custom/MJRowLevelSecurityFilterEntityServer.server.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAuC,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"MJRowLevelSecurityFilterEntityServer.server.js","sourceRoot":"","sources":["../../src/custom/MJRowLevelSecurityFilterEntityServer.server.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,6 +19,32 @@ export declare class MJUserViewEntityServer extends MJUserViewEntityExtended {
|
|
|
19
19
|
*/
|
|
20
20
|
protected get SmartFilterImplemented(): boolean;
|
|
21
21
|
Validate(): ValidationResult;
|
|
22
|
+
/**
|
|
23
|
+
* SECURITY: screens the SQL this view stores with the clause screen the RunView API applies to
|
|
24
|
+
* client filters — its WhereClause (set directly, compiled from FilterState, or made by a Smart
|
|
25
|
+
* Filter) and the ORDER BY built from SortState / GridState. Any user who can save a view can
|
|
26
|
+
* write these, and the provider splices them into view SQL. A CustomWhereClause is left to the
|
|
27
|
+
* Owner gate above. Only a new view or a changed clause is screened here; the provider screens
|
|
28
|
+
* every stored clause again when the view runs. Both use the provider's own screen, so a clause
|
|
29
|
+
* is judged the same way at save and at run.
|
|
30
|
+
*/
|
|
31
|
+
private validateStoredClauses;
|
|
32
|
+
/**
|
|
33
|
+
* The ORDER BY built from SortState / GridState, or null when SortState is not valid JSON. Such
|
|
34
|
+
* a view cannot build an ORDER BY when it runs either, so there is nothing to screen.
|
|
35
|
+
*/
|
|
36
|
+
private storedOrderBy;
|
|
37
|
+
/**
|
|
38
|
+
* Adds a validation failure on `field` when the provider's client-clause screen refuses `clause`,
|
|
39
|
+
* or when the provider cannot screen (fails closed).
|
|
40
|
+
*/
|
|
41
|
+
private screenStoredClause;
|
|
42
|
+
/**
|
|
43
|
+
* A `{%UserView "id"%}` template becomes a subquery only when the view runs, and the provider
|
|
44
|
+
* screens that rendered clause. Here each template stands in as `SELECT NULL` so the rest of
|
|
45
|
+
* the clause can be parsed.
|
|
46
|
+
*/
|
|
47
|
+
private static neutralizeViewTemplates;
|
|
22
48
|
/**
|
|
23
49
|
* SECURITY gate: `CustomWhereClause = 1` tells the platform to fold the stored
|
|
24
50
|
* `WhereClause` into view SQL verbatim — it bypasses both the auto-generation in
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MJUserViewEntityServer.server.d.ts","sourceRoot":"","sources":["../../src/custom/MJUserViewEntityServer.server.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,UAAU,EAAY,iBAAiB,EAAsD,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACjK,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAA;
|
|
1
|
+
{"version":3,"file":"MJUserViewEntityServer.server.d.ts","sourceRoot":"","sources":["../../src/custom/MJUserViewEntityServer.server.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,UAAU,EAAY,iBAAiB,EAAsD,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACjK,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAA;AAexE;;GAEG;AACH,UAAU,uBAAwB,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC7D,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,uBAAuB,EAAE,MAAM,CAAC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;CAC7B;AAED,qBACa,sBAAuB,SAAQ,wBAAwB;IAChE;;OAEG;IACH,cAAuB,sBAAsB,IAAI,OAAO,CAEvD;IAEe,QAAQ,IAAI,gBAAgB;IAQ5C;;;;;;;;OAQG;IACH,OAAO,CAAC,qBAAqB;IAc7B;;;OAGG;IACH,OAAO,CAAC,aAAa;IAQrB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAc1B;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAItC;;;;;;;;OAQG;IACH,OAAO,CAAC,sCAAsC;IAyB9C;;;;OAIG;IACU,8BAA8B,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAC,CAAC;IAkF5I;;;OAGG;IACH,SAAS,CAAC,iBAAiB,CAAC,UAAU,EAAE,UAAU,GAAG,uBAAuB;IAwC5E;;OAEG;IACH,SAAS,CAAC,4BAA4B,CAAC,UAAU,EAAE,UAAU,EAAE,EAAE,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,MAAM;CAoC1H"}
|
|
@@ -4,13 +4,15 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
4
4
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
6
|
};
|
|
7
|
+
var MJUserViewEntityServer_1;
|
|
7
8
|
import { RegisterClass, CleanAndParseJSON } from "@memberjunction/global";
|
|
8
9
|
import { BaseEntity, LogError, ValidationErrorInfo, ValidationErrorType } from "@memberjunction/core";
|
|
9
10
|
import { MJUserViewEntityExtended } from '@memberjunction/core-entities';
|
|
10
11
|
import { AIPromptParams } from "@memberjunction/ai-core-plus";
|
|
11
12
|
import { AIEngine } from "@memberjunction/aiengine";
|
|
12
13
|
import { AIPromptRunner } from "@memberjunction/ai-prompts";
|
|
13
|
-
|
|
14
|
+
import { IsClientClauseScreeningProvider } from "@memberjunction/generic-database-provider";
|
|
15
|
+
let MJUserViewEntityServer = MJUserViewEntityServer_1 = class MJUserViewEntityServer extends MJUserViewEntityExtended {
|
|
14
16
|
/**
|
|
15
17
|
* This property is hard-coded to true in this class because we DO support smart filters in this class. If you want to disable smart filters for a specific view you can override this property in your subclass and set it to false.
|
|
16
18
|
*/
|
|
@@ -20,9 +22,70 @@ let MJUserViewEntityServer = class MJUserViewEntityServer extends MJUserViewEnti
|
|
|
20
22
|
Validate() {
|
|
21
23
|
const result = super.Validate();
|
|
22
24
|
this.validateCustomWhereClauseAuthorization(result);
|
|
25
|
+
this.validateStoredClauses(result);
|
|
23
26
|
result.Success = result.Success && result.Errors.length === 0;
|
|
24
27
|
return result;
|
|
25
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* SECURITY: screens the SQL this view stores with the clause screen the RunView API applies to
|
|
31
|
+
* client filters — its WhereClause (set directly, compiled from FilterState, or made by a Smart
|
|
32
|
+
* Filter) and the ORDER BY built from SortState / GridState. Any user who can save a view can
|
|
33
|
+
* write these, and the provider splices them into view SQL. A CustomWhereClause is left to the
|
|
34
|
+
* Owner gate above. Only a new view or a changed clause is screened here; the provider screens
|
|
35
|
+
* every stored clause again when the view runs. Both use the provider's own screen, so a clause
|
|
36
|
+
* is judged the same way at save and at run.
|
|
37
|
+
*/
|
|
38
|
+
validateStoredClauses(result) {
|
|
39
|
+
const changed = (...fields) => !this.IsSaved || fields.some(f => this.GetFieldByName(f)?.Dirty === true);
|
|
40
|
+
if (!this.CustomWhereClause && changed('WhereClause', 'CustomWhereClause')) {
|
|
41
|
+
const where = MJUserViewEntityServer_1.neutralizeViewTemplates(this.WhereClause ?? '');
|
|
42
|
+
this.screenStoredClause(result, 'WhereClause', where, 'view WhereClause');
|
|
43
|
+
}
|
|
44
|
+
const orderBy = changed('SortState', 'GridState') ? this.storedOrderBy() : null;
|
|
45
|
+
if (orderBy) {
|
|
46
|
+
// The provider transforms a stored sort for its platform before running it; screen that form.
|
|
47
|
+
this.screenStoredClause(result, 'SortState', orderBy, 'OrderBy', this.ViewEntityInfo);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* The ORDER BY built from SortState / GridState, or null when SortState is not valid JSON. Such
|
|
52
|
+
* a view cannot build an ORDER BY when it runs either, so there is nothing to screen.
|
|
53
|
+
*/
|
|
54
|
+
storedOrderBy() {
|
|
55
|
+
try {
|
|
56
|
+
return this.OrderByClause;
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Adds a validation failure on `field` when the provider's client-clause screen refuses `clause`,
|
|
64
|
+
* or when the provider cannot screen (fails closed).
|
|
65
|
+
*/
|
|
66
|
+
screenStoredClause(result, field, clause, label, entityInfo) {
|
|
67
|
+
if (!clause.trim())
|
|
68
|
+
return;
|
|
69
|
+
const provider = this.ProviderToUse;
|
|
70
|
+
try {
|
|
71
|
+
if (!IsClientClauseScreeningProvider(provider)) {
|
|
72
|
+
throw new Error(`Invalid ${label}: the data provider cannot screen client SQL`);
|
|
73
|
+
}
|
|
74
|
+
provider.ScreenClientClause(clause, label, this.ActiveUser, entityInfo);
|
|
75
|
+
}
|
|
76
|
+
catch (e) {
|
|
77
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
78
|
+
result.Errors.push(new ValidationErrorInfo(field, message, clause, ValidationErrorType.Failure));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* A `{%UserView "id"%}` template becomes a subquery only when the view runs, and the provider
|
|
83
|
+
* screens that rendered clause. Here each template stands in as `SELECT NULL` so the rest of
|
|
84
|
+
* the clause can be parsed.
|
|
85
|
+
*/
|
|
86
|
+
static neutralizeViewTemplates(whereClause) {
|
|
87
|
+
return whereClause.replace(/{%[^%]+%}/g, 'SELECT NULL');
|
|
88
|
+
}
|
|
26
89
|
/**
|
|
27
90
|
* SECURITY gate: `CustomWhereClause = 1` tells the platform to fold the stored
|
|
28
91
|
* `WhereClause` into view SQL verbatim — it bypasses both the auto-generation in
|
|
@@ -39,8 +102,9 @@ let MJUserViewEntityServer = class MJUserViewEntityServer extends MJUserViewEnti
|
|
|
39
102
|
}
|
|
40
103
|
const customDirty = this.GetFieldByName('CustomWhereClause')?.Dirty === true;
|
|
41
104
|
const whereDirty = this.GetFieldByName('WhereClause')?.Dirty === true;
|
|
42
|
-
|
|
43
|
-
|
|
105
|
+
// A new record is always authorized: a field first written without NewRecord() seeding it
|
|
106
|
+
// does not read as dirty. On an existing record, only a change needs authorizing.
|
|
107
|
+
if (this.IsSaved && !customDirty && !whereDirty) {
|
|
44
108
|
return;
|
|
45
109
|
}
|
|
46
110
|
const user = this.ContextCurrentUser
|
|
@@ -199,7 +263,7 @@ let MJUserViewEntityServer = class MJUserViewEntityServer extends MJUserViewEnti
|
|
|
199
263
|
return [fkeyViewsDesc, relatedEntitiesDesc].filter(s => s.length > 0).join('\n');
|
|
200
264
|
}
|
|
201
265
|
};
|
|
202
|
-
MJUserViewEntityServer = __decorate([
|
|
266
|
+
MJUserViewEntityServer = MJUserViewEntityServer_1 = __decorate([
|
|
203
267
|
RegisterClass(BaseEntity, 'MJ: User Views')
|
|
204
268
|
], MJUserViewEntityServer);
|
|
205
269
|
export { MJUserViewEntityServer };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MJUserViewEntityServer.server.js","sourceRoot":"","sources":["../../src/custom/MJUserViewEntityServer.server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"MJUserViewEntityServer.server.js","sourceRoot":"","sources":["../../src/custom/MJUserViewEntityServer.server.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,11 +8,15 @@
|
|
|
8
8
|
* - MJRowLevelSecurityFilterEntityServer — re-validate a filter's FilterText
|
|
9
9
|
* against EVERY current referrer when the text changes (without this second
|
|
10
10
|
* enforcement point, rule-save validation is bypassable by editing the
|
|
11
|
-
* filter after attaching it).
|
|
11
|
+
* filter after attaching it). A filter referenced ONLY by role permission rows is a role
|
|
12
|
+
* filter and is instead compiled against each referencing entity
|
|
13
|
+
* ({@link ValidateRoleRowFilterText}).
|
|
12
14
|
*
|
|
13
15
|
* All checks fail closed: anything unresolvable rejects the save.
|
|
14
16
|
*/
|
|
15
|
-
import { EntityInfo, IMetadataProvider, UserInfo, ValidationErrorInfo } from '@memberjunction/core';
|
|
17
|
+
import { DatabaseProviderBase, EntityInfo, IMetadataProvider, UserInfo, ValidationErrorInfo } from '@memberjunction/core';
|
|
18
|
+
/** True when `token` (the name inside `{{...}}`) is in the registered row-filter vocabulary. */
|
|
19
|
+
export declare function IsRegisteredRowFilterToken(token: string): boolean;
|
|
16
20
|
/** Result of a row-filter text validation. */
|
|
17
21
|
export interface RowFilterTextValidationResult {
|
|
18
22
|
valid: boolean;
|
|
@@ -39,12 +43,20 @@ export declare function ValidateRowFilterTextAgainstEntity(filterText: string, e
|
|
|
39
43
|
* wildcards and no comma-separated list (plan §5.3 check 1).
|
|
40
44
|
*/
|
|
41
45
|
export declare function IsExactResourceName(pattern: string | null): pattern is string;
|
|
46
|
+
/**
|
|
47
|
+
* Which table a referrer of a RowLevelSecurityFilter record lives in: a role permission row
|
|
48
|
+
* (`EntityPermission`, via its four `*RLSFilterID` columns) or an API-key / API-application
|
|
49
|
+
* scope rule (via `RowFilterID`).
|
|
50
|
+
*/
|
|
51
|
+
export type RowFilterReferrerKind = 'EntityPermission' | 'APIKeyScope' | 'APIApplicationScope';
|
|
42
52
|
/** One referrer of a RowLevelSecurityFilter record, resolved to its entity. */
|
|
43
53
|
export interface RowFilterReferrer {
|
|
44
54
|
/** Human-readable description of the referring row, for error messages. */
|
|
45
55
|
Description: string;
|
|
46
56
|
/** The entity the referrer binds the filter to, or null when unresolvable. */
|
|
47
57
|
Entity: EntityInfo | null;
|
|
58
|
+
/** Which table the referrer lives in. */
|
|
59
|
+
Kind: RowFilterReferrerKind;
|
|
48
60
|
}
|
|
49
61
|
/**
|
|
50
62
|
* Collects EVERY referrer of a RowLevelSecurityFilter record (plan §5.3 check 6):
|
|
@@ -66,6 +78,39 @@ export declare function CollectRowFilterReferrers(filterId: string, md: IMetadat
|
|
|
66
78
|
* (fail closed).
|
|
67
79
|
*/
|
|
68
80
|
export declare function BuildSameEntityErrors(referrers: RowFilterReferrer[], targetEntity: EntityInfo): string[];
|
|
81
|
+
/** The provider members the compile probe uses. */
|
|
82
|
+
export type RowFilterProbeProvider = Pick<DatabaseProviderBase, 'ExecuteSQL' | 'QuoteIdentifier' | 'QuoteSchemaAndView'>;
|
|
83
|
+
/**
|
|
84
|
+
* True when every referrer of a filter is a role permission row, so the filter is a ROLE
|
|
85
|
+
* row-level-security filter that no API-key or API-application scope rule depends on.
|
|
86
|
+
* False for a filter with no referrers.
|
|
87
|
+
*/
|
|
88
|
+
export declare function IsRoleOnlyReferrerSet(referrers: RowFilterReferrer[]): boolean;
|
|
89
|
+
/**
|
|
90
|
+
* Screens a ROLE filter's text before it is compiled. Role filters legitimately use subqueries
|
|
91
|
+
* and database functions (e.g. "rows of the organizations this user belongs to"), so unlike
|
|
92
|
+
* {@link ValidateRowFilterTextAgainstEntity} this allows `SELECT` and any function call; the
|
|
93
|
+
* compile probe proves the objects they reference exist. Everything else the shared
|
|
94
|
+
* `SQLExpressionValidator` blocks — DDL/DML/EXEC, comments, semicolons, system catalogs — is
|
|
95
|
+
* still refused, and every `{{Token}}` must be in the registered vocabulary.
|
|
96
|
+
*/
|
|
97
|
+
export declare function ScreenRoleRowFilterText(filterText: string): string[];
|
|
98
|
+
/**
|
|
99
|
+
* Compiles a ROLE filter against one entity's base view — the view role RLS is applied to at
|
|
100
|
+
* query time — by running `SELECT 1 FROM <BaseView> WHERE 1 = 0 AND (<filter>)`. Tokens are
|
|
101
|
+
* marked up with the saving user exactly as at query time. `1 = 0` means no row is read, but
|
|
102
|
+
* the database still binds every column, table and function the filter names, so a bad
|
|
103
|
+
* reference fails here instead of on every read. Returns the refusal message, or null.
|
|
104
|
+
*/
|
|
105
|
+
export declare function ProbeRoleRowFilterAgainstEntity(filterText: string, entity: EntityInfo, provider: RowFilterProbeProvider, contextUser: UserInfo): Promise<string | null>;
|
|
106
|
+
/**
|
|
107
|
+
* Validates a new FilterText for a ROLE filter (see {@link IsRoleOnlyReferrerSet}) against every
|
|
108
|
+
* entity that references it. The API-key rules — plain columns only, one entity per filter — do
|
|
109
|
+
* not apply: a role filter may use subqueries and may be shared across entities, as long as it
|
|
110
|
+
* compiles against each one. Referrers that do not resolve to an entity reject (fail closed),
|
|
111
|
+
* and text that fails the screen is never sent to the database.
|
|
112
|
+
*/
|
|
113
|
+
export declare function ValidateRoleRowFilterText(filterText: string, referrers: RowFilterReferrer[], provider: RowFilterProbeProvider, contextUser: UserInfo): Promise<string[]>;
|
|
69
114
|
/** Convenience: wraps validation failures as ValidationErrorInfo entries. */
|
|
70
115
|
export declare function ToValidationErrors(fieldName: string, messages: string[]): ValidationErrorInfo[];
|
|
71
116
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rowFilterValidation.d.ts","sourceRoot":"","sources":["../../src/custom/rowFilterValidation.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"rowFilterValidation.d.ts","sourceRoot":"","sources":["../../src/custom/rowFilterValidation.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,11 +8,13 @@
|
|
|
8
8
|
* - MJRowLevelSecurityFilterEntityServer — re-validate a filter's FilterText
|
|
9
9
|
* against EVERY current referrer when the text changes (without this second
|
|
10
10
|
* enforcement point, rule-save validation is bypassable by editing the
|
|
11
|
-
* filter after attaching it).
|
|
11
|
+
* filter after attaching it). A filter referenced ONLY by role permission rows is a role
|
|
12
|
+
* filter and is instead compiled against each referencing entity
|
|
13
|
+
* ({@link ValidateRoleRowFilterText}).
|
|
12
14
|
*
|
|
13
15
|
* All checks fail closed: anything unresolvable rejects the save.
|
|
14
16
|
*/
|
|
15
|
-
import { RunView, ValidationErrorInfo, ValidationErrorType } from '@memberjunction/core';
|
|
17
|
+
import { RowLevelSecurityFilterInfo, RunView, ValidationErrorInfo, ValidationErrorType } from '@memberjunction/core';
|
|
16
18
|
import { SQLExpressionValidator, UUIDsEqual } from '@memberjunction/global';
|
|
17
19
|
/**
|
|
18
20
|
* Registered token vocabulary for row-filter FilterText (plan §5.2). `{{User*}}`
|
|
@@ -41,6 +43,16 @@ const SQL_BARE_KEYWORDS = new Set([
|
|
|
41
43
|
'CASE', 'WHEN', 'THEN', 'ELSE', 'END', 'ESCAPE', 'ASC', 'DESC',
|
|
42
44
|
'TRUE', 'FALSE', 'DISTINCT', 'SOME', 'ANY', 'ALL', 'AS'
|
|
43
45
|
]);
|
|
46
|
+
/** True when `token` (the name inside `{{...}}`) is in the registered row-filter vocabulary. */
|
|
47
|
+
export function IsRegisteredRowFilterToken(token) {
|
|
48
|
+
return EXACT_REGISTERED_TOKENS.has(token) || USER_TOKEN_PATTERN.test(token);
|
|
49
|
+
}
|
|
50
|
+
/** The refusal message for a `{{token}}` outside the registered vocabulary. */
|
|
51
|
+
function UnregisteredTokenMessage(token) {
|
|
52
|
+
return (`Token {{${token}}} is not in the registered vocabulary ` +
|
|
53
|
+
`({{User*}}, {{ScopeResourceID}}, {{ScopeResourceType}}, {{ActingOrganizationID}}, ` +
|
|
54
|
+
`{{ActingPersonID}}, {{ActingScopeID}}, {{ActingCompanyIDs}}).`);
|
|
55
|
+
}
|
|
44
56
|
/**
|
|
45
57
|
* Validates a filter's FilterText against a specific entity (plan §5.3 checks
|
|
46
58
|
* 3 + 4, STRICT):
|
|
@@ -67,10 +79,8 @@ export function ValidateRowFilterTextAgainstEntity(filterText, entity) {
|
|
|
67
79
|
// 1. Token vocabulary check, then strip tokens so their contents don't hit
|
|
68
80
|
// the identifier scan.
|
|
69
81
|
let stripped = filterText.replace(/\{\{(\w+)\}\}/g, (_full, token) => {
|
|
70
|
-
if (!
|
|
71
|
-
errors.push(
|
|
72
|
-
`({{User*}}, {{ScopeResourceID}}, {{ScopeResourceType}}, {{ActingOrganizationID}}, ` +
|
|
73
|
-
`{{ActingPersonID}}, {{ActingScopeID}}, {{ActingCompanyIDs}}).`);
|
|
82
|
+
if (!IsRegisteredRowFilterToken(token)) {
|
|
83
|
+
errors.push(UnregisteredTokenMessage(token));
|
|
74
84
|
}
|
|
75
85
|
return "''"; // replace with an empty string literal so surrounding quotes stay balanced
|
|
76
86
|
});
|
|
@@ -154,10 +164,11 @@ export async function CollectRowFilterReferrers(filterId, md, contextUser, exclu
|
|
|
154
164
|
const entity = (row.EntityID ? md.EntityByID(row.EntityID) : undefined) ?? null;
|
|
155
165
|
referrers.push({
|
|
156
166
|
Description: `Entity Permission ${row.ID} (entity ${entity?.Name ?? row.EntityID})`,
|
|
157
|
-
Entity: entity
|
|
167
|
+
Entity: entity,
|
|
168
|
+
Kind: 'EntityPermission'
|
|
158
169
|
});
|
|
159
170
|
}
|
|
160
|
-
const addScopeReferrers = (rows, entityName, label) => {
|
|
171
|
+
const addScopeReferrers = (rows, entityName, label, kind) => {
|
|
161
172
|
for (const row of rows) {
|
|
162
173
|
if (exclude && exclude.entityName === entityName && UUIDsEqual(exclude.rowId, row.ID)) {
|
|
163
174
|
continue;
|
|
@@ -165,12 +176,13 @@ export async function CollectRowFilterReferrers(filterId, md, contextUser, exclu
|
|
|
165
176
|
const entity = IsExactResourceName(row.ResourcePattern) ? (md.EntityByName(row.ResourcePattern) ?? null) : null;
|
|
166
177
|
referrers.push({
|
|
167
178
|
Description: `${label} ${row.ID} (resource '${row.ResourcePattern ?? ''}')`,
|
|
168
|
-
Entity: entity
|
|
179
|
+
Entity: entity,
|
|
180
|
+
Kind: kind
|
|
169
181
|
});
|
|
170
182
|
}
|
|
171
183
|
};
|
|
172
|
-
addScopeReferrers(keyScopes.Results, 'MJ: API Key Scopes', 'API Key Scope rule');
|
|
173
|
-
addScopeReferrers(appScopes.Results, 'MJ: API Application Scopes', 'API Application Scope rule');
|
|
184
|
+
addScopeReferrers(keyScopes.Results, 'MJ: API Key Scopes', 'API Key Scope rule', 'APIKeyScope');
|
|
185
|
+
addScopeReferrers(appScopes.Results, 'MJ: API Application Scopes', 'API Application Scope rule', 'APIApplicationScope');
|
|
174
186
|
return referrers;
|
|
175
187
|
}
|
|
176
188
|
/**
|
|
@@ -196,6 +208,105 @@ export function BuildSameEntityErrors(referrers, targetEntity) {
|
|
|
196
208
|
}
|
|
197
209
|
return errors;
|
|
198
210
|
}
|
|
211
|
+
/**
|
|
212
|
+
* Substituted for a token that marking up with the saving user leaves unresolved (a null user
|
|
213
|
+
* property, or an `{{Acting*}}` token, which only API-key sessions carry). A GUID-shaped literal
|
|
214
|
+
* keeps the usual quoted shape (`Col = '{{Token}}'`) valid SQL for the compile probe.
|
|
215
|
+
*/
|
|
216
|
+
const UNRESOLVED_TOKEN_PLACEHOLDER = '00000000-0000-0000-0000-000000000000';
|
|
217
|
+
/** Upper bound for one compile probe. The probe reads no rows; this only bounds a pathological plan. */
|
|
218
|
+
const ROLE_FILTER_PROBE_TIMEOUT_MS = 15000;
|
|
219
|
+
/**
|
|
220
|
+
* True when every referrer of a filter is a role permission row, so the filter is a ROLE
|
|
221
|
+
* row-level-security filter that no API-key or API-application scope rule depends on.
|
|
222
|
+
* False for a filter with no referrers.
|
|
223
|
+
*/
|
|
224
|
+
export function IsRoleOnlyReferrerSet(referrers) {
|
|
225
|
+
return referrers.length > 0 && referrers.every(r => r.Kind === 'EntityPermission');
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Screens a ROLE filter's text before it is compiled. Role filters legitimately use subqueries
|
|
229
|
+
* and database functions (e.g. "rows of the organizations this user belongs to"), so unlike
|
|
230
|
+
* {@link ValidateRowFilterTextAgainstEntity} this allows `SELECT` and any function call; the
|
|
231
|
+
* compile probe proves the objects they reference exist. Everything else the shared
|
|
232
|
+
* `SQLExpressionValidator` blocks — DDL/DML/EXEC, comments, semicolons, system catalogs — is
|
|
233
|
+
* still refused, and every `{{Token}}` must be in the registered vocabulary.
|
|
234
|
+
*/
|
|
235
|
+
export function ScreenRoleRowFilterText(filterText) {
|
|
236
|
+
const errors = [];
|
|
237
|
+
const calledFunctions = [...filterText.matchAll(/\b([A-Za-z_][A-Za-z0-9_]*)\s*\(/g)].map(m => m[1]);
|
|
238
|
+
const screen = SQLExpressionValidator.Instance.validate(filterText, {
|
|
239
|
+
context: 'where_clause',
|
|
240
|
+
allowSubqueries: true,
|
|
241
|
+
additionalAllowed: calledFunctions
|
|
242
|
+
});
|
|
243
|
+
if (!screen.valid) {
|
|
244
|
+
errors.push(screen.error ?? 'FilterText failed SQL expression validation.');
|
|
245
|
+
}
|
|
246
|
+
const tokens = new Set([...filterText.matchAll(/\{\{(\w+)\}\}/g)].map(m => m[1]));
|
|
247
|
+
for (const token of tokens) {
|
|
248
|
+
if (!IsRegisteredRowFilterToken(token)) {
|
|
249
|
+
errors.push(UnregisteredTokenMessage(token));
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
return errors;
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Compiles a ROLE filter against one entity's base view — the view role RLS is applied to at
|
|
256
|
+
* query time — by running `SELECT 1 FROM <BaseView> WHERE 1 = 0 AND (<filter>)`. Tokens are
|
|
257
|
+
* marked up with the saving user exactly as at query time. `1 = 0` means no row is read, but
|
|
258
|
+
* the database still binds every column, table and function the filter names, so a bad
|
|
259
|
+
* reference fails here instead of on every read. Returns the refusal message, or null.
|
|
260
|
+
*/
|
|
261
|
+
export async function ProbeRoleRowFilterAgainstEntity(filterText, entity, provider, contextUser) {
|
|
262
|
+
const predicate = new RowLevelSecurityFilterInfo({ FilterText: filterText })
|
|
263
|
+
.MarkupFilterText(contextUser)
|
|
264
|
+
.replace(/\{\{\w+\}\}/g, () => UNRESOLVED_TOKEN_PLACEHOLDER);
|
|
265
|
+
const sql = `SELECT 1 AS ${provider.QuoteIdentifier('Probe')} ` +
|
|
266
|
+
`FROM ${provider.QuoteSchemaAndView(entity.SchemaName, entity.BaseView)} ` +
|
|
267
|
+
`WHERE 1 = 0 AND (${predicate})`;
|
|
268
|
+
try {
|
|
269
|
+
await provider.ExecuteSQL(sql, undefined, {
|
|
270
|
+
description: `Compile check of a row-level-security filter against ${entity.Name}`,
|
|
271
|
+
ignoreLogging: true,
|
|
272
|
+
readOnlyTransaction: true,
|
|
273
|
+
timeoutMs: ROLE_FILTER_PROBE_TIMEOUT_MS
|
|
274
|
+
}, contextUser);
|
|
275
|
+
return null;
|
|
276
|
+
}
|
|
277
|
+
catch (e) {
|
|
278
|
+
const reason = e instanceof Error ? e.message : String(e);
|
|
279
|
+
return `FilterText does not compile against entity '${entity.Name}' (${entity.SchemaName}.${entity.BaseView}): ${reason}`;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Validates a new FilterText for a ROLE filter (see {@link IsRoleOnlyReferrerSet}) against every
|
|
284
|
+
* entity that references it. The API-key rules — plain columns only, one entity per filter — do
|
|
285
|
+
* not apply: a role filter may use subqueries and may be shared across entities, as long as it
|
|
286
|
+
* compiles against each one. Referrers that do not resolve to an entity reject (fail closed),
|
|
287
|
+
* and text that fails the screen is never sent to the database.
|
|
288
|
+
*/
|
|
289
|
+
export async function ValidateRoleRowFilterText(filterText, referrers, provider, contextUser) {
|
|
290
|
+
const errors = ScreenRoleRowFilterText(filterText);
|
|
291
|
+
for (const referrer of referrers.filter(r => !r.Entity)) {
|
|
292
|
+
errors.push(`${referrer.Description} references this filter but does not resolve to an entity — the new ` +
|
|
293
|
+
`FilterText cannot be validated against it; rejecting (fail closed).`);
|
|
294
|
+
}
|
|
295
|
+
if (errors.length > 0) {
|
|
296
|
+
return errors;
|
|
297
|
+
}
|
|
298
|
+
const entities = new Map();
|
|
299
|
+
for (const referrer of referrers) {
|
|
300
|
+
entities.set(referrer.Entity.ID.toLowerCase(), referrer.Entity);
|
|
301
|
+
}
|
|
302
|
+
for (const entity of entities.values()) {
|
|
303
|
+
const failure = await ProbeRoleRowFilterAgainstEntity(filterText, entity, provider, contextUser);
|
|
304
|
+
if (failure) {
|
|
305
|
+
errors.push(failure);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
return errors;
|
|
309
|
+
}
|
|
199
310
|
/** Convenience: wraps validation failures as ValidationErrorInfo entries. */
|
|
200
311
|
export function ToValidationErrors(fieldName, messages) {
|
|
201
312
|
return messages.map(m => new ValidationErrorInfo(fieldName, m, null, ValidationErrorType.Failure));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rowFilterValidation.js","sourceRoot":"","sources":["../../src/custom/rowFilterValidation.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"rowFilterValidation.js","sourceRoot":"","sources":["../../src/custom/rowFilterValidation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAIH,0BAA0B,EAC1B,OAAO,EAEP,mBAAmB,EACnB,mBAAmB,EACtB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,sBAAsB,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAE5E;;;;;GAKG;AACH,MAAM,uBAAuB,GAAwB,IAAI,GAAG,CAAC;IACzD,iBAAiB;IACjB,mBAAmB;IACnB,sBAAsB;IACtB,gBAAgB;IAChB,eAAe;IACf,kBAAkB;CACrB,CAAC,CAAC;AAEH,MAAM,kBAAkB,GAAG,6BAA6B,CAAC;AAEzD;;;;;;GAMG;AACH,MAAM,iBAAiB,GAAwB,IAAI,GAAG,CAAC;IACnD,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ;IACnE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM;IAC9D,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI;CAC1D,CAAC,CAAC;AAEH,gGAAgG;AAChG,MAAM,UAAU,0BAA0B,CAAC,KAAa;IACpD,OAAO,uBAAuB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAChF,CAAC;AAED,+EAA+E;AAC/E,SAAS,wBAAwB,CAAC,KAAa;IAC3C,OAAO,CACH,WAAW,KAAK,yCAAyC;QACzD,oFAAoF;QACpF,+DAA+D,CAClE,CAAC;AACN,CAAC;AAQD;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,kCAAkC,CAAC,UAAkB,EAAE,MAAkB;IACrF,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,0EAA0E;IAC1E,yEAAyE;IACzE,MAAM,WAAW,GAAG,sBAAsB,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC;IACtG,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACrB,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,IAAI,8CAA8C,CAAC,CAAC;IACrF,CAAC;IAED,2EAA2E;IAC3E,0BAA0B;IAC1B,IAAI,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,KAAK,EAAE,KAAa,EAAE,EAAE;QACzE,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC,EAAE,CAAC;YACrC,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,IAAI,CAAC,CAAC,2EAA2E;IAC5F,CAAC,CAAC,CAAC;IAEH,0EAA0E;IAC1E,6BAA6B;IAC7B,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;IAEnD,MAAM,cAAc,GAAG,IAAI,GAAG,CAC1B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CACzE,CAAC;IAEF,MAAM,eAAe,GAAG,CAAC,UAAkB,EAAQ,EAAE;QACjD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YAChD,MAAM,CAAC,IAAI,CACP,WAAW,UAAU,6DAA6D,MAAM,CAAC,IAAI,IAAI,CACpG,CAAC;QACN,CAAC;IACL,CAAC,CAAC;IAEF,4EAA4E;IAC5E,2CAA2C;IAC3C,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC,KAAK,EAAE,UAAkB,EAAE,EAAE;QACvE,eAAe,CAAC,UAAU,CAAC,CAAC;QAC5B,OAAO,EAAE,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,6EAA6E;IAC7E,sEAAsE;IACtE,yEAAyE;IACzE,MAAM,iBAAiB,GAAG,wCAAwC,CAAC;IACnE,IAAI,KAA6B,CAAC;IAClC,OAAO,CAAC,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACzD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YAC5C,SAAS;QACb,CAAC;QACD,eAAe,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;AAClD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAsB;IACtD,OAAO,CACH,OAAO,IAAI,IAAI;QACf,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QACzB,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;QACtB,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;QACtB,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CACzB,CAAC;AACN,CAAC;AAmBD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC3C,QAAgB,EAChB,EAAqB,EACrB,WAAqB,EACrB,OAA+C;IAE/C,MAAM,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;IACzB,MAAM,CAAC,WAAW,EAAE,SAAS,EAAE,SAAS,CAAC,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC;QAC1D;YACI,UAAU,EAAE,wBAAwB;YACpC,WAAW,EACP,oBAAoB,QAAQ,2BAA2B,QAAQ,OAAO;gBACtE,sBAAsB,QAAQ,2BAA2B,QAAQ,GAAG;YACxE,MAAM,EAAE,CAAC,IAAI,EAAE,UAAU,CAAC;YAC1B,UAAU,EAAE,QAAQ;SACvB;QACD;YACI,UAAU,EAAE,oBAAoB;YAChC,WAAW,EAAE,gBAAgB,QAAQ,GAAG;YACxC,MAAM,EAAE,CAAC,IAAI,EAAE,iBAAiB,CAAC;YACjC,UAAU,EAAE,QAAQ;SACvB;QACD;YACI,UAAU,EAAE,4BAA4B;YACxC,WAAW,EAAE,gBAAgB,QAAQ,GAAG;YACxC,MAAM,EAAE,CAAC,IAAI,EAAE,iBAAiB,CAAC;YACjC,UAAU,EAAE,QAAQ;SACvB;KACJ,EAAE,WAAW,CAAC,CAAC;IAEhB,MAAM,MAAM,GAAG,CAAC,WAAW,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACzE,IAAI,MAAM,EAAE,CAAC;QACT,kFAAkF;QAClF,MAAM,IAAI,KAAK,CAAC,yDAAyD,QAAQ,KAAK,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;IACjH,CAAC;IAED,MAAM,SAAS,GAAwB,EAAE,CAAC;IAE1C,KAAK,MAAM,GAAG,IAAK,WAAW,CAAC,OAA8C,EAAE,CAAC;QAC5E,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC;QAChF,SAAS,CAAC,IAAI,CAAC;YACX,WAAW,EAAE,qBAAqB,GAAG,CAAC,EAAE,YAAY,MAAM,EAAE,IAAI,IAAI,GAAG,CAAC,QAAQ,GAAG;YACnF,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,kBAAkB;SAC3B,CAAC,CAAC;IACP,CAAC;IAED,MAAM,iBAAiB,GAAG,CACtB,IAAsD,EACtD,UAAkB,EAClB,KAAa,EACb,IAA2B,EACvB,EAAE;QACN,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACrB,IAAI,OAAO,IAAI,OAAO,CAAC,UAAU,KAAK,UAAU,IAAI,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gBACpF,SAAS;YACb,CAAC;YACD,MAAM,MAAM,GAAG,mBAAmB,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAChH,SAAS,CAAC,IAAI,CAAC;gBACX,WAAW,EAAE,GAAG,KAAK,IAAI,GAAG,CAAC,EAAE,eAAe,GAAG,CAAC,eAAe,IAAI,EAAE,IAAI;gBAC3E,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,IAAI;aACb,CAAC,CAAC;QACP,CAAC;IACL,CAAC,CAAC;IAEF,iBAAiB,CAAC,SAAS,CAAC,OAA2D,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,aAAa,CAAC,CAAC;IACpJ,iBAAiB,CAAC,SAAS,CAAC,OAA2D,EAAE,4BAA4B,EAAE,4BAA4B,EAAE,qBAAqB,CAAC,CAAC;IAE5K,OAAO,SAAS,CAAC;AACrB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CAAC,SAA8B,EAAE,YAAwB;IAC1F,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QAC/B,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,CAAC,IAAI,CACP,GAAG,QAAQ,CAAC,WAAW,sEAAsE;gBAC7F,kEAAkE,CACrE,CAAC;QACN,CAAC;aAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,YAAY,CAAC,EAAE,CAAC,EAAE,CAAC;YAC1D,MAAM,CAAC,IAAI,CACP,GAAG,QAAQ,CAAC,WAAW,yCAAyC,QAAQ,CAAC,MAAM,CAAC,IAAI,mBAAmB;gBACvG,gBAAgB,YAAY,CAAC,IAAI,kEAAkE;gBACnG,0CAA0C,CAC7C,CAAC;QACN,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,4BAA4B,GAAG,sCAAsC,CAAC;AAK5E,wGAAwG;AACxG,MAAM,4BAA4B,GAAG,KAAK,CAAC;AAE3C;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,SAA8B;IAChE,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,kBAAkB,CAAC,CAAC;AACvF,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,uBAAuB,CAAC,UAAkB;IACtD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,eAAe,GAAG,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,kCAAkC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpG,MAAM,MAAM,GAAG,sBAAsB,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE;QAChE,OAAO,EAAE,cAAc;QACvB,eAAe,EAAE,IAAI;QACrB,iBAAiB,EAAE,eAAe;KACrC,CAAC,CAAC;IACH,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,8CAA8C,CAAC,CAAC;IAChF,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACzB,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC,EAAE,CAAC;YACrC,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC,CAAC;QACjD,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,+BAA+B,CACjD,UAAkB,EAClB,MAAkB,EAClB,QAAgC,EAChC,WAAqB;IAErB,MAAM,SAAS,GAAG,IAAI,0BAA0B,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;SACvE,gBAAgB,CAAC,WAAW,CAAC;SAC7B,OAAO,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,4BAA4B,CAAC,CAAC;IACjE,MAAM,GAAG,GACL,eAAe,QAAQ,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG;QACnD,QAAQ,QAAQ,CAAC,kBAAkB,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG;QAC1E,oBAAoB,SAAS,GAAG,CAAC;IACrC,IAAI,CAAC;QACD,MAAM,QAAQ,CAAC,UAAU,CAAoB,GAAG,EAAE,SAAS,EAAE;YACzD,WAAW,EAAE,wDAAwD,MAAM,CAAC,IAAI,EAAE;YAClF,aAAa,EAAE,IAAI;YACnB,mBAAmB,EAAE,IAAI;YACzB,SAAS,EAAE,4BAA4B;SAC1C,EAAE,WAAW,CAAC,CAAC;QAChB,OAAO,IAAI,CAAC;IAChB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,MAAM,MAAM,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC1D,OAAO,+CAA+C,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,QAAQ,MAAM,MAAM,EAAE,CAAC;IAC9H,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC3C,UAAkB,EAClB,SAA8B,EAC9B,QAAgC,EAChC,WAAqB;IAErB,MAAM,MAAM,GAAG,uBAAuB,CAAC,UAAU,CAAC,CAAC;IACnD,KAAK,MAAM,QAAQ,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACtD,MAAM,CAAC,IAAI,CACP,GAAG,QAAQ,CAAC,WAAW,sEAAsE;YAC7F,qEAAqE,CACxE,CAAC;IACN,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC/C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QAC/B,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAO,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,QAAQ,CAAC,MAAO,CAAC,CAAC;IACtE,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,MAAM,+BAA+B,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;QACjG,IAAI,OAAO,EAAE,CAAC;YACV,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,kBAAkB,CAAC,SAAiB,EAAE,QAAkB;IACpE,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,mBAAmB,CAAC,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC;AACvG,CAAC;AAuBD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC5C,IAAqC,EACrC,EAAqB,EACrB,WAAqB;IAErB,MAAM,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;IAEzB,2EAA2E;IAC3E,MAAM,gBAAgB,GAAG,MAAM,EAAE,CAAC,OAAO,CAAiB;QACtD,UAAU,EAAE,gBAAgB;QAC5B,WAAW,EAAE,wBAAwB;QACrC,MAAM,EAAE,CAAC,IAAI,CAAC;QACd,UAAU,EAAE,QAAQ;KACvB,EAAE,WAAW,CAAC,CAAC;IAChB,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC;QAC5B,OAAO,CAAC,4CAA4C,gBAAgB,CAAC,YAAY,4BAA4B,CAAC,CAAC;IACnH,CAAC;IACD,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC;IACzE,MAAM,iBAAiB,GACnB,iBAAiB,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,iBAAiB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;IAEnG,gGAAgG;IAChG,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACjD,OAAO,EAAE,CAAC;IACd,CAAC;IAED,gEAAgE;IAChE,MAAM,cAAc,GAAG,MAAM,EAAE,CAAC,OAAO,CAA+E;QAClH,UAAU,EAAE,IAAI,CAAC,cAAc;QAC/B,WAAW,EAAE,IAAI,CAAC,iBAAiB;QACnC,MAAM,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,CAAC;QAClD,UAAU,EAAE,QAAQ;KACvB,EAAE,WAAW,CAAC,CAAC;IAChB,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;QAC1B,OAAO,CAAC,sBAAsB,IAAI,CAAC,UAAU,yBAAyB,cAAc,CAAC,YAAY,4BAA4B,CAAC,CAAC;IACnI,CAAC;IACD,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;IAErG,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,qFAAqF;IACrF,IAAI,iBAAiB,EAAE,CAAC;QACpB,MAAM,eAAe,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC;QAClE,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,CACP,sGAAsG;gBACtG,mGAAmG;gBACnG,GAAG,IAAI,CAAC,UAAU,4BAA4B,CACjD,CAAC;QACN,CAAC;QACD,IAAI,eAAe,EAAE,CAAC;YAClB,MAAM,CAAC,IAAI,CACP,oCAAoC,IAAI,CAAC,UAAU,gBAAgB,eAAe,CAAC,EAAE,qBAAqB;gBAC1G,uGAAuG;gBACvG,OAAO,IAAI,CAAC,UAAU,gFAAgF,CACzG,CAAC;QACN,CAAC;IACL,CAAC;IAED,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,EAAE,CAAC;QAC3B,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,6FAA6F;IAC7F,IAAI,CAAC,iBAAiB,IAAI,iBAAiB,IAAI,IAAI,EAAE,CAAC;QAClD,MAAM,iBAAiB,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,iBAAiB,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC1G,IAAI,iBAAiB,EAAE,CAAC;YACpB,MAAM,CAAC,IAAI,CACP,mDAAmD,IAAI,CAAC,UAAU,kCAAkC;gBACpG,SAAS,iBAAiB,CAAC,EAAE,0EAA0E;gBACvG,iBAAiB,CACpB,CAAC;QACN,CAAC;IACL,CAAC;IAED,iFAAiF;IACjF,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QACd,MAAM,CAAC,IAAI,CAAC,6HAA6H,CAAC,CAAC;IAC/I,CAAC;IACD,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,uIAAuI,CAAC,CAAC;IACzJ,CAAC;IAED,8CAA8C;IAC9C,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC;QAC7C,MAAM,CAAC,IAAI,CACP,oGAAoG;YACpG,2DAA2D,IAAI,CAAC,eAAe,IAAI,EAAE,KAAK,CAC7F,CAAC;QACF,OAAO,MAAM,CAAC,CAAC,2CAA2C;IAC9D,CAAC;IACD,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACrD,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,MAAM,CAAC,IAAI,CAAC,oBAAoB,IAAI,CAAC,eAAe,kCAAkC,CAAC,CAAC;QACxF,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,qGAAqG;IACrG,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC,OAAO,CAA0D;QAC3F,UAAU,EAAE,gCAAgC;QAC5C,WAAW,EAAE,OAAO,IAAI,CAAC,WAAW,GAAG;QACvC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC;QACpC,UAAU,EAAE,QAAQ;KACvB,EAAE,WAAW,CAAC,CAAC;IAChB,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC,4CAA4C,IAAI,CAAC,WAAW,KAAK,YAAY,CAAC,YAAY,4BAA4B,CAAC,CAAC;QACpI,OAAO,MAAM,CAAC;IAClB,CAAC;IACD,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACvC,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,MAAM,CAAC,IAAI,CAAC,6BAA6B,IAAI,CAAC,WAAW,kBAAkB,CAAC,CAAC;QAC7E,OAAO,MAAM,CAAC;IAClB,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9D,MAAM,CAAC,IAAI,CAAC,8BAA8B,MAAM,CAAC,IAAI,+FAA+F,CAAC,CAAC;QACtJ,OAAO,MAAM,CAAC;IAClB,CAAC;IACD,MAAM,cAAc,GAAG,kCAAkC,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACrF,MAAM,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,MAAM,CAAC,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAEhF,oEAAoE;IACpE,IAAI,CAAC;QACD,MAAM,SAAS,GAAG,MAAM,yBAAyB,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,EAAE,WAAW,EAAE;YACjF,UAAU,EAAE,IAAI,CAAC,cAAc;YAC/B,KAAK,EAAE,IAAI,CAAC,KAAK;SACpB,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,GAAG,qBAAqB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IAC7D,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -10,6 +10,7 @@ export * from './custom/MJTemplateContentEntityServer.server.js';
|
|
|
10
10
|
export * from './custom/MJUserViewEntityServer.server.js';
|
|
11
11
|
export * from './custom/MJListEntityServer.server.js';
|
|
12
12
|
export * from './custom/MJListDetailEntityServer.server.js';
|
|
13
|
+
export * from './custom/MJDataContextItemEntityServer.server.js';
|
|
13
14
|
export * from './custom/MJActionEntityServer.server.js';
|
|
14
15
|
export * from './custom/MJApplicationEntityServer.server.js';
|
|
15
16
|
export * from './custom/MJComponentEntityServer.server.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,wCAAwC,CAAC;AACvD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,kDAAkD,CAAC;AACjE,cAAc,4DAA4D,CAAC;AAC3E,cAAc,4CAA4C,CAAC;AAC3D,cAAc,qCAAqC,CAAC;AACpD,cAAc,wCAAwC,CAAC;AACvD,cAAc,+CAA+C,CAAC;AAC9D,cAAc,wCAAwC,CAAC;AACvD,cAAc,oCAAoC,CAAC;AACnD,cAAc,0CAA0C,CAAC;AACzD,cAAc,sCAAsC,CAAC;AACrD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,yCAAyC,CAAC;AACxD,cAAc,+CAA+C,CAAC;AAC9D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,8CAA8C,CAAC;AAC7D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,mCAAmC,CAAC;AAClD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,wCAAwC,CAAC;AACvD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,0CAA0C,CAAC;AACzD,cAAc,kDAAkD,CAAC;AACjE,cAAc,uCAAuC,CAAC;AACtD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,gDAAgD,CAAC;AAC/D,cAAc,qDAAqD,CAAC;AACpE,cAAc,uDAAuD,CAAC;AACtE,cAAc,oDAAoD,CAAC;AACnE,cAAc,+DAA+D,CAAC;AAC9E,cAAc,uDAAuD,CAAC;AACtE,cAAc,kDAAkD,CAAC;AACjE,cAAc,iDAAiD,CAAC;AAChE,cAAc,uCAAuC,CAAC;AACtD,cAAc,kDAAkD,CAAC;AACjE,cAAc,oCAAoC,CAAC;AACnD,cAAc,oCAAoC,CAAC;AACnD,cAAc,wCAAwC,CAAC;AACvD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,oDAAoD,CAAC;AACnE,cAAc,2CAA2C,CAAC;AAC1D,cAAc,mDAAmD,CAAC;AAClE,cAAc,sDAAsD,CAAC;AACrE,cAAc,qDAAqD,CAAC;AACpE,cAAc,sCAAsC,CAAC;AACrD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,oCAAoC,CAAC;AACnD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mCAAmC,CAAC;AAClD,cAAc,eAAe,CAAC;AAE9B,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yCAAyC,CAAC;AACxD,cAAc,qCAAqC,CAAC;AACpD,cAAc,+CAA+C,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,wCAAwC,CAAC;AACvD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,kDAAkD,CAAC;AACjE,cAAc,4DAA4D,CAAC;AAC3E,cAAc,4CAA4C,CAAC;AAC3D,cAAc,qCAAqC,CAAC;AACpD,cAAc,wCAAwC,CAAC;AACvD,cAAc,+CAA+C,CAAC;AAC9D,cAAc,wCAAwC,CAAC;AACvD,cAAc,oCAAoC,CAAC;AACnD,cAAc,0CAA0C,CAAC;AACzD,cAAc,+CAA+C,CAAC;AAC9D,cAAc,sCAAsC,CAAC;AACrD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,yCAAyC,CAAC;AACxD,cAAc,+CAA+C,CAAC;AAC9D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,8CAA8C,CAAC;AAC7D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,mCAAmC,CAAC;AAClD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,wCAAwC,CAAC;AACvD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,0CAA0C,CAAC;AACzD,cAAc,kDAAkD,CAAC;AACjE,cAAc,uCAAuC,CAAC;AACtD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,gDAAgD,CAAC;AAC/D,cAAc,qDAAqD,CAAC;AACpE,cAAc,uDAAuD,CAAC;AACtE,cAAc,oDAAoD,CAAC;AACnE,cAAc,+DAA+D,CAAC;AAC9E,cAAc,uDAAuD,CAAC;AACtE,cAAc,kDAAkD,CAAC;AACjE,cAAc,iDAAiD,CAAC;AAChE,cAAc,uCAAuC,CAAC;AACtD,cAAc,kDAAkD,CAAC;AACjE,cAAc,oCAAoC,CAAC;AACnD,cAAc,oCAAoC,CAAC;AACnD,cAAc,wCAAwC,CAAC;AACvD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,oDAAoD,CAAC;AACnE,cAAc,2CAA2C,CAAC;AAC1D,cAAc,mDAAmD,CAAC;AAClE,cAAc,sDAAsD,CAAC;AACrE,cAAc,qDAAqD,CAAC;AACpE,cAAc,sCAAsC,CAAC;AACrD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,oCAAoC,CAAC;AACnD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mCAAmC,CAAC;AAClD,cAAc,eAAe,CAAC;AAE9B,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yCAAyC,CAAC;AACxD,cAAc,qCAAqC,CAAC;AACpD,cAAc,+CAA+C,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -10,6 +10,7 @@ export * from './custom/MJTemplateContentEntityServer.server.js';
|
|
|
10
10
|
export * from './custom/MJUserViewEntityServer.server.js';
|
|
11
11
|
export * from './custom/MJListEntityServer.server.js';
|
|
12
12
|
export * from './custom/MJListDetailEntityServer.server.js';
|
|
13
|
+
export * from './custom/MJDataContextItemEntityServer.server.js';
|
|
13
14
|
export * from './custom/MJActionEntityServer.server.js';
|
|
14
15
|
export * from './custom/MJApplicationEntityServer.server.js';
|
|
15
16
|
export * from './custom/MJComponentEntityServer.server.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,wCAAwC,CAAC;AACvD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,kDAAkD,CAAC;AACjE,cAAc,4DAA4D,CAAC;AAC3E,cAAc,4CAA4C,CAAC;AAC3D,cAAc,qCAAqC,CAAC;AACpD,cAAc,wCAAwC,CAAC;AACvD,cAAc,+CAA+C,CAAC;AAC9D,cAAc,wCAAwC,CAAC;AACvD,cAAc,oCAAoC,CAAC;AACnD,cAAc,0CAA0C,CAAC;AACzD,cAAc,sCAAsC,CAAC;AACrD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,yCAAyC,CAAC;AACxD,cAAc,+CAA+C,CAAC;AAC9D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,8CAA8C,CAAC;AAC7D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,mCAAmC,CAAC;AAClD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,wCAAwC,CAAC;AACvD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,0CAA0C,CAAC;AACzD,cAAc,kDAAkD,CAAC;AACjE,cAAc,uCAAuC,CAAC;AACtD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,gDAAgD,CAAC;AAC/D,cAAc,qDAAqD,CAAC;AACpE,cAAc,uDAAuD,CAAC;AACtE,cAAc,oDAAoD,CAAC;AACnE,cAAc,+DAA+D,CAAC;AAC9E,cAAc,uDAAuD,CAAC;AACtE,cAAc,kDAAkD,CAAC;AACjE,cAAc,iDAAiD,CAAC;AAChE,cAAc,uCAAuC,CAAC;AACtD,cAAc,kDAAkD,CAAC;AACjE,cAAc,oCAAoC,CAAC;AACnD,cAAc,oCAAoC,CAAC;AACnD,cAAc,wCAAwC,CAAC;AACvD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,oDAAoD,CAAC;AACnE,cAAc,2CAA2C,CAAC;AAC1D,cAAc,mDAAmD,CAAC;AAClE,cAAc,sDAAsD,CAAC;AACrE,cAAc,qDAAqD,CAAC;AACpE,cAAc,sCAAsC,CAAC;AACrD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,oCAAoC,CAAC;AACnD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mCAAmC,CAAC;AAClD,cAAc,eAAe,CAAC;AAE9B,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yCAAyC,CAAC;AACxD,cAAc,qCAAqC,CAAC;AACpD,cAAc,+CAA+C,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,wCAAwC,CAAC;AACvD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,kDAAkD,CAAC;AACjE,cAAc,4DAA4D,CAAC;AAC3E,cAAc,4CAA4C,CAAC;AAC3D,cAAc,qCAAqC,CAAC;AACpD,cAAc,wCAAwC,CAAC;AACvD,cAAc,+CAA+C,CAAC;AAC9D,cAAc,wCAAwC,CAAC;AACvD,cAAc,oCAAoC,CAAC;AACnD,cAAc,0CAA0C,CAAC;AACzD,cAAc,+CAA+C,CAAC;AAC9D,cAAc,sCAAsC,CAAC;AACrD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,yCAAyC,CAAC;AACxD,cAAc,+CAA+C,CAAC;AAC9D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,8CAA8C,CAAC;AAC7D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,mCAAmC,CAAC;AAClD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,wCAAwC,CAAC;AACvD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,0CAA0C,CAAC;AACzD,cAAc,kDAAkD,CAAC;AACjE,cAAc,uCAAuC,CAAC;AACtD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,gDAAgD,CAAC;AAC/D,cAAc,qDAAqD,CAAC;AACpE,cAAc,uDAAuD,CAAC;AACtE,cAAc,oDAAoD,CAAC;AACnE,cAAc,+DAA+D,CAAC;AAC9E,cAAc,uDAAuD,CAAC;AACtE,cAAc,kDAAkD,CAAC;AACjE,cAAc,iDAAiD,CAAC;AAChE,cAAc,uCAAuC,CAAC;AACtD,cAAc,kDAAkD,CAAC;AACjE,cAAc,oCAAoC,CAAC;AACnD,cAAc,oCAAoC,CAAC;AACnD,cAAc,wCAAwC,CAAC;AACvD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,oDAAoD,CAAC;AACnE,cAAc,2CAA2C,CAAC;AAC1D,cAAc,mDAAmD,CAAC;AAClE,cAAc,sDAAsD,CAAC;AACrE,cAAc,qDAAqD,CAAC;AACpE,cAAc,sCAAsC,CAAC;AACrD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,oCAAoC,CAAC;AACnD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mCAAmC,CAAC;AAClD,cAAc,eAAe,CAAC;AAE9B,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yCAAyC,CAAC;AACxD,cAAc,qCAAqC,CAAC;AACpD,cAAc,+CAA+C,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/core-entities-server",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "6.1.
|
|
4
|
+
"version": "6.1.6",
|
|
5
5
|
"description": "Entity subclasses for the metadata layer of MemberJunction that are only used on server side applications like MJAPI, distributed as part of each release of MemberJunction",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
@@ -15,33 +15,33 @@
|
|
|
15
15
|
"typescript": "^5.9.3"
|
|
16
16
|
},
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@memberjunction/actions-base": "6.1.
|
|
19
|
-
"@memberjunction/ai": "6.1.
|
|
20
|
-
"@memberjunction/ai-core-plus": "6.1.
|
|
21
|
-
"@memberjunction/ai-engine-base": "6.1.
|
|
22
|
-
"@memberjunction/ai-prompts": "6.1.
|
|
23
|
-
"@memberjunction/ai-provider-bundle": "6.1.
|
|
24
|
-
"@memberjunction/ai-vector-dupe": "6.1.
|
|
25
|
-
"@memberjunction/ai-vectordb": "6.1.
|
|
26
|
-
"@memberjunction/ai-vectors-memory": "6.1.
|
|
27
|
-
"@memberjunction/aiengine": "6.1.
|
|
28
|
-
"@memberjunction/core": "6.1.
|
|
29
|
-
"@memberjunction/core-entities": "6.1.
|
|
30
|
-
"@memberjunction/predictive-studio-core": "6.1.
|
|
31
|
-
"@memberjunction/doc-utils": "6.1.
|
|
32
|
-
"@memberjunction/generic-database-provider": "6.1.
|
|
33
|
-
"@memberjunction/global": "6.1.
|
|
34
|
-
"@memberjunction/integration-engine": "6.1.
|
|
35
|
-
"@memberjunction/integration-pk-classifier": "6.1.
|
|
36
|
-
"@memberjunction/scheduling-engine": "6.1.
|
|
37
|
-
"@memberjunction/sql-converter": "6.1.
|
|
38
|
-
"@memberjunction/sql-dialect": "6.1.
|
|
39
|
-
"@memberjunction/sql-parser": "6.1.
|
|
40
|
-
"@memberjunction/sqlserver-dataprovider": "6.1.
|
|
41
|
-
"@memberjunction/tag-engine": "6.1.
|
|
42
|
-
"@memberjunction/communication-engine": "6.1.
|
|
43
|
-
"@memberjunction/communication-types": "6.1.
|
|
44
|
-
"@memberjunction/templates": "6.1.
|
|
18
|
+
"@memberjunction/actions-base": "6.1.6",
|
|
19
|
+
"@memberjunction/ai": "6.1.6",
|
|
20
|
+
"@memberjunction/ai-core-plus": "6.1.6",
|
|
21
|
+
"@memberjunction/ai-engine-base": "6.1.6",
|
|
22
|
+
"@memberjunction/ai-prompts": "6.1.6",
|
|
23
|
+
"@memberjunction/ai-provider-bundle": "6.1.6",
|
|
24
|
+
"@memberjunction/ai-vector-dupe": "6.1.6",
|
|
25
|
+
"@memberjunction/ai-vectordb": "6.1.6",
|
|
26
|
+
"@memberjunction/ai-vectors-memory": "6.1.6",
|
|
27
|
+
"@memberjunction/aiengine": "6.1.6",
|
|
28
|
+
"@memberjunction/core": "6.1.6",
|
|
29
|
+
"@memberjunction/core-entities": "6.1.6",
|
|
30
|
+
"@memberjunction/predictive-studio-core": "6.1.6",
|
|
31
|
+
"@memberjunction/doc-utils": "6.1.6",
|
|
32
|
+
"@memberjunction/generic-database-provider": "6.1.6",
|
|
33
|
+
"@memberjunction/global": "6.1.6",
|
|
34
|
+
"@memberjunction/integration-engine": "6.1.6",
|
|
35
|
+
"@memberjunction/integration-pk-classifier": "6.1.6",
|
|
36
|
+
"@memberjunction/scheduling-engine": "6.1.6",
|
|
37
|
+
"@memberjunction/sql-converter": "6.1.6",
|
|
38
|
+
"@memberjunction/sql-dialect": "6.1.6",
|
|
39
|
+
"@memberjunction/sql-parser": "6.1.6",
|
|
40
|
+
"@memberjunction/sqlserver-dataprovider": "6.1.6",
|
|
41
|
+
"@memberjunction/tag-engine": "6.1.6",
|
|
42
|
+
"@memberjunction/communication-engine": "6.1.6",
|
|
43
|
+
"@memberjunction/communication-types": "6.1.6",
|
|
44
|
+
"@memberjunction/templates": "6.1.6",
|
|
45
45
|
"nunjucks": "3.2.4",
|
|
46
46
|
"rxjs": "~7.8.1",
|
|
47
47
|
"zod": "^3.25.0"
|