@snowtop/ent 0.1.0-alpha15 → 0.1.0-alpha151
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/action/action.d.ts +27 -16
- package/action/action.js +22 -7
- package/action/executor.d.ts +16 -3
- package/action/executor.js +90 -23
- package/action/experimental_action.d.ts +25 -16
- package/action/experimental_action.js +35 -9
- package/action/index.d.ts +3 -1
- package/action/index.js +7 -1
- package/action/operations.d.ts +125 -0
- package/action/operations.js +684 -0
- package/action/orchestrator.d.ts +38 -12
- package/action/orchestrator.js +427 -102
- package/action/relative_value.d.ts +47 -0
- package/action/relative_value.js +125 -0
- package/action/transaction.d.ts +10 -0
- package/action/transaction.js +23 -0
- package/auth/auth.d.ts +1 -1
- package/core/base.d.ts +52 -21
- package/core/base.js +7 -1
- package/core/clause.d.ts +95 -40
- package/core/clause.js +395 -64
- package/core/config.d.ts +15 -1
- package/core/config.js +10 -1
- package/core/const.d.ts +3 -0
- package/core/const.js +6 -0
- package/core/context.d.ts +4 -2
- package/core/context.js +20 -2
- package/core/convert.d.ts +1 -1
- package/core/date.js +1 -5
- package/core/db.d.ts +12 -8
- package/core/db.js +18 -8
- package/core/ent.d.ts +68 -94
- package/core/ent.js +538 -587
- package/core/global_schema.d.ts +7 -0
- package/core/global_schema.js +51 -0
- package/core/loaders/assoc_count_loader.d.ts +1 -0
- package/core/loaders/assoc_count_loader.js +10 -2
- package/core/loaders/assoc_edge_loader.d.ts +1 -1
- package/core/loaders/assoc_edge_loader.js +10 -13
- package/core/loaders/index.d.ts +1 -1
- package/core/loaders/index.js +1 -3
- package/core/loaders/index_loader.d.ts +3 -3
- package/core/loaders/loader.d.ts +2 -2
- package/core/loaders/loader.js +5 -5
- package/core/loaders/object_loader.d.ts +30 -9
- package/core/loaders/object_loader.js +225 -78
- package/core/loaders/query_loader.d.ts +6 -12
- package/core/loaders/query_loader.js +54 -13
- package/core/loaders/raw_count_loader.d.ts +1 -0
- package/core/loaders/raw_count_loader.js +7 -2
- package/core/logger.d.ts +1 -1
- package/core/logger.js +1 -0
- package/core/privacy.d.ts +7 -6
- package/core/privacy.js +21 -25
- package/core/query/assoc_query.d.ts +3 -2
- package/core/query/assoc_query.js +9 -1
- package/core/query/custom_clause_query.d.ts +27 -0
- package/core/query/custom_clause_query.js +88 -0
- package/core/query/custom_query.d.ts +17 -2
- package/core/query/custom_query.js +88 -13
- package/core/query/index.d.ts +1 -0
- package/core/query/index.js +3 -1
- package/core/query/query.d.ts +15 -3
- package/core/query/query.js +128 -53
- package/core/query/shared_assoc_test.d.ts +2 -1
- package/core/query/shared_assoc_test.js +44 -54
- package/core/query/shared_test.d.ts +8 -1
- package/core/query/shared_test.js +532 -236
- package/core/viewer.d.ts +2 -0
- package/core/viewer.js +3 -1
- package/graphql/graphql.d.ts +52 -19
- package/graphql/graphql.js +174 -136
- package/graphql/graphql_field_helpers.d.ts +7 -1
- package/graphql/graphql_field_helpers.js +21 -1
- package/graphql/index.d.ts +2 -2
- package/graphql/index.js +3 -5
- package/graphql/query/connection_type.d.ts +9 -9
- package/graphql/query/shared_assoc_test.js +1 -1
- package/graphql/query/shared_edge_connection.js +1 -19
- package/graphql/scalars/orderby_direction.d.ts +2 -0
- package/graphql/scalars/orderby_direction.js +15 -0
- package/imports/dataz/example1/_auth.js +128 -47
- package/imports/dataz/example1/_viewer.js +87 -39
- package/imports/index.d.ts +7 -2
- package/imports/index.js +20 -5
- package/index.d.ts +18 -5
- package/index.js +30 -10
- package/package.json +18 -17
- package/parse_schema/parse.d.ts +31 -9
- package/parse_schema/parse.js +179 -32
- package/schema/base_schema.d.ts +13 -3
- package/schema/base_schema.js +13 -0
- package/schema/field.d.ts +78 -21
- package/schema/field.js +231 -71
- package/schema/index.d.ts +2 -2
- package/schema/index.js +7 -2
- package/schema/json_field.d.ts +16 -4
- package/schema/json_field.js +32 -2
- package/schema/schema.d.ts +109 -20
- package/schema/schema.js +42 -53
- package/schema/struct_field.d.ts +15 -3
- package/schema/struct_field.js +117 -22
- package/schema/union_field.d.ts +1 -1
- package/scripts/custom_compiler.js +12 -8
- package/scripts/custom_graphql.js +145 -34
- package/scripts/migrate_v0.1.js +36 -0
- package/scripts/move_types.js +120 -0
- package/scripts/read_schema.js +22 -7
- package/testutils/action/complex_schemas.d.ts +69 -0
- package/testutils/action/complex_schemas.js +405 -0
- package/testutils/builder.d.ts +39 -43
- package/testutils/builder.js +75 -49
- package/testutils/db/fixture.d.ts +10 -0
- package/testutils/db/fixture.js +26 -0
- package/testutils/db/{test_db.d.ts → temp_db.d.ts} +32 -8
- package/testutils/db/{test_db.js → temp_db.js} +244 -48
- package/testutils/db/value.d.ts +7 -0
- package/testutils/db/value.js +251 -0
- package/testutils/db_mock.d.ts +16 -4
- package/testutils/db_mock.js +52 -9
- package/testutils/db_time_zone.d.ts +4 -0
- package/testutils/db_time_zone.js +41 -0
- package/testutils/ent-graphql-tests/index.d.ts +7 -1
- package/testutils/ent-graphql-tests/index.js +56 -26
- package/testutils/fake_comms.js +1 -1
- package/testutils/fake_data/const.d.ts +2 -1
- package/testutils/fake_data/const.js +3 -0
- package/testutils/fake_data/fake_contact.d.ts +7 -3
- package/testutils/fake_data/fake_contact.js +13 -7
- package/testutils/fake_data/fake_event.d.ts +4 -1
- package/testutils/fake_data/fake_event.js +7 -6
- package/testutils/fake_data/fake_tag.d.ts +36 -0
- package/testutils/fake_data/fake_tag.js +89 -0
- package/testutils/fake_data/fake_user.d.ts +8 -5
- package/testutils/fake_data/fake_user.js +16 -15
- package/testutils/fake_data/index.js +5 -1
- package/testutils/fake_data/internal.d.ts +2 -0
- package/testutils/fake_data/internal.js +7 -1
- package/testutils/fake_data/tag_query.d.ts +13 -0
- package/testutils/fake_data/tag_query.js +43 -0
- package/testutils/fake_data/test_helpers.d.ts +11 -4
- package/testutils/fake_data/test_helpers.js +29 -13
- package/testutils/fake_data/user_query.d.ts +11 -4
- package/testutils/fake_data/user_query.js +54 -22
- package/testutils/fake_log.js +1 -1
- package/testutils/parse_sql.d.ts +6 -0
- package/testutils/parse_sql.js +16 -2
- package/testutils/test_edge_global_schema.d.ts +15 -0
- package/testutils/test_edge_global_schema.js +62 -0
- package/testutils/write.d.ts +2 -2
- package/testutils/write.js +33 -7
- package/tsc/ast.d.ts +25 -2
- package/tsc/ast.js +141 -17
- package/tsc/compilerOptions.js +5 -1
- package/tsc/move_generated.d.ts +1 -0
- package/tsc/move_generated.js +164 -0
- package/tsc/transform.d.ts +22 -0
- package/tsc/transform.js +182 -0
- package/tsc/transform_action.d.ts +22 -0
- package/tsc/transform_action.js +183 -0
- package/tsc/transform_ent.d.ts +17 -0
- package/tsc/transform_ent.js +60 -0
- package/tsc/transform_schema.d.ts +27 -0
- package/{scripts → tsc}/transform_schema.js +146 -117
- package/graphql/enums.d.ts +0 -3
- package/graphql/enums.js +0 -25
- package/scripts/move_generated.js +0 -142
- package/scripts/transform_code.js +0 -113
- package/scripts/transform_schema.d.ts +0 -1
- /package/scripts/{move_generated.d.ts → migrate_v0.1.d.ts} +0 -0
- /package/scripts/{transform_code.d.ts → move_types.d.ts} +0 -0
package/core/privacy.js
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.AllowIfViewerHasIdentityPrivacyPolicy = exports.AllowIfViewerPrivacyPolicy = exports.AlwaysDenyPrivacyPolicy = exports.AlwaysAllowPrivacyPolicy = exports.applyPrivacyPolicyX = exports.applyPrivacyPolicy = exports.AllowIfSubPolicyAllowsRule = exports.DelayedResultRule = exports.AllowIfConditionAppliesRule = exports.DenyIfViewerOutboundEdgeDoesNotExistRule = exports.DenyIfViewerInboundEdgeDoesNotExistRule = exports.DenyIfEdgeDoesNotExistRule = exports.DenyIfViewerOutboundEdgeExistsRule = exports.DenyIfViewerInboundEdgeExistsRule = exports.DenyIfEdgeExistsRule = exports.AllowIfViewerOutboundEdgeExistsRule = exports.AllowIfViewerInboundEdgeExistsRule = exports.AllowIfEdgeExistsRule = exports.DenyIfEntIsNotVisibleRule = exports.DenyIfEntIsVisibleRule = exports.DenyIfEntIsVisiblePolicy = exports.AllowIfEntIsVisiblePolicy = exports.AllowIfEntIsNotVisibleRule = exports.AllowIfEntIsVisibleRule = exports.DenyIfEntPropertyIsRule = exports.AllowIfEntPropertyIsRule = exports.AllowIfViewerIsEntPropertyRule = exports.AllowIfViewerIsRule = exports.DenyIfFuncRule = exports.AllowIfFuncRule = exports.DenyIfViewerEqualsRule = exports.AllowIfViewerEqualsRule = exports.AllowIfViewerRule = exports.AllowIfHasIdentity = exports.DenyIfLoggedInRule = exports.DenyIfLoggedOutRule = exports.AlwaysDenyRule = exports.AlwaysAllowRule = exports.EntPrivacyError = void 0;
|
|
3
|
+
exports.AllowIfViewerHasIdentityPrivacyPolicy = exports.AllowIfViewerPrivacyPolicy = exports.AlwaysDenyPrivacyPolicy = exports.AlwaysAllowPrivacyPolicy = exports.applyPrivacyPolicyImpl = exports.applyPrivacyPolicyX = exports.applyPrivacyPolicy = exports.AllowIfSubPolicyAllowsRule = exports.DelayedResultRule = exports.AllowIfConditionAppliesRule = exports.DenyIfViewerOutboundEdgeDoesNotExistRule = exports.DenyIfViewerInboundEdgeDoesNotExistRule = exports.DenyIfEdgeDoesNotExistRule = exports.DenyIfViewerOutboundEdgeExistsRule = exports.DenyIfViewerInboundEdgeExistsRule = exports.DenyIfEdgeExistsRule = exports.AllowIfViewerOutboundEdgeExistsRule = exports.AllowIfViewerInboundEdgeExistsRule = exports.AllowIfEdgeExistsRule = exports.DenyIfEntIsNotVisibleRule = exports.DenyIfEntIsVisibleRule = exports.DenyIfEntIsVisiblePolicy = exports.AllowIfEntIsVisiblePolicy = exports.AllowIfEntIsNotVisibleRule = exports.AllowIfEntIsVisibleRule = exports.DenyIfEntPropertyIsRule = exports.AllowIfEntPropertyIsRule = exports.AllowIfViewerIsEntPropertyRule = exports.AllowIfViewerIsRule = exports.DenyIfFuncRule = exports.AllowIfFuncRule = exports.DenyIfViewerEqualsRule = exports.AllowIfViewerEqualsRule = exports.AllowIfViewerRule = exports.AllowIfHasIdentity = exports.DenyIfLoggedInRule = exports.DenyIfLoggedOutRule = exports.AlwaysDenyRule = exports.AlwaysAllowRule = exports.EntPrivacyError = void 0;
|
|
4
4
|
const base_1 = require("./base");
|
|
5
5
|
const ent_1 = require("./ent");
|
|
6
|
-
const logger_1 = require("./logger");
|
|
7
6
|
// copied from ./base
|
|
8
7
|
var privacyResult;
|
|
9
8
|
(function (privacyResult) {
|
|
@@ -437,45 +436,42 @@ class AllowIfSubPolicyAllowsRule {
|
|
|
437
436
|
}
|
|
438
437
|
exports.AllowIfSubPolicyAllowsRule = AllowIfSubPolicyAllowsRule;
|
|
439
438
|
async function applyPrivacyPolicy(v, policy, ent) {
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
}
|
|
443
|
-
catch (e) {
|
|
444
|
-
// TODO privacy errors should not throw
|
|
445
|
-
// but other expected errors should throw...
|
|
446
|
-
// we shouldn't just hide them
|
|
447
|
-
(0, logger_1.log)("debug", e);
|
|
448
|
-
return false;
|
|
449
|
-
}
|
|
439
|
+
const err = await applyPrivacyPolicyImpl(v, policy, ent);
|
|
440
|
+
return err === null;
|
|
450
441
|
}
|
|
451
442
|
exports.applyPrivacyPolicy = applyPrivacyPolicy;
|
|
452
|
-
// this will throw an exception if fails or return error | null?
|
|
453
443
|
async function applyPrivacyPolicyX(v, policy, ent, throwErr) {
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
444
|
+
const err = await applyPrivacyPolicyImpl(v, policy, ent, throwErr);
|
|
445
|
+
if (err !== null) {
|
|
446
|
+
throw err;
|
|
447
|
+
}
|
|
448
|
+
return true;
|
|
449
|
+
}
|
|
450
|
+
exports.applyPrivacyPolicyX = applyPrivacyPolicyX;
|
|
451
|
+
// this will throw an exception if fails or return error | null?
|
|
452
|
+
async function applyPrivacyPolicyImpl(v, policy, ent, throwErr) {
|
|
453
|
+
for (const rule of policy.rules) {
|
|
454
|
+
const res = await rule.apply(v, ent);
|
|
459
455
|
if (res.result == privacyResult.Allow) {
|
|
460
|
-
return
|
|
456
|
+
return null;
|
|
461
457
|
}
|
|
462
458
|
else if (res.result == privacyResult.Deny) {
|
|
463
459
|
// specific error throw that
|
|
464
460
|
if (res.error) {
|
|
465
|
-
|
|
461
|
+
return res.error;
|
|
466
462
|
}
|
|
467
463
|
if (res.getError) {
|
|
468
|
-
|
|
464
|
+
return res.getError(policy, rule, ent);
|
|
469
465
|
}
|
|
470
466
|
if (throwErr) {
|
|
471
|
-
|
|
467
|
+
return throwErr();
|
|
472
468
|
}
|
|
473
|
-
|
|
469
|
+
return new EntPrivacyError(policy, rule, ent);
|
|
474
470
|
}
|
|
475
471
|
}
|
|
476
|
-
|
|
472
|
+
return new EntInvalidPrivacyPolicyError(policy, ent);
|
|
477
473
|
}
|
|
478
|
-
exports.
|
|
474
|
+
exports.applyPrivacyPolicyImpl = applyPrivacyPolicyImpl;
|
|
479
475
|
exports.AlwaysAllowPrivacyPolicy = {
|
|
480
476
|
rules: [exports.AlwaysAllowRule],
|
|
481
477
|
};
|
|
@@ -3,8 +3,8 @@ import { AssocEdge } from "../ent";
|
|
|
3
3
|
import { AssocEdgeCountLoaderFactory } from "../loaders/assoc_count_loader";
|
|
4
4
|
import { AssocEdgeLoaderFactory } from "../loaders/assoc_edge_loader";
|
|
5
5
|
import { EdgeQuery, BaseEdgeQuery, IDInfo } from "./query";
|
|
6
|
-
export
|
|
7
|
-
|
|
6
|
+
export type EdgeQuerySource<TSource extends Ent<TViewer>, TDest extends Ent<TViewer> = Ent<any>, TViewer extends Viewer = Viewer> = TSource | TSource[] | ID | ID[] | EdgeQuery<TDest, Ent, AssocEdge>;
|
|
7
|
+
type loaderOptionsFunc<TViewer extends Viewer> = (type: string) => LoadEntOptions<Ent, TViewer>;
|
|
8
8
|
export declare abstract class AssocEdgeQueryBase<TSource extends Ent<TViewer>, TDest extends Ent<TViewer>, TEdge extends AssocEdge, TViewer extends Viewer = Viewer> extends BaseEdgeQuery<TSource, TDest, TEdge> implements EdgeQuery<TSource, TDest, TEdge> {
|
|
9
9
|
viewer: TViewer;
|
|
10
10
|
src: EdgeQuerySource<TSource, TDest, TViewer>;
|
|
@@ -14,6 +14,7 @@ export declare abstract class AssocEdgeQueryBase<TSource extends Ent<TViewer>, T
|
|
|
14
14
|
constructor(viewer: TViewer, src: EdgeQuerySource<TSource, TDest, TViewer>, countLoaderFactory: AssocEdgeCountLoaderFactory, dataLoaderFactory: AssocEdgeLoaderFactory<TEdge>, options: LoadEntOptions<TDest, TViewer> | loaderOptionsFunc<TViewer>);
|
|
15
15
|
private isEdgeQuery;
|
|
16
16
|
abstract sourceEnt(id: ID): Promise<Ent | null>;
|
|
17
|
+
getTableName(): Promise<string>;
|
|
17
18
|
private getSingleID;
|
|
18
19
|
queryRawCount(): Promise<number>;
|
|
19
20
|
queryAllRawCount(): Promise<Map<ID, number>>;
|
|
@@ -3,12 +3,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.AssocEdgeQueryBase = void 0;
|
|
4
4
|
const ent_1 = require("../ent");
|
|
5
5
|
const query_1 = require("./query");
|
|
6
|
+
// would be nice to someday have an API for assoc asc
|
|
6
7
|
class AssocEdgeQueryBase extends query_1.BaseEdgeQuery {
|
|
7
8
|
constructor(viewer, src, countLoaderFactory, dataLoaderFactory,
|
|
8
9
|
// if function, it's a polymorphic edge and need to provide
|
|
9
10
|
// a function that goes from edgeType to LoadEntOptions
|
|
10
11
|
options) {
|
|
11
|
-
super(viewer, "time");
|
|
12
|
+
super(viewer, "time", "id2");
|
|
12
13
|
this.viewer = viewer;
|
|
13
14
|
this.src = src;
|
|
14
15
|
this.countLoaderFactory = countLoaderFactory;
|
|
@@ -21,6 +22,13 @@ class AssocEdgeQueryBase extends query_1.BaseEdgeQuery {
|
|
|
21
22
|
}
|
|
22
23
|
return false;
|
|
23
24
|
}
|
|
25
|
+
async getTableName() {
|
|
26
|
+
const edgeData = await (0, ent_1.loadEdgeData)(this.countLoaderFactory.getEdgeType());
|
|
27
|
+
if (!edgeData) {
|
|
28
|
+
throw new Error(`couldn't load edgeData`);
|
|
29
|
+
}
|
|
30
|
+
return edgeData.edgeTable;
|
|
31
|
+
}
|
|
24
32
|
async getSingleID() {
|
|
25
33
|
const infos = await this.genIDInfosToFetch();
|
|
26
34
|
if (infos.length !== 1) {
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Data, EdgeQueryableDataOptions, Ent, ID, LoadEntOptions, Viewer } from "../base";
|
|
2
|
+
import { Clause } from "../clause";
|
|
3
|
+
import { BaseEdgeQuery, IDInfo } from "./query";
|
|
4
|
+
export interface CustomClauseQueryOptions<TDest extends Ent<TViewer>, TViewer extends Viewer = Viewer> {
|
|
5
|
+
loadEntOptions: LoadEntOptions<TDest, TViewer>;
|
|
6
|
+
clause: Clause;
|
|
7
|
+
name: string;
|
|
8
|
+
sortColumn?: string;
|
|
9
|
+
sortColumnUnique?: boolean;
|
|
10
|
+
orderByDirection?: "asc" | "desc";
|
|
11
|
+
nullsPlacement?: "first" | "last";
|
|
12
|
+
disableTransformations?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare class CustomClauseQuery<TDest extends Ent<TViewer>, TViewer extends Viewer = Viewer> extends BaseEdgeQuery<any, TDest, Data> {
|
|
15
|
+
viewer: TViewer;
|
|
16
|
+
private options;
|
|
17
|
+
private clause;
|
|
18
|
+
constructor(viewer: TViewer, options: CustomClauseQueryOptions<TDest, TViewer>);
|
|
19
|
+
sourceEnt(_id: ID): Promise<null>;
|
|
20
|
+
getTableName(): string;
|
|
21
|
+
queryRawCount(): Promise<number>;
|
|
22
|
+
queryAllRawCount(): Promise<Map<ID, number>>;
|
|
23
|
+
protected loadRawIDs(_addID: (src: ID) => void): Promise<void>;
|
|
24
|
+
protected loadRawData(_infos: IDInfo[], options: EdgeQueryableDataOptions): Promise<void>;
|
|
25
|
+
dataToID(edge: Data): ID;
|
|
26
|
+
protected loadEntsFromEdges(id: ID, rows: Data[]): Promise<TDest[]>;
|
|
27
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CustomClauseQuery = void 0;
|
|
4
|
+
const clause_1 = require("../clause");
|
|
5
|
+
const ent_1 = require("../ent");
|
|
6
|
+
const query_loader_1 = require("../loaders/query_loader");
|
|
7
|
+
const query_1 = require("./query");
|
|
8
|
+
function getClause(opts) {
|
|
9
|
+
let cls = opts.clause;
|
|
10
|
+
if (opts.disableTransformations) {
|
|
11
|
+
return cls;
|
|
12
|
+
}
|
|
13
|
+
let optClause = opts.loadEntOptions.loaderFactory?.options?.clause;
|
|
14
|
+
if (typeof optClause === "function") {
|
|
15
|
+
optClause = optClause();
|
|
16
|
+
}
|
|
17
|
+
if (!optClause) {
|
|
18
|
+
return cls;
|
|
19
|
+
}
|
|
20
|
+
return (0, clause_1.AndOptional)(cls, optClause);
|
|
21
|
+
}
|
|
22
|
+
class CustomClauseQuery extends query_1.BaseEdgeQuery {
|
|
23
|
+
constructor(viewer, options) {
|
|
24
|
+
let sortCol = options.sortColumn || "id";
|
|
25
|
+
let unique = options.sortColumnUnique
|
|
26
|
+
? sortCol
|
|
27
|
+
: options.loadEntOptions.loaderFactory.options?.key || "id";
|
|
28
|
+
// pass direction to base class since it uses it
|
|
29
|
+
// this API needs to be cleaned up...
|
|
30
|
+
if (options.orderByDirection) {
|
|
31
|
+
sortCol = `${sortCol} ${options.orderByDirection}`;
|
|
32
|
+
}
|
|
33
|
+
super(viewer, {
|
|
34
|
+
sortCol,
|
|
35
|
+
cursorCol: unique,
|
|
36
|
+
nullsPlacement: options.nullsPlacement,
|
|
37
|
+
});
|
|
38
|
+
this.viewer = viewer;
|
|
39
|
+
this.options = options;
|
|
40
|
+
this.clause = getClause(options);
|
|
41
|
+
}
|
|
42
|
+
async sourceEnt(_id) {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
getTableName() {
|
|
46
|
+
return this.options.loadEntOptions.tableName;
|
|
47
|
+
}
|
|
48
|
+
async queryRawCount() {
|
|
49
|
+
const row = await (0, ent_1.loadRow)({
|
|
50
|
+
tableName: this.options.loadEntOptions.tableName,
|
|
51
|
+
// sqlite needs as count otherwise it returns count(1)
|
|
52
|
+
fields: ["count(1) as count"],
|
|
53
|
+
clause: this.clause,
|
|
54
|
+
context: this.viewer.context,
|
|
55
|
+
});
|
|
56
|
+
return parseInt(row?.count, 10) || 0;
|
|
57
|
+
}
|
|
58
|
+
async queryAllRawCount() {
|
|
59
|
+
throw new Error(`queryAllRawCount doesn't make sense in CustomClauseQuery`);
|
|
60
|
+
}
|
|
61
|
+
// nothing to do here
|
|
62
|
+
async loadRawIDs(_addID) { }
|
|
63
|
+
async loadRawData(_infos, options) {
|
|
64
|
+
if (!options.orderby) {
|
|
65
|
+
const direction = this.options.orderByDirection ?? "desc";
|
|
66
|
+
options.orderby = `${this.options.sortColumn} ${direction}`;
|
|
67
|
+
}
|
|
68
|
+
if (!options.limit) {
|
|
69
|
+
options.limit = (0, ent_1.getDefaultLimit)();
|
|
70
|
+
}
|
|
71
|
+
const rows = await (0, ent_1.loadRows)({
|
|
72
|
+
tableName: this.options.loadEntOptions.tableName,
|
|
73
|
+
fields: this.options.loadEntOptions.fields,
|
|
74
|
+
clause: (0, clause_1.AndOptional)(this.clause, options.clause),
|
|
75
|
+
orderby: (0, query_loader_1.getOrderBy)(this.getSortCol(), options?.orderby),
|
|
76
|
+
limit: options?.limit || (0, ent_1.getDefaultLimit)(),
|
|
77
|
+
context: this.viewer.context,
|
|
78
|
+
});
|
|
79
|
+
this.edges.set(1, rows);
|
|
80
|
+
}
|
|
81
|
+
dataToID(edge) {
|
|
82
|
+
return edge.id;
|
|
83
|
+
}
|
|
84
|
+
async loadEntsFromEdges(id, rows) {
|
|
85
|
+
return (0, ent_1.applyPrivacyPolicyForRows)(this.viewer, rows, this.options.loadEntOptions);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
exports.CustomClauseQuery = CustomClauseQuery;
|
|
@@ -1,19 +1,34 @@
|
|
|
1
1
|
import { Data, Ent, ID, EdgeQueryableDataOptions, LoadEntOptions, Viewer, LoaderFactory, ConfigurableLoaderFactory } from "../base";
|
|
2
|
+
import { Clause } from "../clause";
|
|
2
3
|
import { BaseEdgeQuery, IDInfo, EdgeQuery } from "./query";
|
|
3
|
-
export interface
|
|
4
|
+
export interface CustomEdgeQueryOptionsDeprecated<TSource extends Ent<TViewer>, TDest extends Ent<TViewer>, TViewer extends Viewer = Viewer> {
|
|
4
5
|
src: TSource | ID;
|
|
5
6
|
countLoaderFactory: LoaderFactory<ID, number>;
|
|
6
7
|
dataLoaderFactory: ConfigurableLoaderFactory<ID, Data[]>;
|
|
7
8
|
options: LoadEntOptions<TDest, TViewer>;
|
|
8
9
|
sortColumn?: string;
|
|
9
10
|
}
|
|
11
|
+
export interface CustomEdgeQueryOptions<TSource extends Ent<TViewer>, TDest extends Ent<TViewer>, TViewer extends Viewer = Viewer> {
|
|
12
|
+
src: TSource | ID;
|
|
13
|
+
loadEntOptions: LoadEntOptions<TDest, TViewer>;
|
|
14
|
+
groupCol?: string;
|
|
15
|
+
clause?: Clause;
|
|
16
|
+
name: string;
|
|
17
|
+
sortColumn?: string;
|
|
18
|
+
sortColumnUnique?: boolean;
|
|
19
|
+
disableTransformations?: boolean;
|
|
20
|
+
}
|
|
10
21
|
export declare abstract class CustomEdgeQueryBase<TSource extends Ent<TViewer>, TDest extends Ent<TViewer>, TViewer extends Viewer = Viewer> extends BaseEdgeQuery<TSource, TDest, Data> implements EdgeQuery<TSource, TDest, Data> {
|
|
11
22
|
viewer: TViewer;
|
|
12
23
|
private options;
|
|
13
24
|
private id;
|
|
14
|
-
|
|
25
|
+
private opts;
|
|
26
|
+
constructor(viewer: TViewer, options: CustomEdgeQueryOptionsDeprecated<TSource, TDest, TViewer> | CustomEdgeQueryOptions<TSource, TDest, TViewer>);
|
|
27
|
+
getTableName(): string;
|
|
15
28
|
abstract sourceEnt(id: ID): Promise<Ent | null>;
|
|
16
29
|
private idVisible;
|
|
30
|
+
private getCountLoader;
|
|
31
|
+
private getQueryLoader;
|
|
17
32
|
queryRawCount(): Promise<number>;
|
|
18
33
|
queryAllRawCount(): Promise<Map<ID, number>>;
|
|
19
34
|
protected loadRawIDs(addID: (src: ID | TSource) => void): Promise<void>;
|
|
@@ -1,20 +1,86 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.CustomEdgeQueryBase = void 0;
|
|
4
|
+
const clause_1 = require("../clause");
|
|
4
5
|
const ent_1 = require("../ent");
|
|
6
|
+
const loaders_1 = require("../loaders");
|
|
5
7
|
const query_1 = require("./query");
|
|
8
|
+
function getClause(opts) {
|
|
9
|
+
let cls = opts.clause;
|
|
10
|
+
if (opts.disableTransformations) {
|
|
11
|
+
return cls;
|
|
12
|
+
}
|
|
13
|
+
let optClause = opts.loadEntOptions.loaderFactory?.options?.clause;
|
|
14
|
+
if (typeof optClause === "function") {
|
|
15
|
+
optClause = optClause();
|
|
16
|
+
}
|
|
17
|
+
if (!optClause) {
|
|
18
|
+
return cls;
|
|
19
|
+
}
|
|
20
|
+
return (0, clause_1.AndOptional)(cls, optClause);
|
|
21
|
+
}
|
|
22
|
+
function getRawCountLoader(viewer, opts) {
|
|
23
|
+
if (!viewer.context?.cache) {
|
|
24
|
+
return new loaders_1.RawCountLoader({
|
|
25
|
+
tableName: opts.loadEntOptions.tableName,
|
|
26
|
+
groupCol: opts.groupCol,
|
|
27
|
+
clause: getClause(opts),
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
const name = `custom_query_count_loader:${opts.name}`;
|
|
31
|
+
return viewer.context.cache.getLoader(name, () => new loaders_1.RawCountLoader({
|
|
32
|
+
tableName: opts.loadEntOptions.tableName,
|
|
33
|
+
groupCol: opts.groupCol,
|
|
34
|
+
clause: getClause(opts),
|
|
35
|
+
}));
|
|
36
|
+
}
|
|
37
|
+
function getQueryLoader(viewer, opts, options) {
|
|
38
|
+
const loader = opts.loadEntOptions.loaderFactory;
|
|
39
|
+
const name = `custom_query_loader:${opts.name}`;
|
|
40
|
+
return loaders_1.QueryLoaderFactory.createConfigurableLoader(name, {
|
|
41
|
+
tableName: opts.loadEntOptions.tableName,
|
|
42
|
+
fields: opts.loadEntOptions.fields,
|
|
43
|
+
groupCol: opts.groupCol,
|
|
44
|
+
clause: getClause(opts),
|
|
45
|
+
toPrime: [loader],
|
|
46
|
+
}, options, viewer.context);
|
|
47
|
+
}
|
|
48
|
+
function isDeprecatedOptions(options) {
|
|
49
|
+
return (options
|
|
50
|
+
.countLoaderFactory !== undefined);
|
|
51
|
+
}
|
|
6
52
|
class CustomEdgeQueryBase extends query_1.BaseEdgeQuery {
|
|
7
53
|
constructor(viewer, options) {
|
|
8
|
-
|
|
54
|
+
let opts;
|
|
55
|
+
let defaultSort = "id";
|
|
56
|
+
let uniqueColIsSort = false;
|
|
57
|
+
if (isDeprecatedOptions(options)) {
|
|
58
|
+
opts = options.options;
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
opts = options.loadEntOptions;
|
|
62
|
+
if (options.sortColumnUnique) {
|
|
63
|
+
uniqueColIsSort = true;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
let uniqueCol = opts.loaderFactory.options?.key || "id";
|
|
67
|
+
if (uniqueColIsSort) {
|
|
68
|
+
uniqueCol = options.sortColumn || defaultSort;
|
|
69
|
+
}
|
|
70
|
+
options.sortColumn = options.sortColumn || defaultSort;
|
|
71
|
+
super(viewer, options.sortColumn, uniqueCol);
|
|
9
72
|
this.viewer = viewer;
|
|
10
73
|
this.options = options;
|
|
11
|
-
options.sortColumn = options.sortColumn || "created_at";
|
|
12
74
|
if (typeof options.src === "object") {
|
|
13
75
|
this.id = options.src.id;
|
|
14
76
|
}
|
|
15
77
|
else {
|
|
16
78
|
this.id = options.src;
|
|
17
79
|
}
|
|
80
|
+
this.opts = opts;
|
|
81
|
+
}
|
|
82
|
+
getTableName() {
|
|
83
|
+
return this.opts.tableName;
|
|
18
84
|
}
|
|
19
85
|
async idVisible() {
|
|
20
86
|
const ids = await this.genIDInfosToFetch();
|
|
@@ -23,14 +89,24 @@ class CustomEdgeQueryBase extends query_1.BaseEdgeQuery {
|
|
|
23
89
|
}
|
|
24
90
|
return !ids[0].invalidated;
|
|
25
91
|
}
|
|
92
|
+
getCountLoader() {
|
|
93
|
+
if (isDeprecatedOptions(this.options)) {
|
|
94
|
+
return this.options.countLoaderFactory.createLoader(this.viewer.context);
|
|
95
|
+
}
|
|
96
|
+
return getRawCountLoader(this.viewer, this.options);
|
|
97
|
+
}
|
|
98
|
+
getQueryLoader(options) {
|
|
99
|
+
if (isDeprecatedOptions(this.options)) {
|
|
100
|
+
return this.options.dataLoaderFactory.createConfigurableLoader(options, this.viewer.context);
|
|
101
|
+
}
|
|
102
|
+
return getQueryLoader(this.viewer, this.options, options);
|
|
103
|
+
}
|
|
26
104
|
async queryRawCount() {
|
|
27
105
|
const idVisible = await this.idVisible();
|
|
28
106
|
if (!idVisible) {
|
|
29
107
|
return 0;
|
|
30
108
|
}
|
|
31
|
-
return
|
|
32
|
-
.createLoader(this.viewer.context)
|
|
33
|
-
.load(this.id);
|
|
109
|
+
return this.getCountLoader().load(this.id);
|
|
34
110
|
}
|
|
35
111
|
async queryAllRawCount() {
|
|
36
112
|
let count = 0;
|
|
@@ -44,16 +120,16 @@ class CustomEdgeQueryBase extends query_1.BaseEdgeQuery {
|
|
|
44
120
|
addID(this.options.src);
|
|
45
121
|
}
|
|
46
122
|
async loadRawData(infos, options) {
|
|
47
|
-
|
|
123
|
+
if (infos.length !== 1) {
|
|
124
|
+
throw new Error(`expected 1 info passed to loadRawData. ${infos.length} passed`);
|
|
125
|
+
}
|
|
48
126
|
if (!options.orderby) {
|
|
49
|
-
options.orderby = `${this.
|
|
127
|
+
options.orderby = `${this.getSortCol()} DESC`;
|
|
50
128
|
}
|
|
51
129
|
if (!options.limit) {
|
|
52
|
-
options.limit = ent_1.
|
|
53
|
-
}
|
|
54
|
-
if (infos.length !== 1) {
|
|
55
|
-
throw new Error(`expected 1 info passed to loadRawData. ${infos.length} passed`);
|
|
130
|
+
options.limit = (0, ent_1.getDefaultLimit)();
|
|
56
131
|
}
|
|
132
|
+
const loader = this.getQueryLoader(options);
|
|
57
133
|
const info = infos[0];
|
|
58
134
|
if (info.invalidated) {
|
|
59
135
|
this.edges.set(this.id, []);
|
|
@@ -66,8 +142,7 @@ class CustomEdgeQueryBase extends query_1.BaseEdgeQuery {
|
|
|
66
142
|
return edge.id;
|
|
67
143
|
}
|
|
68
144
|
async loadEntsFromEdges(id, rows) {
|
|
69
|
-
|
|
70
|
-
return Array.from(ents.values());
|
|
145
|
+
return (0, ent_1.applyPrivacyPolicyForRows)(this.viewer, rows, this.opts);
|
|
71
146
|
}
|
|
72
147
|
}
|
|
73
148
|
exports.CustomEdgeQueryBase = CustomEdgeQueryBase;
|
package/core/query/index.d.ts
CHANGED
package/core/query/index.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.CustomEdgeQueryBase = exports.AssocEdgeQueryBase = exports.BaseEdgeQuery = void 0;
|
|
3
|
+
exports.CustomClauseQuery = exports.CustomEdgeQueryBase = exports.AssocEdgeQueryBase = exports.BaseEdgeQuery = void 0;
|
|
4
4
|
var query_1 = require("./query");
|
|
5
5
|
Object.defineProperty(exports, "BaseEdgeQuery", { enumerable: true, get: function () { return query_1.BaseEdgeQuery; } });
|
|
6
6
|
var assoc_query_1 = require("./assoc_query");
|
|
7
7
|
Object.defineProperty(exports, "AssocEdgeQueryBase", { enumerable: true, get: function () { return assoc_query_1.AssocEdgeQueryBase; } });
|
|
8
8
|
var custom_query_1 = require("./custom_query");
|
|
9
9
|
Object.defineProperty(exports, "CustomEdgeQueryBase", { enumerable: true, get: function () { return custom_query_1.CustomEdgeQueryBase; } });
|
|
10
|
+
var custom_clause_query_1 = require("./custom_clause_query");
|
|
11
|
+
Object.defineProperty(exports, "CustomClauseQuery", { enumerable: true, get: function () { return custom_clause_query_1.CustomClauseQuery; } });
|
package/core/query/query.d.ts
CHANGED
|
@@ -20,7 +20,7 @@ export interface EdgeQuery<TSource extends Ent, TDest extends Ent, TEdge extends
|
|
|
20
20
|
}
|
|
21
21
|
export interface EdgeQueryFilter<T extends Data> {
|
|
22
22
|
filter?(id: ID, edges: T[]): T[];
|
|
23
|
-
query?(options: EdgeQueryableDataOptions): EdgeQueryableDataOptions
|
|
23
|
+
query?(options: EdgeQueryableDataOptions): EdgeQueryableDataOptions | Promise<EdgeQueryableDataOptions>;
|
|
24
24
|
paginationInfo?(id: ID): PaginationInfo | undefined;
|
|
25
25
|
}
|
|
26
26
|
export interface PaginationInfo {
|
|
@@ -29,9 +29,13 @@ export interface PaginationInfo {
|
|
|
29
29
|
startCursor: string;
|
|
30
30
|
endCursor: string;
|
|
31
31
|
}
|
|
32
|
+
interface EdgeQueryOptions {
|
|
33
|
+
cursorCol: string;
|
|
34
|
+
sortCol: string;
|
|
35
|
+
nullsPlacement?: "first" | "last";
|
|
36
|
+
}
|
|
32
37
|
export declare abstract class BaseEdgeQuery<TSource extends Ent, TDest extends Ent, TEdge extends Data> implements EdgeQuery<TSource, TDest, TEdge> {
|
|
33
38
|
viewer: Viewer;
|
|
34
|
-
private sortCol;
|
|
35
39
|
private filters;
|
|
36
40
|
private queryDispatched;
|
|
37
41
|
protected edges: Map<ID, TEdge[]>;
|
|
@@ -40,7 +44,13 @@ export declare abstract class BaseEdgeQuery<TSource extends Ent, TDest extends E
|
|
|
40
44
|
protected genIDInfosToFetch: () => Promise<IDInfo[]>;
|
|
41
45
|
private idMap;
|
|
42
46
|
private idsToFetch;
|
|
43
|
-
|
|
47
|
+
private sortCol;
|
|
48
|
+
private cursorCol;
|
|
49
|
+
private defaultDirection?;
|
|
50
|
+
private edgeQueryOptions;
|
|
51
|
+
constructor(viewer: Viewer, sortCol: string, cursorCol: string);
|
|
52
|
+
constructor(viewer: Viewer, options: EdgeQueryOptions);
|
|
53
|
+
protected getSortCol(): string;
|
|
44
54
|
getPrivacyPolicy(): PrivacyPolicy<Ent<Viewer<Ent<any> | null, ID | null>>, Viewer<Ent<any> | null, ID | null>>;
|
|
45
55
|
abstract sourceEnt(id: ID): Promise<Ent | null>;
|
|
46
56
|
first(n: number, after?: string): this;
|
|
@@ -64,6 +74,7 @@ export declare abstract class BaseEdgeQuery<TSource extends Ent, TDest extends E
|
|
|
64
74
|
protected abstract loadRawIDs(addID: (src: ID | TSource) => void): Promise<void>;
|
|
65
75
|
protected abstract loadRawData(infos: IDInfo[], options: EdgeQueryableDataOptions): Promise<void>;
|
|
66
76
|
private addID;
|
|
77
|
+
abstract getTableName(): string | Promise<string>;
|
|
67
78
|
protected genIDInfosToFetchImpl(): Promise<IDInfo[]>;
|
|
68
79
|
private loadEdges;
|
|
69
80
|
getCursor(row: TEdge): string;
|
|
@@ -72,3 +83,4 @@ export interface IDInfo {
|
|
|
72
83
|
id: ID;
|
|
73
84
|
invalidated?: boolean;
|
|
74
85
|
}
|
|
86
|
+
export {};
|