@snowtop/ent 0.0.23 → 0.0.28-alpha.2
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/executor.d.ts +3 -3
- package/action/orchestrator.d.ts +9 -4
- package/action/orchestrator.js +66 -29
- package/core/base.js +12 -9
- package/core/config.d.ts +2 -0
- package/core/convert.js +2 -1
- package/core/privacy.d.ts +21 -1
- package/core/privacy.js +45 -1
- package/core/query/assoc_query.d.ts +10 -12
- package/core/query/assoc_query.js +52 -49
- package/core/query/custom_query.d.ts +10 -7
- package/core/query/custom_query.js +28 -2
- package/core/query/query.d.ts +19 -3
- package/core/query/query.js +39 -2
- package/core/query/shared_assoc_test.js +104 -0
- package/graphql/builtins/connection.js +1 -0
- package/graphql/builtins/edge.js +1 -0
- package/graphql/builtins/node.js +1 -0
- package/graphql/graphql.d.ts +2 -0
- package/graphql/graphql.js +83 -61
- package/graphql/query/page_info.js +1 -0
- package/imports/index.d.ts +1 -1
- package/imports/index.js +3 -5
- package/index.d.ts +1 -1
- package/index.js +5 -2
- package/package.json +2 -4
- package/schema/field.d.ts +28 -14
- package/schema/field.js +46 -6
- package/scripts/custom_graphql.js +47 -8
- package/testutils/builder.d.ts +1 -0
- package/testutils/builder.js +1 -0
- package/testutils/fake_data/events_query.d.ts +16 -11
- package/testutils/fake_data/events_query.js +15 -0
- package/testutils/fake_data/test_helpers.d.ts +5 -1
- package/testutils/fake_data/test_helpers.js +35 -1
- package/testutils/fake_data/user_query.d.ts +22 -10
- package/testutils/fake_data/user_query.js +37 -0
package/schema/field.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Field, FieldOptions, ForeignKey, PolymorphicOptions, Type } from "./schema";
|
|
2
2
|
export declare abstract class BaseField {
|
|
3
3
|
name: string;
|
|
4
4
|
nullable?: boolean;
|
|
@@ -21,10 +21,23 @@ export declare class UUIDField extends BaseField implements Field {
|
|
|
21
21
|
constructor(options: FieldOptions);
|
|
22
22
|
}
|
|
23
23
|
export declare function UUIDType(options: FieldOptions): UUIDField;
|
|
24
|
+
export interface IntegerOptions extends FieldOptions {
|
|
25
|
+
min?: number;
|
|
26
|
+
max?: number;
|
|
27
|
+
}
|
|
24
28
|
export declare class IntegerField extends BaseField implements Field {
|
|
25
29
|
type: Type;
|
|
30
|
+
private validators;
|
|
31
|
+
private options;
|
|
32
|
+
constructor(options?: IntegerOptions);
|
|
33
|
+
getOptions(): IntegerOptions;
|
|
34
|
+
private handleOptions;
|
|
35
|
+
min(l: number): this;
|
|
36
|
+
max(l: number): this;
|
|
37
|
+
valid(val: any): boolean;
|
|
38
|
+
validate(validator: (str: number) => boolean): this;
|
|
26
39
|
}
|
|
27
|
-
export declare function IntegerType(options:
|
|
40
|
+
export declare function IntegerType(options: IntegerOptions): IntegerField;
|
|
28
41
|
export declare class BigIntegerField extends BaseField implements Field {
|
|
29
42
|
type: Type;
|
|
30
43
|
}
|
|
@@ -53,23 +66,24 @@ export declare class StringField extends BaseField implements Field {
|
|
|
53
66
|
type: Type;
|
|
54
67
|
private validators;
|
|
55
68
|
private formatters;
|
|
69
|
+
private options;
|
|
56
70
|
constructor(options?: StringOptions);
|
|
57
71
|
getOptions(): StringOptions;
|
|
58
72
|
private handleOptions;
|
|
59
|
-
minLen(l: number):
|
|
60
|
-
maxLen(l: number):
|
|
61
|
-
length(l: number):
|
|
73
|
+
minLen(l: number): this;
|
|
74
|
+
maxLen(l: number): this;
|
|
75
|
+
length(l: number): this;
|
|
62
76
|
valid(val: any): boolean;
|
|
63
77
|
format(val: any): any;
|
|
64
|
-
validate(validator: (str: string) => boolean):
|
|
65
|
-
formatter(formatter: (str: string) => string):
|
|
66
|
-
match(pattern: string | RegExp):
|
|
67
|
-
doesNotMatch(pattern: string | RegExp):
|
|
68
|
-
toLowerCase():
|
|
69
|
-
toUpperCase():
|
|
70
|
-
trim():
|
|
71
|
-
trimLeft():
|
|
72
|
-
trimRight():
|
|
78
|
+
validate(validator: (str: string) => boolean): this;
|
|
79
|
+
formatter(formatter: (str: string) => string): this;
|
|
80
|
+
match(pattern: string | RegExp): this;
|
|
81
|
+
doesNotMatch(pattern: string | RegExp): this;
|
|
82
|
+
toLowerCase(): this;
|
|
83
|
+
toUpperCase(): this;
|
|
84
|
+
trim(): this;
|
|
85
|
+
trimLeft(): this;
|
|
86
|
+
trimRight(): this;
|
|
73
87
|
}
|
|
74
88
|
export declare function StringType(options: StringOptions): StringField;
|
|
75
89
|
export interface TimestampOptions extends FieldOptions {
|
package/schema/field.js
CHANGED
|
@@ -20,10 +20,10 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
20
20
|
};
|
|
21
21
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
22
|
exports.UUIDListType = exports.EnumListType = exports.DateListType = exports.TimetzListType = exports.TimeListType = exports.TimestamptzListType = exports.TimestampListType = exports.BooleanListType = exports.BigIntegerListType = exports.FloatListType = exports.IntegerListType = exports.IntListType = exports.StringListType = exports.ListField = exports.EnumType = exports.EnumField = exports.DateType = exports.DateField = exports.TimetzType = exports.TimeType = exports.TimeField = exports.leftPad = exports.TimestamptzType = exports.TimestampType = exports.TimestampField = exports.StringType = exports.StringField = exports.BooleanType = exports.BooleanField = exports.FloatType = exports.FloatField = exports.BigIntegerType = exports.BigIntegerField = exports.IntegerType = exports.IntegerField = exports.UUIDType = exports.UUIDField = exports.BaseField = void 0;
|
|
23
|
-
const schema_1 = require("./schema");
|
|
24
|
-
const snake_case_1 = require("snake-case");
|
|
25
23
|
const luxon_1 = require("luxon");
|
|
24
|
+
const snake_case_1 = require("snake-case");
|
|
26
25
|
const db_1 = __importStar(require("../core/db"));
|
|
26
|
+
const schema_1 = require("./schema");
|
|
27
27
|
class BaseField {
|
|
28
28
|
logValue(val) {
|
|
29
29
|
if (this.sensitive) {
|
|
@@ -89,14 +89,52 @@ function UUIDType(options) {
|
|
|
89
89
|
}
|
|
90
90
|
exports.UUIDType = UUIDType;
|
|
91
91
|
class IntegerField extends BaseField {
|
|
92
|
-
constructor() {
|
|
93
|
-
super(
|
|
92
|
+
constructor(options) {
|
|
93
|
+
super();
|
|
94
94
|
this.type = { dbType: schema_1.DBType.Int };
|
|
95
|
+
this.validators = [];
|
|
96
|
+
this.options = { name: "field" };
|
|
97
|
+
// for legacy callers
|
|
98
|
+
this.handleOptions(options || this.options);
|
|
99
|
+
}
|
|
100
|
+
getOptions() {
|
|
101
|
+
return this.options;
|
|
102
|
+
}
|
|
103
|
+
handleOptions(options) {
|
|
104
|
+
const params = {
|
|
105
|
+
min: this.min,
|
|
106
|
+
max: this.max,
|
|
107
|
+
};
|
|
108
|
+
for (const k in params) {
|
|
109
|
+
const v = options[k];
|
|
110
|
+
if (v !== undefined) {
|
|
111
|
+
params[k].apply(this, [v]);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
this.options = options;
|
|
115
|
+
}
|
|
116
|
+
min(l) {
|
|
117
|
+
return this.validate((val) => val >= l);
|
|
118
|
+
}
|
|
119
|
+
max(l) {
|
|
120
|
+
return this.validate((val) => val <= l);
|
|
121
|
+
}
|
|
122
|
+
valid(val) {
|
|
123
|
+
for (const validator of this.validators) {
|
|
124
|
+
if (!validator(val)) {
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
130
|
+
validate(validator) {
|
|
131
|
+
this.validators.push(validator);
|
|
132
|
+
return this;
|
|
95
133
|
}
|
|
96
134
|
}
|
|
97
135
|
exports.IntegerField = IntegerField;
|
|
98
136
|
function IntegerType(options) {
|
|
99
|
-
let result = new IntegerField();
|
|
137
|
+
let result = new IntegerField(options);
|
|
100
138
|
return Object.assign(result, options);
|
|
101
139
|
}
|
|
102
140
|
exports.IntegerType = IntegerType;
|
|
@@ -142,11 +180,12 @@ class StringField extends BaseField {
|
|
|
142
180
|
this.type = { dbType: schema_1.DBType.String };
|
|
143
181
|
this.validators = [];
|
|
144
182
|
this.formatters = [];
|
|
183
|
+
this.options = { name: "field" };
|
|
145
184
|
// for legacy callers
|
|
146
185
|
this.handleOptions(options || { name: "field" });
|
|
147
186
|
}
|
|
148
187
|
getOptions() {
|
|
149
|
-
return this.
|
|
188
|
+
return this.options;
|
|
150
189
|
}
|
|
151
190
|
handleOptions(options) {
|
|
152
191
|
const noParams = {
|
|
@@ -174,6 +213,7 @@ class StringField extends BaseField {
|
|
|
174
213
|
noParams[k].apply(this);
|
|
175
214
|
}
|
|
176
215
|
}
|
|
216
|
+
this.options = options;
|
|
177
217
|
}
|
|
178
218
|
minLen(l) {
|
|
179
219
|
return this.validate((val) => {
|
|
@@ -25,6 +25,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
26
|
const glob_1 = __importDefault(require("glob"));
|
|
27
27
|
const minimist_1 = __importDefault(require("minimist"));
|
|
28
|
+
const graphql_1 = require("../graphql/graphql");
|
|
28
29
|
const readline = __importStar(require("readline"));
|
|
29
30
|
const path = __importStar(require("path"));
|
|
30
31
|
const fs = __importStar(require("fs"));
|
|
@@ -52,7 +53,17 @@ async function readInputs() {
|
|
|
52
53
|
});
|
|
53
54
|
});
|
|
54
55
|
}
|
|
55
|
-
async function captureCustom(filePath) {
|
|
56
|
+
async function captureCustom(filePath, filesCsv) {
|
|
57
|
+
if (filesCsv !== undefined) {
|
|
58
|
+
let files = filesCsv.split(",");
|
|
59
|
+
for (let i = 0; i < files.length; i++) {
|
|
60
|
+
// TODO fix. we have "src" in the path we get here
|
|
61
|
+
files[i] = path.join(filePath, "..", files[i]);
|
|
62
|
+
}
|
|
63
|
+
await requireFiles(files);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
// TODO delete all of this eventually
|
|
56
67
|
// TODO configurable paths eventually
|
|
57
68
|
// for now only files that are in the include path of the roots are allowed
|
|
58
69
|
const rootFiles = [
|
|
@@ -81,18 +92,28 @@ async function captureCustom(filePath) {
|
|
|
81
92
|
ignore: ignore,
|
|
82
93
|
});
|
|
83
94
|
const files = rootFiles.concat(customGQLResolvers, customGQLMutations);
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
95
|
+
await requireFiles(files);
|
|
96
|
+
}
|
|
97
|
+
async function requireFiles(files) {
|
|
98
|
+
await Promise.all(files.map(async (file) => {
|
|
87
99
|
if (fs.existsSync(file)) {
|
|
88
|
-
|
|
100
|
+
try {
|
|
101
|
+
await require(file);
|
|
102
|
+
}
|
|
103
|
+
catch (e) {
|
|
104
|
+
throw new Error(`${e.message} loading ${file}`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
throw new Error(`file ${file} doesn't exist`);
|
|
89
109
|
}
|
|
110
|
+
})).catch((err) => {
|
|
111
|
+
throw new Error(err);
|
|
90
112
|
});
|
|
91
|
-
await Promise.all(promises);
|
|
92
113
|
}
|
|
93
114
|
async function parseImports(filePath) {
|
|
94
115
|
// only do graphql files...
|
|
95
|
-
return (0, imports_1.
|
|
116
|
+
return (0, imports_1.parseCustomImports)(path.join(filePath, "graphql"), {
|
|
96
117
|
ignore: ["**/generated/**", "**/tests/**"],
|
|
97
118
|
});
|
|
98
119
|
}
|
|
@@ -110,6 +131,24 @@ function findGraphQLPath(filePath) {
|
|
|
110
131
|
return undefined;
|
|
111
132
|
}
|
|
112
133
|
async function main() {
|
|
134
|
+
// known custom types that are not required
|
|
135
|
+
// scalar Time will successfully parse
|
|
136
|
+
// TODO add a mechanism for a type we should check for to
|
|
137
|
+
// add this to schema.gql
|
|
138
|
+
// e.g. scalar Time will be added to schemas which don't use it (yet)
|
|
139
|
+
// TODO foreign non-scalars??
|
|
140
|
+
(0, graphql_1.addCustomType)({
|
|
141
|
+
importPath: "../graphql/scalars/time",
|
|
142
|
+
type: "GraphQLTime",
|
|
143
|
+
});
|
|
144
|
+
// if not in the schema, will be ignored
|
|
145
|
+
// something like GraphQLUpload gotten via gqlArg({type: gqlFileUpload})
|
|
146
|
+
// these 2 need this because they're added by the schema
|
|
147
|
+
// if this list grows too long, need to build this into golang types and passed here
|
|
148
|
+
(0, graphql_1.addCustomType)({
|
|
149
|
+
importPath: "graphql-type-json",
|
|
150
|
+
type: "GraphQLJSON",
|
|
151
|
+
});
|
|
113
152
|
const options = (0, minimist_1.default)(process.argv.slice(2));
|
|
114
153
|
if (!options.path) {
|
|
115
154
|
throw new Error("path required");
|
|
@@ -126,7 +165,7 @@ async function main() {
|
|
|
126
165
|
GQLCapture.enable(true);
|
|
127
166
|
const [inputsRead, _, imports] = await Promise.all([
|
|
128
167
|
readInputs(),
|
|
129
|
-
captureCustom(options.path),
|
|
168
|
+
captureCustom(options.path, options.files),
|
|
130
169
|
parseImports(options.path),
|
|
131
170
|
]);
|
|
132
171
|
const { nodes, nodesMap } = inputsRead;
|
package/testutils/builder.d.ts
CHANGED
package/testutils/builder.js
CHANGED
|
@@ -1,25 +1,30 @@
|
|
|
1
|
-
import { Viewer } from "../../core/base";
|
|
1
|
+
import { ID, Viewer } from "../../core/base";
|
|
2
2
|
import { AssocEdge } from "../../core/ent";
|
|
3
3
|
import { AssocEdgeQueryBase, EdgeQuerySource } from "../../core/query/assoc_query";
|
|
4
4
|
import { FakeUser } from "./fake_user";
|
|
5
5
|
import { FakeEvent } from "./internal";
|
|
6
6
|
export declare class EventToAttendeesQuery extends AssocEdgeQueryBase<FakeEvent, FakeUser, AssocEdge> {
|
|
7
|
-
constructor(viewer: Viewer, src: EdgeQuerySource<FakeEvent>);
|
|
8
|
-
static query(viewer: Viewer, src: EdgeQuerySource<FakeEvent>): EventToAttendeesQuery;
|
|
7
|
+
constructor(viewer: Viewer, src: EdgeQuerySource<FakeEvent, FakeUser>);
|
|
8
|
+
static query(viewer: Viewer, src: EdgeQuerySource<FakeEvent, FakeUser>): EventToAttendeesQuery;
|
|
9
|
+
sourceEnt(id: ID): Promise<FakeEvent | null>;
|
|
9
10
|
}
|
|
10
11
|
export declare class EventToInvitedQuery extends AssocEdgeQueryBase<FakeEvent, FakeUser, AssocEdge> {
|
|
11
|
-
constructor(viewer: Viewer, src: EdgeQuerySource<FakeEvent>);
|
|
12
|
-
static query(viewer: Viewer, src: EdgeQuerySource<FakeEvent>): EventToInvitedQuery;
|
|
12
|
+
constructor(viewer: Viewer, src: EdgeQuerySource<FakeEvent, FakeUser>);
|
|
13
|
+
static query(viewer: Viewer, src: EdgeQuerySource<FakeEvent, FakeUser>): EventToInvitedQuery;
|
|
14
|
+
sourceEnt(id: ID): Promise<FakeEvent | null>;
|
|
13
15
|
}
|
|
14
16
|
export declare class EventToDeclinedQuery extends AssocEdgeQueryBase<FakeEvent, FakeUser, AssocEdge> {
|
|
15
|
-
constructor(viewer: Viewer, src: EdgeQuerySource<FakeEvent>);
|
|
16
|
-
static query(viewer: Viewer, src: EdgeQuerySource<FakeEvent>): EventToDeclinedQuery;
|
|
17
|
+
constructor(viewer: Viewer, src: EdgeQuerySource<FakeEvent, FakeUser>);
|
|
18
|
+
static query(viewer: Viewer, src: EdgeQuerySource<FakeEvent, FakeUser>): EventToDeclinedQuery;
|
|
19
|
+
sourceEnt(id: ID): Promise<FakeEvent | null>;
|
|
17
20
|
}
|
|
18
21
|
export declare class EventToMaybeQuery extends AssocEdgeQueryBase<FakeEvent, FakeUser, AssocEdge> {
|
|
19
|
-
constructor(viewer: Viewer, src: EdgeQuerySource<FakeEvent>);
|
|
20
|
-
static query(viewer: Viewer, src: EdgeQuerySource<FakeEvent>): EventToMaybeQuery;
|
|
22
|
+
constructor(viewer: Viewer, src: EdgeQuerySource<FakeEvent, FakeUser>);
|
|
23
|
+
static query(viewer: Viewer, src: EdgeQuerySource<FakeEvent, FakeUser>): EventToMaybeQuery;
|
|
24
|
+
sourceEnt(id: ID): Promise<FakeEvent | null>;
|
|
21
25
|
}
|
|
22
26
|
export declare class EventToHostsQuery extends AssocEdgeQueryBase<FakeEvent, FakeUser, AssocEdge> {
|
|
23
|
-
constructor(viewer: Viewer, src: EdgeQuerySource<FakeEvent>);
|
|
24
|
-
static query(viewer: Viewer, src: EdgeQuerySource<FakeEvent>): EventToHostsQuery;
|
|
27
|
+
constructor(viewer: Viewer, src: EdgeQuerySource<FakeEvent, FakeUser>);
|
|
28
|
+
static query(viewer: Viewer, src: EdgeQuerySource<FakeEvent, FakeUser>): EventToHostsQuery;
|
|
29
|
+
sourceEnt(id: ID): Promise<FakeEvent | null>;
|
|
25
30
|
}
|
|
@@ -14,6 +14,9 @@ class EventToAttendeesQuery extends assoc_query_1.AssocEdgeQueryBase {
|
|
|
14
14
|
static query(viewer, src) {
|
|
15
15
|
return new EventToAttendeesQuery(viewer, src);
|
|
16
16
|
}
|
|
17
|
+
sourceEnt(id) {
|
|
18
|
+
return internal_1.FakeEvent.load(this.viewer, id);
|
|
19
|
+
}
|
|
17
20
|
}
|
|
18
21
|
exports.EventToAttendeesQuery = EventToAttendeesQuery;
|
|
19
22
|
class EventToInvitedQuery extends assoc_query_1.AssocEdgeQueryBase {
|
|
@@ -23,6 +26,9 @@ class EventToInvitedQuery extends assoc_query_1.AssocEdgeQueryBase {
|
|
|
23
26
|
static query(viewer, src) {
|
|
24
27
|
return new EventToInvitedQuery(viewer, src);
|
|
25
28
|
}
|
|
29
|
+
sourceEnt(id) {
|
|
30
|
+
return internal_1.FakeEvent.load(this.viewer, id);
|
|
31
|
+
}
|
|
26
32
|
}
|
|
27
33
|
exports.EventToInvitedQuery = EventToInvitedQuery;
|
|
28
34
|
class EventToDeclinedQuery extends assoc_query_1.AssocEdgeQueryBase {
|
|
@@ -32,6 +38,9 @@ class EventToDeclinedQuery extends assoc_query_1.AssocEdgeQueryBase {
|
|
|
32
38
|
static query(viewer, src) {
|
|
33
39
|
return new EventToDeclinedQuery(viewer, src);
|
|
34
40
|
}
|
|
41
|
+
sourceEnt(id) {
|
|
42
|
+
return internal_1.FakeEvent.load(this.viewer, id);
|
|
43
|
+
}
|
|
35
44
|
}
|
|
36
45
|
exports.EventToDeclinedQuery = EventToDeclinedQuery;
|
|
37
46
|
class EventToMaybeQuery extends assoc_query_1.AssocEdgeQueryBase {
|
|
@@ -41,6 +50,9 @@ class EventToMaybeQuery extends assoc_query_1.AssocEdgeQueryBase {
|
|
|
41
50
|
static query(viewer, src) {
|
|
42
51
|
return new EventToMaybeQuery(viewer, src);
|
|
43
52
|
}
|
|
53
|
+
sourceEnt(id) {
|
|
54
|
+
return internal_1.FakeEvent.load(this.viewer, id);
|
|
55
|
+
}
|
|
44
56
|
}
|
|
45
57
|
exports.EventToMaybeQuery = EventToMaybeQuery;
|
|
46
58
|
class EventToHostsQuery extends assoc_query_1.AssocEdgeQueryBase {
|
|
@@ -50,5 +62,8 @@ class EventToHostsQuery extends assoc_query_1.AssocEdgeQueryBase {
|
|
|
50
62
|
static query(viewer, src) {
|
|
51
63
|
return new EventToHostsQuery(viewer, src);
|
|
52
64
|
}
|
|
65
|
+
sourceEnt(id) {
|
|
66
|
+
return internal_1.FakeEvent.load(this.viewer, id);
|
|
67
|
+
}
|
|
53
68
|
}
|
|
54
69
|
exports.EventToHostsQuery = EventToHostsQuery;
|
|
@@ -1,14 +1,18 @@
|
|
|
1
|
-
import { Data } from "../../core/base";
|
|
1
|
+
import { Data, Ent } from "../../core/base";
|
|
2
2
|
import { AssocEdge } from "../../core/ent";
|
|
3
3
|
import { TempDB } from "../db/test_db";
|
|
4
4
|
import { FakeUser, UserCreateInput, ContactCreateInput, FakeContact } from ".";
|
|
5
5
|
import { EventCreateInput, FakeEvent } from "./fake_event";
|
|
6
|
+
import { BuilderSchema } from "../builder";
|
|
6
7
|
export declare function getContactInput(user: FakeUser, input?: Partial<ContactCreateInput>): ContactCreateInput;
|
|
7
8
|
export declare function getUserInput(input?: Partial<UserCreateInput>): UserCreateInput;
|
|
8
9
|
export declare function getEventInput(user: FakeUser, input?: Partial<EventCreateInput>): EventCreateInput;
|
|
9
10
|
export declare function createTestUser(input?: Partial<UserCreateInput>): Promise<FakeUser>;
|
|
10
11
|
export declare const inputs: Partial<ContactCreateInput>[];
|
|
11
12
|
export declare function createAllContacts(input?: Partial<UserCreateInput>, slice?: number): Promise<[FakeUser, FakeContact[]]>;
|
|
13
|
+
export declare function createUserPlusFriendRequests(input?: Partial<UserCreateInput>, slice?: number): Promise<[FakeUser, FakeUser[]]>;
|
|
14
|
+
export declare function addEdge<T extends Ent>(source: T, schema: BuilderSchema<T>, edgeType: string, inbound: boolean, // inbound or outbound
|
|
15
|
+
...dest: Ent[]): Promise<void>;
|
|
12
16
|
export declare function verifyUserToContactEdges(user: FakeUser, edges: AssocEdge[], contacts: FakeContact[]): void;
|
|
13
17
|
export declare function verifyUserToContactRawData(user: FakeUser, edges: Data[], contacts: FakeContact[]): void;
|
|
14
18
|
export declare function verifyUserToContacts(user: FakeUser, ents: FakeContact[], contacts: FakeContact[]): void;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createAllEvents = exports.tempDBTables = exports.setupTempDB = exports.createTestEvent = exports.edgeTableNames = exports.createEdges = exports.verifyUserToContacts = exports.verifyUserToContactRawData = exports.verifyUserToContactEdges = exports.createAllContacts = exports.inputs = exports.createTestUser = exports.getEventInput = exports.getUserInput = exports.getContactInput = void 0;
|
|
3
|
+
exports.createAllEvents = exports.tempDBTables = exports.setupTempDB = exports.createTestEvent = exports.edgeTableNames = exports.createEdges = exports.verifyUserToContacts = exports.verifyUserToContactRawData = exports.verifyUserToContactEdges = exports.addEdge = exports.createUserPlusFriendRequests = exports.createAllContacts = exports.inputs = exports.createTestUser = exports.getEventInput = exports.getUserInput = exports.getContactInput = void 0;
|
|
4
4
|
const assert_1 = require("assert");
|
|
5
5
|
const jest_date_mock_1 = require("jest-date-mock");
|
|
6
6
|
const viewer_1 = require("../../core/viewer");
|
|
@@ -12,6 +12,8 @@ const _1 = require(".");
|
|
|
12
12
|
const fake_event_1 = require("./fake_event");
|
|
13
13
|
const const_1 = require("./const");
|
|
14
14
|
const mock_date_1 = require("./../mock_date");
|
|
15
|
+
const builder_1 = require("../builder");
|
|
16
|
+
const action_1 = require("../../action");
|
|
15
17
|
function getContactInput(user, input) {
|
|
16
18
|
return {
|
|
17
19
|
firstName: "Jon",
|
|
@@ -99,6 +101,38 @@ async function createAllContacts(input, slice) {
|
|
|
99
101
|
return [user, contacts];
|
|
100
102
|
}
|
|
101
103
|
exports.createAllContacts = createAllContacts;
|
|
104
|
+
async function createUserPlusFriendRequests(input, slice) {
|
|
105
|
+
const user = await createTestUser(input);
|
|
106
|
+
let userInputs = exports.inputs.slice(0, slice || exports.inputs.length);
|
|
107
|
+
const friendRequests = await Promise.all(userInputs.map(async (input) => {
|
|
108
|
+
return createTestUser(input);
|
|
109
|
+
}));
|
|
110
|
+
expect(friendRequests.length).toBe(userInputs.length);
|
|
111
|
+
await addEdge(user, new _1.FakeUserSchema(), _1.EdgeType.UserToFriendRequests, true, ...friendRequests);
|
|
112
|
+
return [user, friendRequests];
|
|
113
|
+
}
|
|
114
|
+
exports.createUserPlusFriendRequests = createUserPlusFriendRequests;
|
|
115
|
+
async function addEdge(source, schema, edgeType, inbound, // inbound or outbound
|
|
116
|
+
...dest) {
|
|
117
|
+
const action = new builder_1.SimpleAction(source.viewer, schema, new Map(), action_1.WriteOperation.Edit, source);
|
|
118
|
+
dest.forEach(async (friendRequest) => {
|
|
119
|
+
// just to make times deterministic so that tests can consistently work
|
|
120
|
+
(0, jest_date_mock_1.advanceBy)(100);
|
|
121
|
+
// add edge
|
|
122
|
+
if (inbound) {
|
|
123
|
+
action.builder.orchestrator.addInboundEdge(friendRequest.id, edgeType, dest[0].nodeType, {
|
|
124
|
+
time: new Date(), // set time to advanceBy time
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
action.builder.orchestrator.addOutboundEdge(friendRequest.id, edgeType, dest[0].nodeType, {
|
|
129
|
+
time: new Date(), // set time to advanceBy time
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
await action.saveX();
|
|
134
|
+
}
|
|
135
|
+
exports.addEdge = addEdge;
|
|
102
136
|
function verifyUserToContactEdges(user, edges, contacts) {
|
|
103
137
|
expect(edges.length).toBe(contacts.length);
|
|
104
138
|
for (let i = 0; i < contacts.length; i++) {
|
|
@@ -10,16 +10,19 @@ import { QueryLoaderFactory } from "../../core/loaders/query_loader";
|
|
|
10
10
|
export declare class UserToContactsQuery extends AssocEdgeQueryBase<FakeUser, FakeContact, AssocEdge> {
|
|
11
11
|
constructor(viewer: Viewer, src: EdgeQuerySource<FakeUser>);
|
|
12
12
|
static query(viewer: Viewer, src: EdgeQuerySource<FakeUser>): UserToContactsQuery;
|
|
13
|
+
sourceEnt(id: ID): Promise<FakeUser | null>;
|
|
13
14
|
}
|
|
14
15
|
export declare const userToContactsCountLoaderFactory: RawCountLoaderFactory;
|
|
15
16
|
export declare const userToContactsDataLoaderFactory: IndexLoaderFactory;
|
|
16
|
-
export declare class UserToContactsFkeyQuery extends CustomEdgeQueryBase<FakeContact> {
|
|
17
|
+
export declare class UserToContactsFkeyQuery extends CustomEdgeQueryBase<FakeUser, FakeContact> {
|
|
17
18
|
constructor(viewer: Viewer, src: ID | FakeUser);
|
|
18
19
|
static query(viewer: Viewer, src: FakeUser | ID): UserToContactsFkeyQuery;
|
|
20
|
+
sourceEnt(id: ID): Promise<FakeUser | null>;
|
|
19
21
|
}
|
|
20
22
|
export declare class UserToFriendsQuery extends AssocEdgeQueryBase<FakeUser, FakeUser, AssocEdge> {
|
|
21
23
|
constructor(viewer: Viewer, src: EdgeQuerySource<FakeUser>);
|
|
22
24
|
static query(viewer: Viewer, src: EdgeQuerySource<FakeUser>): UserToFriendsQuery;
|
|
25
|
+
sourceEnt(id: ID): Promise<FakeUser | null>;
|
|
23
26
|
queryContacts(): UserToContactsQuery;
|
|
24
27
|
queryFriends(): UserToFriendsQuery;
|
|
25
28
|
queryHostedEvents(): UserToHostedEventsQuery;
|
|
@@ -32,6 +35,7 @@ export declare class CustomEdge extends AssocEdge {
|
|
|
32
35
|
export declare class UserToCustomEdgeQuery extends AssocEdgeQueryBase<FakeUser, FakeUser, CustomEdge> {
|
|
33
36
|
constructor(viewer: Viewer, src: EdgeQuerySource<FakeUser>);
|
|
34
37
|
static query(viewer: Viewer, src: EdgeQuerySource<FakeUser>): UserToCustomEdgeQuery;
|
|
38
|
+
sourceEnt(id: ID): Promise<FakeUser | null>;
|
|
35
39
|
queryContacts(): UserToContactsQuery;
|
|
36
40
|
queryFriends(): UserToFriendsQuery;
|
|
37
41
|
queryHostedEvents(): UserToHostedEventsQuery;
|
|
@@ -40,6 +44,7 @@ export declare class UserToCustomEdgeQuery extends AssocEdgeQueryBase<FakeUser,
|
|
|
40
44
|
export declare class UserToFriendRequestsQuery extends AssocEdgeQueryBase<FakeUser, FakeUser, AssocEdge> {
|
|
41
45
|
constructor(viewer: Viewer, src: EdgeQuerySource<FakeUser>);
|
|
42
46
|
static query(viewer: Viewer, src: EdgeQuerySource<FakeUser>): UserToFriendRequestsQuery;
|
|
47
|
+
sourceEnt(id: ID): Promise<FakeUser | null>;
|
|
43
48
|
queryContacts(): UserToContactsQuery;
|
|
44
49
|
queryFriends(): UserToFriendsQuery;
|
|
45
50
|
queryHostedEvents(): UserToHostedEventsQuery;
|
|
@@ -47,8 +52,10 @@ export declare class UserToFriendRequestsQuery extends AssocEdgeQueryBase<FakeUs
|
|
|
47
52
|
queryCustomEdge(): UserToCustomEdgeQuery;
|
|
48
53
|
}
|
|
49
54
|
export declare class UserToIncomingFriendRequestsQuery extends AssocEdgeQueryBase<FakeUser, FakeUser, AssocEdge> {
|
|
50
|
-
constructor(viewer: Viewer, src: EdgeQuerySource<FakeUser>);
|
|
51
|
-
|
|
55
|
+
constructor(viewer: Viewer, src: EdgeQuerySource<FakeUser, FakeUser>);
|
|
56
|
+
getPrivacyPolicy(): import("../../core/base").PrivacyPolicy;
|
|
57
|
+
sourceEnt(id: ID): Promise<FakeUser | null>;
|
|
58
|
+
static query(viewer: Viewer, src: EdgeQuerySource<FakeUser, FakeUser>): UserToIncomingFriendRequestsQuery;
|
|
52
59
|
queryContacts(): UserToContactsQuery;
|
|
53
60
|
queryFriends(): UserToFriendsQuery;
|
|
54
61
|
queryHostedEvents(): UserToHostedEventsQuery;
|
|
@@ -56,8 +63,9 @@ export declare class UserToIncomingFriendRequestsQuery extends AssocEdgeQueryBas
|
|
|
56
63
|
queryCustomEdge(): UserToCustomEdgeQuery;
|
|
57
64
|
}
|
|
58
65
|
export declare class UserToEventsAttendingQuery extends AssocEdgeQueryBase<FakeUser, FakeEvent, AssocEdge> {
|
|
59
|
-
constructor(viewer: Viewer, src: EdgeQuerySource<FakeUser>);
|
|
60
|
-
static query(viewer: Viewer, src: EdgeQuerySource<FakeUser>): UserToEventsAttendingQuery;
|
|
66
|
+
constructor(viewer: Viewer, src: EdgeQuerySource<FakeUser, FakeEvent>);
|
|
67
|
+
static query(viewer: Viewer, src: EdgeQuerySource<FakeUser, FakeEvent>): UserToEventsAttendingQuery;
|
|
68
|
+
sourceEnt(id: ID): Promise<FakeUser | null>;
|
|
61
69
|
queryHosts(): EventToHostsQuery;
|
|
62
70
|
queryAttendees(): EventToAttendeesQuery;
|
|
63
71
|
queryInvited(): EventToInvitedQuery;
|
|
@@ -65,8 +73,9 @@ export declare class UserToEventsAttendingQuery extends AssocEdgeQueryBase<FakeU
|
|
|
65
73
|
queryMaybe(): EventToMaybeQuery;
|
|
66
74
|
}
|
|
67
75
|
export declare class UserToHostedEventsQuery extends AssocEdgeQueryBase<FakeUser, FakeEvent, AssocEdge> {
|
|
68
|
-
constructor(viewer: Viewer, src: EdgeQuerySource<FakeUser>);
|
|
69
|
-
static query(viewer: Viewer, src: EdgeQuerySource<FakeUser>): UserToHostedEventsQuery;
|
|
76
|
+
constructor(viewer: Viewer, src: EdgeQuerySource<FakeUser, FakeEvent>);
|
|
77
|
+
static query(viewer: Viewer, src: EdgeQuerySource<FakeUser, FakeEvent>): UserToHostedEventsQuery;
|
|
78
|
+
sourceEnt(id: ID): Promise<FakeUser | null>;
|
|
70
79
|
queryHosts(): EventToHostsQuery;
|
|
71
80
|
queryAttendees(): EventToAttendeesQuery;
|
|
72
81
|
queryInvited(): EventToInvitedQuery;
|
|
@@ -77,11 +86,14 @@ export declare const getNextWeekClause: () => clause.Clause;
|
|
|
77
86
|
export declare function getCompleteClause(id: ID): clause.Clause;
|
|
78
87
|
export declare const userToEventsInNextWeekCountLoaderFactory: RawCountLoaderFactory;
|
|
79
88
|
export declare const userToEventsInNextWeekDataLoaderFactory: QueryLoaderFactory<unknown>;
|
|
80
|
-
export declare class UserToEventsInNextWeekQuery extends CustomEdgeQueryBase<FakeEvent> {
|
|
89
|
+
export declare class UserToEventsInNextWeekQuery extends CustomEdgeQueryBase<FakeUser, FakeEvent> {
|
|
81
90
|
constructor(viewer: Viewer, src: ID | FakeUser);
|
|
82
91
|
static query(viewer: Viewer, src: FakeUser | ID): UserToEventsInNextWeekQuery;
|
|
92
|
+
sourceEnt(id: ID): Promise<FakeUser | null>;
|
|
93
|
+
getPrivacyPolicy(): import("../../core/base").PrivacyPolicy;
|
|
83
94
|
}
|
|
84
95
|
export declare class UserToFollowingQuery extends AssocEdgeQueryBase<FakeUser, Ent, AssocEdge> {
|
|
85
|
-
constructor(viewer: Viewer, src: EdgeQuerySource<FakeUser>);
|
|
86
|
-
static query(viewer: Viewer, src: EdgeQuerySource<FakeUser>): UserToFollowingQuery;
|
|
96
|
+
constructor(viewer: Viewer, src: EdgeQuerySource<FakeUser, FakeUser>);
|
|
97
|
+
static query(viewer: Viewer, src: EdgeQuerySource<FakeUser, FakeUser>): UserToFollowingQuery;
|
|
98
|
+
sourceEnt(id: ID): Promise<FakeUser | null>;
|
|
87
99
|
}
|
|
@@ -35,6 +35,7 @@ const luxon_1 = require("luxon");
|
|
|
35
35
|
const query_loader_1 = require("../../core/loaders/query_loader");
|
|
36
36
|
const mock_date_1 = require("./../mock_date");
|
|
37
37
|
const _1 = require(".");
|
|
38
|
+
const privacy_1 = require("../../core/privacy");
|
|
38
39
|
class UserToContactsQuery extends assoc_query_1.AssocEdgeQueryBase {
|
|
39
40
|
constructor(viewer, src) {
|
|
40
41
|
super(viewer, src, new assoc_count_loader_1.AssocEdgeCountLoaderFactory(internal_1.EdgeType.UserToContacts), new assoc_edge_loader_1.AssocEdgeLoaderFactory(internal_1.EdgeType.UserToContacts, ent_1.AssocEdge), internal_1.FakeContact.loaderOptions());
|
|
@@ -42,6 +43,9 @@ class UserToContactsQuery extends assoc_query_1.AssocEdgeQueryBase {
|
|
|
42
43
|
static query(viewer, src) {
|
|
43
44
|
return new UserToContactsQuery(viewer, src);
|
|
44
45
|
}
|
|
46
|
+
sourceEnt(id) {
|
|
47
|
+
return internal_1.FakeUser.load(this.viewer, id);
|
|
48
|
+
}
|
|
45
49
|
}
|
|
46
50
|
exports.UserToContactsQuery = UserToContactsQuery;
|
|
47
51
|
exports.userToContactsCountLoaderFactory = new raw_count_loader_1.RawCountLoaderFactory({
|
|
@@ -64,6 +68,9 @@ class UserToContactsFkeyQuery extends custom_query_1.CustomEdgeQueryBase {
|
|
|
64
68
|
static query(viewer, src) {
|
|
65
69
|
return new UserToContactsFkeyQuery(viewer, src);
|
|
66
70
|
}
|
|
71
|
+
sourceEnt(id) {
|
|
72
|
+
return internal_1.FakeUser.load(this.viewer, id);
|
|
73
|
+
}
|
|
67
74
|
}
|
|
68
75
|
exports.UserToContactsFkeyQuery = UserToContactsFkeyQuery;
|
|
69
76
|
class UserToFriendsQuery extends assoc_query_1.AssocEdgeQueryBase {
|
|
@@ -73,6 +80,9 @@ class UserToFriendsQuery extends assoc_query_1.AssocEdgeQueryBase {
|
|
|
73
80
|
static query(viewer, src) {
|
|
74
81
|
return new UserToFriendsQuery(viewer, src);
|
|
75
82
|
}
|
|
83
|
+
sourceEnt(id) {
|
|
84
|
+
return internal_1.FakeUser.load(this.viewer, id);
|
|
85
|
+
}
|
|
76
86
|
queryContacts() {
|
|
77
87
|
return UserToContactsQuery.query(this.viewer, this);
|
|
78
88
|
}
|
|
@@ -104,6 +114,9 @@ class UserToCustomEdgeQuery extends assoc_query_1.AssocEdgeQueryBase {
|
|
|
104
114
|
static query(viewer, src) {
|
|
105
115
|
return new UserToCustomEdgeQuery(viewer, src);
|
|
106
116
|
}
|
|
117
|
+
sourceEnt(id) {
|
|
118
|
+
return internal_1.FakeUser.load(this.viewer, id);
|
|
119
|
+
}
|
|
107
120
|
queryContacts() {
|
|
108
121
|
return UserToContactsQuery.query(this.viewer, this);
|
|
109
122
|
}
|
|
@@ -125,6 +138,9 @@ class UserToFriendRequestsQuery extends assoc_query_1.AssocEdgeQueryBase {
|
|
|
125
138
|
static query(viewer, src) {
|
|
126
139
|
return new UserToFriendRequestsQuery(viewer, src);
|
|
127
140
|
}
|
|
141
|
+
sourceEnt(id) {
|
|
142
|
+
return internal_1.FakeUser.load(this.viewer, id);
|
|
143
|
+
}
|
|
128
144
|
queryContacts() {
|
|
129
145
|
return UserToContactsQuery.query(this.viewer, this);
|
|
130
146
|
}
|
|
@@ -146,6 +162,12 @@ class UserToIncomingFriendRequestsQuery extends assoc_query_1.AssocEdgeQueryBase
|
|
|
146
162
|
constructor(viewer, src) {
|
|
147
163
|
super(viewer, src, new assoc_count_loader_1.AssocEdgeCountLoaderFactory(internal_1.EdgeType.UserToIncomingFriendRequests), new assoc_edge_loader_1.AssocEdgeLoaderFactory(internal_1.EdgeType.UserToIncomingFriendRequests, ent_1.AssocEdge), internal_1.FakeUser.loaderOptions());
|
|
148
164
|
}
|
|
165
|
+
getPrivacyPolicy() {
|
|
166
|
+
return privacy_1.AllowIfViewerPrivacyPolicy;
|
|
167
|
+
}
|
|
168
|
+
sourceEnt(id) {
|
|
169
|
+
return internal_1.FakeUser.load(this.viewer, id);
|
|
170
|
+
}
|
|
149
171
|
static query(viewer, src) {
|
|
150
172
|
return new UserToIncomingFriendRequestsQuery(viewer, src);
|
|
151
173
|
}
|
|
@@ -173,6 +195,9 @@ class UserToEventsAttendingQuery extends assoc_query_1.AssocEdgeQueryBase {
|
|
|
173
195
|
static query(viewer, src) {
|
|
174
196
|
return new UserToEventsAttendingQuery(viewer, src);
|
|
175
197
|
}
|
|
198
|
+
sourceEnt(id) {
|
|
199
|
+
return internal_1.FakeUser.load(this.viewer, id);
|
|
200
|
+
}
|
|
176
201
|
queryHosts() {
|
|
177
202
|
return internal_1.EventToHostsQuery.query(this.viewer, this);
|
|
178
203
|
}
|
|
@@ -197,6 +222,9 @@ class UserToHostedEventsQuery extends assoc_query_1.AssocEdgeQueryBase {
|
|
|
197
222
|
static query(viewer, src) {
|
|
198
223
|
return new UserToHostedEventsQuery(viewer, src);
|
|
199
224
|
}
|
|
225
|
+
sourceEnt(id) {
|
|
226
|
+
return internal_1.FakeUser.load(this.viewer, id);
|
|
227
|
+
}
|
|
200
228
|
queryHosts() {
|
|
201
229
|
return internal_1.EventToHostsQuery.query(this.viewer, this);
|
|
202
230
|
}
|
|
@@ -256,6 +284,12 @@ class UserToEventsInNextWeekQuery extends custom_query_1.CustomEdgeQueryBase {
|
|
|
256
284
|
static query(viewer, src) {
|
|
257
285
|
return new UserToEventsInNextWeekQuery(viewer, src);
|
|
258
286
|
}
|
|
287
|
+
sourceEnt(id) {
|
|
288
|
+
return internal_1.FakeUser.load(this.viewer, id);
|
|
289
|
+
}
|
|
290
|
+
getPrivacyPolicy() {
|
|
291
|
+
return privacy_1.AllowIfViewerPrivacyPolicy;
|
|
292
|
+
}
|
|
259
293
|
}
|
|
260
294
|
exports.UserToEventsInNextWeekQuery = UserToEventsInNextWeekQuery;
|
|
261
295
|
class UserToFollowingQuery extends assoc_query_1.AssocEdgeQueryBase {
|
|
@@ -265,5 +299,8 @@ class UserToFollowingQuery extends assoc_query_1.AssocEdgeQueryBase {
|
|
|
265
299
|
static query(viewer, src) {
|
|
266
300
|
return new UserToFollowingQuery(viewer, src);
|
|
267
301
|
}
|
|
302
|
+
sourceEnt(id) {
|
|
303
|
+
return internal_1.FakeUser.load(this.viewer, id);
|
|
304
|
+
}
|
|
268
305
|
}
|
|
269
306
|
exports.UserToFollowingQuery = UserToFollowingQuery;
|