@snowtop/ent 0.0.34 → 0.1.0-alpha
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 +14 -14
- package/action/experimental_action.d.ts +20 -20
- package/action/experimental_action.js +1 -1
- package/action/orchestrator.d.ts +9 -9
- package/core/base.d.ts +6 -6
- package/core/ent.d.ts +2 -1
- package/core/ent.js +13 -8
- package/core/query/assoc_query.js +2 -2
- package/core/query/query.d.ts +1 -1
- package/package.json +1 -1
- package/parse_schema/parse.d.ts +9 -2
- package/parse_schema/parse.js +29 -20
- package/testutils/builder.d.ts +13 -13
- package/testutils/fake_data/user_query.d.ts +2 -2
package/action/action.d.ts
CHANGED
|
@@ -32,24 +32,24 @@ export interface Changeset<T extends Ent> {
|
|
|
32
32
|
dependencies?: Map<ID, Builder<Ent>>;
|
|
33
33
|
}
|
|
34
34
|
export declare type TriggerReturn = void | Promise<Changeset<Ent> | void | (Changeset<Ent> | void)[]> | Promise<Changeset<Ent>>[];
|
|
35
|
-
export interface Trigger<
|
|
36
|
-
changeset(builder:
|
|
35
|
+
export interface Trigger<TBuilder extends Builder<Ent>, TData extends Data> {
|
|
36
|
+
changeset(builder: TBuilder, input: TData): TriggerReturn;
|
|
37
37
|
}
|
|
38
|
-
export interface Observer<
|
|
39
|
-
observe(builder:
|
|
38
|
+
export interface Observer<TBuilder extends Builder<Ent>, TData extends Data> {
|
|
39
|
+
observe(builder: TBuilder, input: TData): void | Promise<void>;
|
|
40
40
|
}
|
|
41
|
-
export interface Validator<
|
|
42
|
-
validate(builder:
|
|
41
|
+
export interface Validator<TBuilder extends Builder<Ent>, TData extends Data> {
|
|
42
|
+
validate(builder: TBuilder, input: TData): Promise<void> | void;
|
|
43
43
|
}
|
|
44
|
-
export interface Action<
|
|
44
|
+
export interface Action<TEnt extends Ent, TBuilder extends Builder<TEnt>, TData extends Data> {
|
|
45
45
|
readonly viewer: Viewer;
|
|
46
|
-
changeset(): Promise<Changeset<
|
|
47
|
-
builder:
|
|
48
|
-
getPrivacyPolicy(): PrivacyPolicy
|
|
49
|
-
triggers?: Trigger<
|
|
50
|
-
observers?: Observer<
|
|
51
|
-
validators?: Validator<
|
|
52
|
-
getInput():
|
|
46
|
+
changeset(): Promise<Changeset<TEnt>>;
|
|
47
|
+
builder: TBuilder;
|
|
48
|
+
getPrivacyPolicy(): PrivacyPolicy<TEnt>;
|
|
49
|
+
triggers?: Trigger<TBuilder, TData>[];
|
|
50
|
+
observers?: Observer<TBuilder, TData>[];
|
|
51
|
+
validators?: Validator<TBuilder, TData>[];
|
|
52
|
+
getInput(): TData;
|
|
53
53
|
valid(): Promise<boolean>;
|
|
54
54
|
validX(): Promise<void>;
|
|
55
55
|
viewerForEntLoad?(data: Data): Viewer | Promise<Viewer>;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Viewer, Ent, Data } from "../core/base";
|
|
2
2
|
import { Action, WriteOperation, Builder, Trigger, Observer, Changeset, Validator } from "./action";
|
|
3
|
-
export interface ActionOptions<T extends Ent> {
|
|
3
|
+
export interface ActionOptions<T extends Ent, TData extends Data> {
|
|
4
4
|
existingEnt?: T | null;
|
|
5
|
-
input?:
|
|
5
|
+
input?: TData;
|
|
6
6
|
operation?: WriteOperation;
|
|
7
7
|
}
|
|
8
8
|
interface EntBuilder<T extends Ent> extends Builder<T> {
|
|
@@ -13,28 +13,28 @@ interface EntBuilder<T extends Ent> extends Builder<T> {
|
|
|
13
13
|
editedEnt(): Promise<T | null>;
|
|
14
14
|
editedEntX(): Promise<T>;
|
|
15
15
|
}
|
|
16
|
-
export declare class BaseAction<
|
|
16
|
+
export declare class BaseAction<TEnt extends Ent, TData extends Data> implements Action<TEnt, EntBuilder<TEnt>, TData> {
|
|
17
17
|
viewer: Viewer;
|
|
18
|
-
builderCtr: BuilderConstructor<
|
|
19
|
-
builder: EntBuilder<
|
|
18
|
+
builderCtr: BuilderConstructor<TEnt, TData>;
|
|
19
|
+
builder: EntBuilder<TEnt>;
|
|
20
20
|
private input;
|
|
21
|
-
triggers: Trigger<
|
|
22
|
-
observers: Observer<
|
|
23
|
-
validators: Validator<
|
|
24
|
-
getPrivacyPolicy(): import("../core/base").PrivacyPolicy
|
|
25
|
-
constructor(viewer: Viewer, builderCtr: BuilderConstructor<
|
|
26
|
-
static createBuilder<
|
|
27
|
-
static bulkAction<
|
|
28
|
-
changeset(): Promise<Changeset<
|
|
21
|
+
triggers: Trigger<EntBuilder<TEnt>, TData>[];
|
|
22
|
+
observers: Observer<EntBuilder<TEnt>, TData>[];
|
|
23
|
+
validators: Validator<EntBuilder<TEnt>, TData>[];
|
|
24
|
+
getPrivacyPolicy(): import("../core/base").PrivacyPolicy<Ent>;
|
|
25
|
+
constructor(viewer: Viewer, builderCtr: BuilderConstructor<TEnt, TData>, options?: ActionOptions<TEnt, TData> | null);
|
|
26
|
+
static createBuilder<TEnt extends Ent, TData extends Data>(viewer: Viewer, builderCtr: BuilderConstructor<TEnt, TData>, options?: ActionOptions<TEnt, TData> | null): Builder<TEnt>;
|
|
27
|
+
static bulkAction<TEnt extends Ent, TData extends Data>(ent: TEnt, builderCtr: BuilderConstructor<TEnt, TData>, ...actions: Action<Ent, Builder<Ent>, Data>[]): BaseAction<TEnt, TData>;
|
|
28
|
+
changeset(): Promise<Changeset<TEnt>>;
|
|
29
29
|
valid(): Promise<boolean>;
|
|
30
30
|
validX(): Promise<void>;
|
|
31
|
-
save(): Promise<
|
|
32
|
-
saveX(): Promise<
|
|
33
|
-
getInput():
|
|
31
|
+
save(): Promise<TEnt | null>;
|
|
32
|
+
saveX(): Promise<TEnt>;
|
|
33
|
+
getInput(): TData;
|
|
34
34
|
}
|
|
35
|
-
interface BuilderConstructor<
|
|
36
|
-
new (viewer: Viewer, operation: WriteOperation, action: Action<
|
|
35
|
+
interface BuilderConstructor<TEnt extends Ent, TData extends Data> {
|
|
36
|
+
new (viewer: Viewer, operation: WriteOperation, action: Action<TEnt, EntBuilder<TEnt>, TData>, existingEnt?: TEnt | undefined): EntBuilder<TEnt>;
|
|
37
37
|
}
|
|
38
|
-
export declare function updateRawObject<TEnt extends Ent, TInput extends Data>(viewer: Viewer, builderCtr: BuilderConstructor<TEnt>, existingEnt: TEnt, input: TInput): Promise<TEnt>;
|
|
39
|
-
export declare function getSimpleEditAction<TEnt extends Ent, TInput extends Data>(viewer: Viewer, builderCtr: BuilderConstructor<TEnt>, existingEnt: TEnt, input: TInput): Action<TEnt>;
|
|
38
|
+
export declare function updateRawObject<TEnt extends Ent, TInput extends Data>(viewer: Viewer, builderCtr: BuilderConstructor<TEnt, TInput>, existingEnt: TEnt, input: TInput): Promise<TEnt>;
|
|
39
|
+
export declare function getSimpleEditAction<TEnt extends Ent, TInput extends Data>(viewer: Viewer, builderCtr: BuilderConstructor<TEnt, TInput>, existingEnt: TEnt, input: TInput): Action<TEnt, Builder<TEnt>, TInput>;
|
|
40
40
|
export {};
|
package/action/orchestrator.d.ts
CHANGED
|
@@ -3,14 +3,14 @@ import { AssocEdgeInputOptions, DataOperation } from "../core/ent";
|
|
|
3
3
|
import { SchemaInputType } from "../schema/schema";
|
|
4
4
|
import { Changeset, Executor } from "../action/action";
|
|
5
5
|
import { WriteOperation, Builder, Action } from "../action";
|
|
6
|
-
export interface OrchestratorOptions<
|
|
6
|
+
export interface OrchestratorOptions<TEnt extends Ent, TData extends Data> {
|
|
7
7
|
viewer: Viewer;
|
|
8
8
|
operation: WriteOperation;
|
|
9
9
|
tableName: string;
|
|
10
|
-
loaderOptions: LoadEntOptions<
|
|
10
|
+
loaderOptions: LoadEntOptions<TEnt>;
|
|
11
11
|
key: string;
|
|
12
|
-
builder: Builder<
|
|
13
|
-
action?: Action<
|
|
12
|
+
builder: Builder<TEnt>;
|
|
13
|
+
action?: Action<TEnt, Builder<TEnt>, TData>;
|
|
14
14
|
schema: SchemaInputType;
|
|
15
15
|
editedFields(): Map<string, any>;
|
|
16
16
|
updateInput?: (data: TData) => void;
|
|
@@ -28,7 +28,7 @@ export declare enum edgeDirection {
|
|
|
28
28
|
inboundEdge = 0,
|
|
29
29
|
outboundEdge = 1
|
|
30
30
|
}
|
|
31
|
-
export declare class Orchestrator<
|
|
31
|
+
export declare class Orchestrator<TEnt extends Ent, TData extends Data> {
|
|
32
32
|
private options;
|
|
33
33
|
private edgeSet;
|
|
34
34
|
private edges;
|
|
@@ -41,7 +41,7 @@ export declare class Orchestrator<T extends Ent> {
|
|
|
41
41
|
viewer: Viewer;
|
|
42
42
|
private defaultFieldsByFieldName;
|
|
43
43
|
private defaultFieldsByTSName;
|
|
44
|
-
constructor(options: OrchestratorOptions<
|
|
44
|
+
constructor(options: OrchestratorOptions<TEnt, TData>);
|
|
45
45
|
private addEdge;
|
|
46
46
|
addInboundEdge<T2 extends Ent>(id1: ID | Builder<T2>, edgeType: string, nodeType: string, options?: AssocEdgeInputOptions): void;
|
|
47
47
|
addOutboundEdge<T2 extends Ent>(id2: ID | Builder<T2>, edgeType: string, nodeType: string, options?: AssocEdgeInputOptions): void;
|
|
@@ -64,11 +64,11 @@ export declare class Orchestrator<T extends Ent> {
|
|
|
64
64
|
private formatAndValidateFields;
|
|
65
65
|
valid(): Promise<boolean>;
|
|
66
66
|
validX(): Promise<void>;
|
|
67
|
-
build(): Promise<EntChangeset<
|
|
67
|
+
build(): Promise<EntChangeset<TEnt>>;
|
|
68
68
|
private viewerForEntLoad;
|
|
69
69
|
returnedRow(): Promise<Data | null>;
|
|
70
|
-
editedEnt(): Promise<
|
|
71
|
-
editedEntX(): Promise<
|
|
70
|
+
editedEnt(): Promise<TEnt | null>;
|
|
71
|
+
editedEntX(): Promise<TEnt>;
|
|
72
72
|
}
|
|
73
73
|
export declare class EntChangeset<T extends Ent> implements Changeset<T> {
|
|
74
74
|
viewer: Viewer;
|
package/core/base.d.ts
CHANGED
|
@@ -43,7 +43,7 @@ export interface Viewer {
|
|
|
43
43
|
export interface Ent {
|
|
44
44
|
id: ID;
|
|
45
45
|
viewer: Viewer;
|
|
46
|
-
privacyPolicy: PrivacyPolicy
|
|
46
|
+
privacyPolicy: PrivacyPolicy<this>;
|
|
47
47
|
nodeType: string;
|
|
48
48
|
}
|
|
49
49
|
export declare type Data = {
|
|
@@ -110,17 +110,17 @@ export interface PrivacyResult {
|
|
|
110
110
|
error?: PrivacyError;
|
|
111
111
|
}
|
|
112
112
|
export interface PrivacyError extends Error {
|
|
113
|
-
privacyPolicy: PrivacyPolicy
|
|
113
|
+
privacyPolicy: PrivacyPolicy<Ent>;
|
|
114
114
|
ent?: Ent;
|
|
115
115
|
}
|
|
116
116
|
export declare function Allow(): PrivacyResult;
|
|
117
117
|
export declare function Skip(): PrivacyResult;
|
|
118
118
|
export declare function Deny(): PrivacyResult;
|
|
119
119
|
export declare function DenyWithReason(e: PrivacyError): PrivacyResult;
|
|
120
|
-
export interface PrivacyPolicyRule {
|
|
121
|
-
apply(v: Viewer, ent?:
|
|
120
|
+
export interface PrivacyPolicyRule<TEnt extends Ent = Ent> {
|
|
121
|
+
apply(v: Viewer, ent?: TEnt): Promise<PrivacyResult>;
|
|
122
122
|
}
|
|
123
|
-
export interface PrivacyPolicy {
|
|
124
|
-
rules: PrivacyPolicyRule[];
|
|
123
|
+
export interface PrivacyPolicy<TEnt extends Ent = Ent> {
|
|
124
|
+
rules: PrivacyPolicyRule<TEnt>[];
|
|
125
125
|
}
|
|
126
126
|
export {};
|
package/core/ent.d.ts
CHANGED
|
@@ -10,7 +10,8 @@ export declare function loadEntX<T extends Ent>(viewer: Viewer, id: ID, options:
|
|
|
10
10
|
export declare function loadEntXViaKey<T extends Ent>(viewer: Viewer, key: any, options: LoadEntOptions<T>): Promise<T>;
|
|
11
11
|
export declare function loadEntFromClause<T extends Ent>(viewer: Viewer, options: LoadEntOptions<T>, clause: clause.Clause): Promise<T | null>;
|
|
12
12
|
export declare function loadEntXFromClause<T extends Ent>(viewer: Viewer, options: LoadEntOptions<T>, clause: clause.Clause): Promise<T>;
|
|
13
|
-
export declare function loadEnts<T extends Ent>(viewer: Viewer, options: LoadEntOptions<T>, ...ids: ID[]): Promise<T
|
|
13
|
+
export declare function loadEnts<T extends Ent>(viewer: Viewer, options: LoadEntOptions<T>, ...ids: ID[]): Promise<Map<ID, T>>;
|
|
14
|
+
export declare function loadEntsList<T extends Ent>(viewer: Viewer, options: LoadEntOptions<T>, ...ids: ID[]): Promise<T[]>;
|
|
14
15
|
export declare function loadEntsFromClause<T extends Ent>(viewer: Viewer, clause: clause.Clause, options: LoadEntOptions<T>): Promise<Map<ID, T>>;
|
|
15
16
|
export declare function loadCustomEnts<T extends Ent>(viewer: Viewer, options: LoadCustomEntOptions<T>, query: CustomQuery): Promise<T[]>;
|
|
16
17
|
interface rawQueryOptions {
|
package/core/ent.js
CHANGED
|
@@ -22,7 +22,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
22
22
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
23
23
|
};
|
|
24
24
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
-
exports.
|
|
25
|
+
exports.applyPrivacyPolicyForRows = exports.applyPrivacyPolicyForRowX = exports.applyPrivacyPolicyForRow = exports.loadNodesByEdge = exports.loadEdgeForID2 = exports.loadRawEdgeCountX = exports.loadUniqueNode = exports.loadUniqueEdge = exports.loadCustomEdges = exports.loadEdges = exports.defaultEdgeQueryOptions = exports.DefaultLimit = exports.loadEdgeDatas = exports.loadEdgeData = exports.assocEdgeLoader = exports.AssocEdgeData = exports.getCursor = exports.AssocEdge = exports.DeleteNodeOperation = exports.deleteRowsSync = exports.deleteRows = exports.editRowSync = exports.editRow = exports.buildUpdateQuery = exports.createRowSync = exports.createRow = exports.buildInsertQuery = exports.EdgeOperation = exports.EditNodeOperation = exports.buildGroupQuery = exports.buildQuery = exports.loadRows = exports.performRawQuery = exports.loadRow = exports.loadRowX = exports.applyPrivacyPolicyForEntX = exports.applyPrivacyPolicyForEnt = exports.loadDerivedEntX = exports.loadDerivedEnt = exports.loadCustomData = exports.loadCustomEnts = exports.loadEntsFromClause = exports.loadEntsList = exports.loadEnts = exports.loadEntXFromClause = exports.loadEntFromClause = exports.loadEntXViaKey = exports.loadEntX = exports.loadEntViaKey = exports.loadEnt = void 0;
|
|
26
|
+
exports.getEdgeTypeInGroup = void 0;
|
|
26
27
|
const db_1 = __importStar(require("./db"));
|
|
27
28
|
const privacy_1 = require("./privacy");
|
|
28
29
|
const clause = __importStar(require("./clause"));
|
|
@@ -145,7 +146,7 @@ async function loadEntXFromClause(viewer, options, clause) {
|
|
|
145
146
|
exports.loadEntXFromClause = loadEntXFromClause;
|
|
146
147
|
async function loadEnts(viewer, options, ...ids) {
|
|
147
148
|
if (!ids.length) {
|
|
148
|
-
return
|
|
149
|
+
return new Map();
|
|
149
150
|
}
|
|
150
151
|
let loaded = false;
|
|
151
152
|
let rows = [];
|
|
@@ -175,12 +176,16 @@ async function loadEnts(viewer, options, ...ids) {
|
|
|
175
176
|
// this is always "id" if not using an ObjectLoaderFactory
|
|
176
177
|
clause.In("id", ...ids), options);
|
|
177
178
|
}
|
|
179
|
+
return m;
|
|
178
180
|
// TODO do we want to change this to be a map not a list so that it's easy to check for existence?
|
|
179
181
|
// TODO eventually this should be doing a cache then db queyr and maybe depend on dataloader to get all the results at once
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
182
|
+
}
|
|
183
|
+
exports.loadEnts = loadEnts;
|
|
184
|
+
// calls loadEnts and returns the results sorted in the order they were passed in
|
|
185
|
+
// useful for EntQuery and other paths where the order matters
|
|
186
|
+
async function loadEntsList(viewer, options, ...ids) {
|
|
187
|
+
const m = await loadEnts(viewer, options, ...ids);
|
|
188
|
+
const result = [];
|
|
184
189
|
ids.forEach((id) => {
|
|
185
190
|
let ent = m.get(id);
|
|
186
191
|
if (ent) {
|
|
@@ -189,7 +194,7 @@ async function loadEnts(viewer, options, ...ids) {
|
|
|
189
194
|
});
|
|
190
195
|
return result;
|
|
191
196
|
}
|
|
192
|
-
exports.
|
|
197
|
+
exports.loadEntsList = loadEntsList;
|
|
193
198
|
// we return a map here so that any sorting for queries that exist
|
|
194
199
|
// can be done in O(N) time
|
|
195
200
|
async function loadEntsFromClause(viewer, clause, options) {
|
|
@@ -1133,7 +1138,7 @@ async function loadNodesByEdge(viewer, id1, edgeType, options) {
|
|
|
1133
1138
|
});
|
|
1134
1139
|
// extract id2s
|
|
1135
1140
|
const ids = rows.map((row) => row.id2);
|
|
1136
|
-
return
|
|
1141
|
+
return loadEntsList(viewer, options, ...ids);
|
|
1137
1142
|
}
|
|
1138
1143
|
exports.loadNodesByEdge = loadNodesByEdge;
|
|
1139
1144
|
async function applyPrivacyPolicyForRow(viewer, options, row) {
|
|
@@ -73,7 +73,7 @@ class AssocEdgeQueryBase extends query_1.BaseEdgeQuery {
|
|
|
73
73
|
}
|
|
74
74
|
let promises = [];
|
|
75
75
|
for (const [_, value] of m) {
|
|
76
|
-
promises.push((0, ent_1.
|
|
76
|
+
promises.push((0, ent_1.loadEntsList)(this.viewer, value.options, ...value.ids));
|
|
77
77
|
}
|
|
78
78
|
const entss = await Promise.all(promises);
|
|
79
79
|
const r = [];
|
|
@@ -83,7 +83,7 @@ class AssocEdgeQueryBase extends query_1.BaseEdgeQuery {
|
|
|
83
83
|
return r;
|
|
84
84
|
}
|
|
85
85
|
const ids = edges.map((edge) => edge.id2);
|
|
86
|
-
return
|
|
86
|
+
return (0, ent_1.loadEntsList)(this.viewer, this.options, ...ids);
|
|
87
87
|
}
|
|
88
88
|
dataToID(edge) {
|
|
89
89
|
return edge.id2;
|
package/core/query/query.d.ts
CHANGED
|
@@ -41,7 +41,7 @@ export declare abstract class BaseEdgeQuery<TSource extends Ent, TDest extends E
|
|
|
41
41
|
private idMap;
|
|
42
42
|
private idsToFetch;
|
|
43
43
|
constructor(viewer: Viewer, sortCol: string);
|
|
44
|
-
getPrivacyPolicy(): PrivacyPolicy
|
|
44
|
+
getPrivacyPolicy(): PrivacyPolicy<Ent>;
|
|
45
45
|
abstract sourceEnt(id: ID): Promise<Ent | null>;
|
|
46
46
|
first(n: number, after?: string): this;
|
|
47
47
|
last(n: number, before?: string): this;
|
package/package.json
CHANGED
package/parse_schema/parse.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Schema, AssocEdge, AssocEdgeGroup, Action } from "../schema";
|
|
1
|
+
import { Schema, Field, AssocEdge, AssocEdgeGroup, Action } from "../schema";
|
|
2
2
|
import { ActionField } from "../schema/schema";
|
|
3
3
|
declare enum NullableResult {
|
|
4
4
|
CONTENTS = "contents",
|
|
@@ -12,10 +12,11 @@ declare type ProcessedAssocEdge = Omit<AssocEdge, "actionOnlyFields" | "edgeActi
|
|
|
12
12
|
patternName?: string;
|
|
13
13
|
edgeActions?: OutputAction[];
|
|
14
14
|
};
|
|
15
|
-
declare type ProcessedSchema = Omit<Schema, "edges" | "actions" | "edgeGroups"> & {
|
|
15
|
+
declare type ProcessedSchema = Omit<Schema, "edges" | "actions" | "edgeGroups" | "fields"> & {
|
|
16
16
|
actions: OutputAction[];
|
|
17
17
|
assocEdges: ProcessedAssocEdge[];
|
|
18
18
|
assocEdgeGroups: ProcessedAssocEdgeGroup[];
|
|
19
|
+
fields: ProcessedField[];
|
|
19
20
|
};
|
|
20
21
|
declare type ProcessedAssocEdgeGroup = Omit<AssocEdgeGroup, "edgeAction"> & {
|
|
21
22
|
edgeAction?: OutputAction;
|
|
@@ -29,7 +30,13 @@ interface schemasDict {
|
|
|
29
30
|
interface ProcessedPattern {
|
|
30
31
|
name: string;
|
|
31
32
|
assocEdges: ProcessedAssocEdge[];
|
|
33
|
+
fields: ProcessedField[];
|
|
32
34
|
}
|
|
35
|
+
declare type ProcessedField = Omit<Field, "defaultValueOnEdit" | "defaultValueOnCreate"> & {
|
|
36
|
+
hasDefaultValueOnCreate?: boolean;
|
|
37
|
+
hasDefaultValueOnEdit?: boolean;
|
|
38
|
+
patternName?: string;
|
|
39
|
+
};
|
|
33
40
|
interface patternsDict {
|
|
34
41
|
[key: string]: ProcessedPattern;
|
|
35
42
|
}
|
package/parse_schema/parse.js
CHANGED
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.parseSchema = void 0;
|
|
4
|
-
function processFields(
|
|
4
|
+
function processFields(src, patternName) {
|
|
5
|
+
const ret = [];
|
|
5
6
|
for (const field of src) {
|
|
6
7
|
let f = { ...field };
|
|
7
|
-
f
|
|
8
|
-
f
|
|
8
|
+
f.hasDefaultValueOnCreate = field.defaultValueOnCreate != undefined;
|
|
9
|
+
f.hasDefaultValueOnEdit = field.defaultValueOnEdit != undefined;
|
|
9
10
|
if (field.polymorphic) {
|
|
10
11
|
// convert boolean into object
|
|
11
12
|
// we keep boolean as an option to keep API simple
|
|
12
13
|
if (typeof field.polymorphic === "boolean") {
|
|
13
|
-
f
|
|
14
|
+
f.polymorphic = {};
|
|
14
15
|
}
|
|
15
16
|
else {
|
|
16
|
-
f
|
|
17
|
+
f.polymorphic = field.polymorphic;
|
|
17
18
|
}
|
|
18
19
|
}
|
|
19
20
|
// convert string to object to make API consumed by go simple
|
|
@@ -24,16 +25,22 @@ function processFields(processedSchema, src) {
|
|
|
24
25
|
};
|
|
25
26
|
}
|
|
26
27
|
}
|
|
27
|
-
|
|
28
|
+
if (patternName) {
|
|
29
|
+
f.patternName = patternName;
|
|
30
|
+
}
|
|
31
|
+
ret.push(f);
|
|
28
32
|
}
|
|
33
|
+
return ret;
|
|
29
34
|
}
|
|
30
|
-
function processEdges(
|
|
35
|
+
function processEdges(src, patternName) {
|
|
36
|
+
const ret = [];
|
|
31
37
|
for (const edge of src) {
|
|
32
38
|
let edge2 = { ...edge };
|
|
33
39
|
edge2.edgeActions = edge.edgeActions?.map((action) => processAction(action));
|
|
34
40
|
edge2.patternName = patternName;
|
|
35
|
-
|
|
41
|
+
ret.push(edge2);
|
|
36
42
|
}
|
|
43
|
+
return ret;
|
|
37
44
|
}
|
|
38
45
|
function processEdgeGroups(processedSchema, edgeGroups) {
|
|
39
46
|
// array-ify this
|
|
@@ -49,26 +56,26 @@ function processEdgeGroups(processedSchema, edgeGroups) {
|
|
|
49
56
|
}
|
|
50
57
|
}
|
|
51
58
|
function processPattern(patterns, pattern, processedSchema) {
|
|
52
|
-
|
|
53
|
-
|
|
59
|
+
const name = pattern.name;
|
|
60
|
+
const fields = processFields(pattern.fields, pattern.name);
|
|
61
|
+
processedSchema.fields.push(...fields);
|
|
62
|
+
if (pattern.edges) {
|
|
63
|
+
const edges = processEdges(pattern.edges, pattern.name);
|
|
64
|
+
processedSchema.assocEdges.push(...edges);
|
|
65
|
+
}
|
|
54
66
|
if (patterns[name] === undefined) {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
processEdges(edges, pattern.edges);
|
|
58
|
-
}
|
|
67
|
+
// intentionally processing separately and not passing pattern.name
|
|
68
|
+
const edges = processEdges(pattern.edges || []);
|
|
59
69
|
patterns[name] = {
|
|
60
70
|
name: pattern.name,
|
|
61
71
|
assocEdges: edges,
|
|
72
|
+
fields: fields,
|
|
62
73
|
};
|
|
63
74
|
}
|
|
64
75
|
else {
|
|
65
76
|
// TODO ideally we want to make sure that different patterns don't have the same name
|
|
66
77
|
// can't do a deepEqual check because function calls and therefore different instances in fields
|
|
67
78
|
}
|
|
68
|
-
processFields(processedSchema, pattern.fields);
|
|
69
|
-
if (pattern.edges) {
|
|
70
|
-
processEdges(processedSchema.assocEdges, pattern.edges, pattern.name);
|
|
71
|
-
}
|
|
72
79
|
}
|
|
73
80
|
var NullableResult;
|
|
74
81
|
(function (NullableResult) {
|
|
@@ -133,9 +140,11 @@ function parseSchema(potentialSchemas) {
|
|
|
133
140
|
processPattern(patterns, pattern, processedSchema);
|
|
134
141
|
}
|
|
135
142
|
}
|
|
136
|
-
processFields(
|
|
143
|
+
const fields = processFields(schema.fields);
|
|
144
|
+
processedSchema.fields.push(...fields);
|
|
137
145
|
if (schema.edges) {
|
|
138
|
-
processEdges(
|
|
146
|
+
const edges = processEdges(schema.edges);
|
|
147
|
+
processedSchema.assocEdges.push(...edges);
|
|
139
148
|
}
|
|
140
149
|
if (schema.edgeGroups) {
|
|
141
150
|
processEdgeGroups(processedSchema, schema.edgeGroups);
|
package/testutils/builder.d.ts
CHANGED
|
@@ -8,7 +8,7 @@ export declare class User implements Ent {
|
|
|
8
8
|
id: ID;
|
|
9
9
|
accountID: string;
|
|
10
10
|
nodeType: string;
|
|
11
|
-
privacyPolicy: import("../core/base").PrivacyPolicy
|
|
11
|
+
privacyPolicy: import("../core/base").PrivacyPolicy<Ent>;
|
|
12
12
|
firstName: string;
|
|
13
13
|
constructor(viewer: Viewer, data: Data);
|
|
14
14
|
}
|
|
@@ -18,7 +18,7 @@ export declare class Event implements Ent {
|
|
|
18
18
|
id: ID;
|
|
19
19
|
accountID: string;
|
|
20
20
|
nodeType: string;
|
|
21
|
-
privacyPolicy: import("../core/base").PrivacyPolicy
|
|
21
|
+
privacyPolicy: import("../core/base").PrivacyPolicy<Ent>;
|
|
22
22
|
constructor(viewer: Viewer, data: Data);
|
|
23
23
|
}
|
|
24
24
|
export declare class Contact implements Ent {
|
|
@@ -27,7 +27,7 @@ export declare class Contact implements Ent {
|
|
|
27
27
|
id: ID;
|
|
28
28
|
accountID: string;
|
|
29
29
|
nodeType: string;
|
|
30
|
-
privacyPolicy: import("../core/base").PrivacyPolicy
|
|
30
|
+
privacyPolicy: import("../core/base").PrivacyPolicy<Ent>;
|
|
31
31
|
constructor(viewer: Viewer, data: Data);
|
|
32
32
|
}
|
|
33
33
|
export declare class Group implements Ent {
|
|
@@ -36,7 +36,7 @@ export declare class Group implements Ent {
|
|
|
36
36
|
id: ID;
|
|
37
37
|
accountID: string;
|
|
38
38
|
nodeType: string;
|
|
39
|
-
privacyPolicy: import("../core/base").PrivacyPolicy
|
|
39
|
+
privacyPolicy: import("../core/base").PrivacyPolicy<Ent>;
|
|
40
40
|
constructor(viewer: Viewer, data: Data);
|
|
41
41
|
}
|
|
42
42
|
export declare class Message implements Ent {
|
|
@@ -45,7 +45,7 @@ export declare class Message implements Ent {
|
|
|
45
45
|
id: ID;
|
|
46
46
|
accountID: string;
|
|
47
47
|
nodeType: string;
|
|
48
|
-
privacyPolicy: import("../core/base").PrivacyPolicy
|
|
48
|
+
privacyPolicy: import("../core/base").PrivacyPolicy<Ent>;
|
|
49
49
|
constructor(viewer: Viewer, data: Data);
|
|
50
50
|
}
|
|
51
51
|
export declare class Address implements Ent {
|
|
@@ -54,7 +54,7 @@ export declare class Address implements Ent {
|
|
|
54
54
|
id: ID;
|
|
55
55
|
accountID: string;
|
|
56
56
|
nodeType: string;
|
|
57
|
-
privacyPolicy: import("../core/base").PrivacyPolicy
|
|
57
|
+
privacyPolicy: import("../core/base").PrivacyPolicy<Ent>;
|
|
58
58
|
constructor(viewer: Viewer, data: Data);
|
|
59
59
|
}
|
|
60
60
|
export interface BuilderSchema<T extends Ent> extends Schema {
|
|
@@ -69,10 +69,10 @@ export declare class SimpleBuilder<T extends Ent> implements Builder<T> {
|
|
|
69
69
|
existingEnt: T | undefined;
|
|
70
70
|
ent: EntConstructor<T>;
|
|
71
71
|
placeholderID: ID;
|
|
72
|
-
orchestrator: Orchestrator<T>;
|
|
72
|
+
orchestrator: Orchestrator<T, Data>;
|
|
73
73
|
fields: Map<string, any>;
|
|
74
74
|
nodeType: string;
|
|
75
|
-
constructor(viewer: Viewer, schema: BuilderSchema<T>, fields: Map<string, any>, operation?: WriteOperation, existingEnt?: T | undefined, action?: Action<T> | undefined);
|
|
75
|
+
constructor(viewer: Viewer, schema: BuilderSchema<T>, fields: Map<string, any>, operation?: WriteOperation, existingEnt?: T | undefined, action?: Action<T, SimpleBuilder<T>, Data> | undefined);
|
|
76
76
|
build(): Promise<Changeset<T>>;
|
|
77
77
|
editedEnt(): Promise<T | null>;
|
|
78
78
|
editedEntX(): Promise<T>;
|
|
@@ -84,16 +84,16 @@ export declare class SimpleBuilder<T extends Ent> implements Builder<T> {
|
|
|
84
84
|
interface viewerEntLoadFunc {
|
|
85
85
|
(data: Data): Viewer | Promise<Viewer>;
|
|
86
86
|
}
|
|
87
|
-
export declare class SimpleAction<T extends Ent> implements Action<T> {
|
|
87
|
+
export declare class SimpleAction<T extends Ent> implements Action<T, SimpleBuilder<T>, Data> {
|
|
88
88
|
viewer: Viewer;
|
|
89
89
|
private fields;
|
|
90
90
|
builder: SimpleBuilder<T>;
|
|
91
|
-
validators: Validator<T>[];
|
|
92
|
-
triggers: Trigger<T>[];
|
|
93
|
-
observers: Observer<T>[];
|
|
91
|
+
validators: Validator<SimpleBuilder<T>, Data>[];
|
|
92
|
+
triggers: Trigger<SimpleBuilder<T>, Data>[];
|
|
93
|
+
observers: Observer<SimpleBuilder<T>, Data>[];
|
|
94
94
|
viewerForEntLoad: viewerEntLoadFunc | undefined;
|
|
95
95
|
constructor(viewer: Viewer, schema: BuilderSchema<T>, fields: Map<string, any>, operation?: WriteOperation, existingEnt?: T | undefined);
|
|
96
|
-
getPrivacyPolicy(): import("../core/base").PrivacyPolicy
|
|
96
|
+
getPrivacyPolicy(): import("../core/base").PrivacyPolicy<Ent>;
|
|
97
97
|
getInput(): Data;
|
|
98
98
|
changeset(): Promise<Changeset<T>>;
|
|
99
99
|
valid(): Promise<boolean>;
|
|
@@ -53,7 +53,7 @@ export declare class UserToFriendRequestsQuery extends AssocEdgeQueryBase<FakeUs
|
|
|
53
53
|
}
|
|
54
54
|
export declare class UserToIncomingFriendRequestsQuery extends AssocEdgeQueryBase<FakeUser, FakeUser, AssocEdge> {
|
|
55
55
|
constructor(viewer: Viewer, src: EdgeQuerySource<FakeUser, FakeUser>);
|
|
56
|
-
getPrivacyPolicy(): import("../../core/base").PrivacyPolicy
|
|
56
|
+
getPrivacyPolicy(): import("../../core/base").PrivacyPolicy<Ent>;
|
|
57
57
|
sourceEnt(id: ID): Promise<FakeUser | null>;
|
|
58
58
|
static query(viewer: Viewer, src: EdgeQuerySource<FakeUser, FakeUser>): UserToIncomingFriendRequestsQuery;
|
|
59
59
|
queryContacts(): UserToContactsQuery;
|
|
@@ -90,7 +90,7 @@ export declare class UserToEventsInNextWeekQuery extends CustomEdgeQueryBase<Fak
|
|
|
90
90
|
constructor(viewer: Viewer, src: ID | FakeUser);
|
|
91
91
|
static query(viewer: Viewer, src: FakeUser | ID): UserToEventsInNextWeekQuery;
|
|
92
92
|
sourceEnt(id: ID): Promise<FakeUser | null>;
|
|
93
|
-
getPrivacyPolicy(): import("../../core/base").PrivacyPolicy
|
|
93
|
+
getPrivacyPolicy(): import("../../core/base").PrivacyPolicy<Ent>;
|
|
94
94
|
}
|
|
95
95
|
export declare class UserToFollowingQuery extends AssocEdgeQueryBase<FakeUser, Ent, AssocEdge> {
|
|
96
96
|
constructor(viewer: Viewer, src: EdgeQuerySource<FakeUser, FakeUser>);
|