@snowtop/ent 0.2.4 → 0.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/action/action.js +5 -5
- package/action/executor.d.ts +1 -1
- package/action/executor.js +4 -4
- package/action/experimental_action.d.ts +7 -4
- package/action/experimental_action.js +18 -8
- package/action/operations.js +17 -7
- package/action/orchestrator.d.ts +10 -2
- package/action/orchestrator.js +29 -31
- package/action/privacy.d.ts +2 -2
- package/action/relative_value.js +3 -3
- package/auth/auth.d.ts +0 -1
- package/auth/auth.js +4 -5
- package/core/base.js +5 -5
- package/core/clause.js +76 -67
- package/core/config.d.ts +1 -1
- package/core/config.js +22 -9
- package/core/context.d.ts +0 -1
- package/core/convert.d.ts +0 -1
- package/core/convert.js +16 -17
- package/core/date.js +1 -2
- package/core/db.js +17 -7
- package/core/ent.d.ts +2 -0
- package/core/ent.js +127 -92
- package/core/global_schema.js +6 -7
- package/core/loaders/assoc_count_loader.d.ts +2 -2
- package/core/loaders/assoc_count_loader.js +17 -7
- package/core/loaders/assoc_edge_loader.d.ts +2 -2
- package/core/loaders/assoc_edge_loader.js +44 -20
- package/core/loaders/cache_utils.d.ts +1 -0
- package/core/loaders/cache_utils.js +28 -0
- package/core/loaders/index.d.ts +1 -0
- package/core/loaders/index.js +4 -1
- package/core/loaders/loader.d.ts +2 -0
- package/core/loaders/loader.js +20 -3
- package/core/loaders/object_loader.d.ts +6 -4
- package/core/loaders/object_loader.js +86 -48
- package/core/loaders/query_loader.d.ts +2 -2
- package/core/loaders/query_loader.js +25 -9
- package/core/loaders/raw_count_loader.d.ts +2 -2
- package/core/loaders/raw_count_loader.js +22 -10
- package/core/logger.js +6 -7
- package/core/privacy.d.ts +2 -2
- package/core/privacy.js +4 -5
- package/core/query/assoc_query.js +17 -7
- package/core/query/query.js +17 -7
- package/core/query/shared_assoc_test.js +1 -2
- package/core/query_impl.js +4 -5
- package/core/viewer.d.ts +2 -2
- package/graphql/graphql_field_helpers.js +22 -22
- package/graphql/mutations/union.js +1 -2
- package/graphql/node_resolver.js +7 -7
- package/graphql/query/shared_assoc_test.js +1 -2
- package/graphql/scalars/date.js +8 -3
- package/graphql/scalars/time.d.ts +1 -1
- package/imports/dataz/example1/_auth.js +14 -10
- package/imports/index.js +18 -9
- package/index.js +17 -7
- package/names/names.js +61 -18
- package/package.json +14 -17
- package/parse_schema/parse.js +2 -3
- package/schema/binary_field.js +3 -3
- package/schema/field.js +45 -35
- package/schema/json_field.js +7 -7
- package/schema/schema.js +12 -12
- package/schema/struct_field.js +4 -4
- package/schema/union_field.js +3 -3
- package/scripts/custom_compiler.js +17 -7
- package/scripts/custom_graphql.js +17 -7
- package/scripts/fix_action_exports.js +17 -7
- package/scripts/move_types.js +17 -7
- package/scripts/read_schema.js +17 -7
- package/testutils/action/complex_schemas.js +28 -18
- package/testutils/builder.d.ts +1 -1
- package/testutils/builder.js +7 -7
- package/testutils/db/fixture.js +1 -2
- package/testutils/db/temp_db.js +54 -44
- package/testutils/db/value.js +3 -4
- package/testutils/db_mock.js +12 -0
- package/testutils/ent-graphql-tests/index.d.ts +3 -3
- package/testutils/ent-graphql-tests/index.js +27 -18
- package/testutils/fake_data/const.js +2 -2
- package/testutils/fake_data/fake_contact.js +20 -10
- package/testutils/fake_data/fake_event.js +20 -10
- package/testutils/fake_data/fake_tag.js +21 -11
- package/testutils/fake_data/fake_user.js +21 -11
- package/testutils/fake_data/test_helpers.js +17 -17
- package/testutils/fake_data/user_query.js +19 -9
- package/testutils/parse_sql.js +151 -43
- package/testutils/query.js +2 -3
- package/testutils/soft_delete.js +17 -7
- package/testutils/test_edge_global_schema.js +17 -7
- package/testutils/write.js +20 -11
- package/tsc/ast.js +27 -18
- package/tsc/compilerOptions.js +22 -13
- package/tsc/move_generated.js +18 -9
- package/tsc/transform.js +18 -9
- package/tsc/transform_action.js +17 -7
- package/tsc/transform_schema.js +17 -7
package/action/action.js
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.WriteOperation = void 0;
|
|
4
|
+
exports.saveBuilder = saveBuilder;
|
|
5
|
+
exports.saveBuilderX = saveBuilderX;
|
|
6
|
+
exports.setEdgeTypeInGroup = setEdgeTypeInGroup;
|
|
7
|
+
exports.clearEdgeTypeInGroup = clearEdgeTypeInGroup;
|
|
4
8
|
const base_1 = require("../core/base");
|
|
5
9
|
Object.defineProperty(exports, "WriteOperation", { enumerable: true, get: function () { return base_1.WriteOperation; } });
|
|
6
10
|
const ent_1 = require("../core/ent");
|
|
@@ -8,11 +12,9 @@ const logger_1 = require("../core/logger");
|
|
|
8
12
|
async function saveBuilder(builder) {
|
|
9
13
|
await saveBuilderImpl(builder, false);
|
|
10
14
|
}
|
|
11
|
-
exports.saveBuilder = saveBuilder;
|
|
12
15
|
async function saveBuilderX(builder) {
|
|
13
16
|
await saveBuilderImpl(builder, true);
|
|
14
17
|
}
|
|
15
|
-
exports.saveBuilderX = saveBuilderX;
|
|
16
18
|
async function saveBuilderImpl(builder, throwErr) {
|
|
17
19
|
let changeset;
|
|
18
20
|
try {
|
|
@@ -83,7 +85,6 @@ async function setEdgeTypeInGroup(orchestrator, inputEnumValue, id1, id2, id2Nod
|
|
|
83
85
|
}
|
|
84
86
|
await Promise.all(promises);
|
|
85
87
|
}
|
|
86
|
-
exports.setEdgeTypeInGroup = setEdgeTypeInGroup;
|
|
87
88
|
async function clearEdgeTypeInGroup(orchestrator, id1, id2, m) {
|
|
88
89
|
let promises = [];
|
|
89
90
|
for (const [_, edgeType] of m) {
|
|
@@ -102,4 +103,3 @@ async function clearEdgeTypeInGroup(orchestrator, id1, id2, m) {
|
|
|
102
103
|
}
|
|
103
104
|
await Promise.all(promises);
|
|
104
105
|
}
|
|
105
|
-
exports.clearEdgeTypeInGroup = clearEdgeTypeInGroup;
|
package/action/executor.d.ts
CHANGED
|
@@ -12,7 +12,7 @@ export declare class ListBasedExecutor<T extends Ent> implements Executor {
|
|
|
12
12
|
private complexOptions?;
|
|
13
13
|
private idx;
|
|
14
14
|
builder?: Builder<Ent> | undefined;
|
|
15
|
-
constructor(viewer: Viewer, placeholderID: ID, operations: DataOperation<T>[], options?: OrchestratorOptions<T, Data, Viewer
|
|
15
|
+
constructor(viewer: Viewer, placeholderID: ID, operations: DataOperation<T>[], options?: OrchestratorOptions<T, Data, Viewer> | undefined, complexOptions?: ComplexExecutorOptions | undefined);
|
|
16
16
|
private lastOp;
|
|
17
17
|
private createdEnt;
|
|
18
18
|
private changedOps;
|
package/action/executor.js
CHANGED
|
@@ -3,7 +3,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.
|
|
6
|
+
exports.ComplexExecutor = exports.ListBasedExecutor = void 0;
|
|
7
|
+
exports.executeOperations = executeOperations;
|
|
7
8
|
const graph_data_structure_1 = require("graph-data-structure");
|
|
8
9
|
const ent_1 = require("../core/ent");
|
|
9
10
|
const db_1 = __importDefault(require("../core/db"));
|
|
@@ -122,7 +123,7 @@ class ComplexExecutor {
|
|
|
122
123
|
this.executors = [];
|
|
123
124
|
this.changedOps = new Map();
|
|
124
125
|
this.builder = options?.builder;
|
|
125
|
-
|
|
126
|
+
const graph = new graph_data_structure_1.Graph();
|
|
126
127
|
const changesetMap = new Map();
|
|
127
128
|
const impl = (c) => {
|
|
128
129
|
changesetMap.set(c.placeholderID.toString(), c);
|
|
@@ -155,7 +156,7 @@ class ComplexExecutor {
|
|
|
155
156
|
// TODO: can this logic be rewritten to not have a set yet avoid duplicates?
|
|
156
157
|
let nodeOps = new Set();
|
|
157
158
|
let remainOps = new Set();
|
|
158
|
-
|
|
159
|
+
const sorted = (0, graph_data_structure_1.topologicalSort)(graph);
|
|
159
160
|
sorted.forEach((node) => {
|
|
160
161
|
let c = changesetMap.get(node);
|
|
161
162
|
if (!c) {
|
|
@@ -338,7 +339,6 @@ async function executeOperations(executor, context, trackOps) {
|
|
|
338
339
|
}
|
|
339
340
|
return operations;
|
|
340
341
|
}
|
|
341
|
-
exports.executeOperations = executeOperations;
|
|
342
342
|
function maybeChangeOp(op, complexOptions) {
|
|
343
343
|
if (!op ||
|
|
344
344
|
!complexOptions?.conditionalOverride ||
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { Orchestrator } from "./orchestrator";
|
|
2
|
-
import { Viewer, Ent, Data } from "../core/base";
|
|
2
|
+
import { Viewer, Ent, Data, Context } from "../core/base";
|
|
3
3
|
import { Action, WriteOperation, Builder, Trigger, Observer, Changeset, Validator } from "./action";
|
|
4
4
|
export interface ActionOptions<TEnt extends Ent<TViewer>, TViewer extends Viewer, TData extends Data, TExistingEnt extends TMaybleNullableEnt<TEnt> = MaybeNull<TEnt>> {
|
|
5
5
|
existingEnt: TExistingEnt;
|
|
6
6
|
input?: TData;
|
|
7
7
|
operation?: WriteOperation;
|
|
8
|
+
viewerForEntLoad?(data: Data, ctx?: Context<TViewer>): TViewer | Promise<TViewer>;
|
|
8
9
|
}
|
|
9
10
|
type MaybeNull<T extends Ent> = T | null;
|
|
10
11
|
type TMaybleNullableEnt<T extends Ent> = T | MaybeNull<T>;
|
|
@@ -23,10 +24,12 @@ export declare class BaseAction<TEnt extends Ent<TViewer>, TViewer extends Viewe
|
|
|
23
24
|
builderCtr: BuilderConstructor<TEnt, TViewer, TInput, TExistingEnt>;
|
|
24
25
|
builder: EntBuilder<TEnt, TViewer, TInput, TExistingEnt>;
|
|
25
26
|
private input;
|
|
27
|
+
options: ActionOptions<TEnt, TViewer, TInput, TExistingEnt>;
|
|
26
28
|
getPrivacyPolicy(): import("../core/base").PrivacyPolicy<Ent<Viewer<Ent<any> | null, import("../core/base").ID | null>>, Viewer<Ent<any> | null, import("../core/base").ID | null>>;
|
|
27
29
|
getTriggers(): Trigger<TEnt, EntBuilder<TEnt, TViewer, TInput, TExistingEnt>, TViewer, TInput, TExistingEnt>[];
|
|
28
30
|
getObservers(): Observer<TEnt, EntBuilder<TEnt, TViewer, TInput, TExistingEnt>, TViewer, TInput, TExistingEnt>[];
|
|
29
31
|
getValidators(): Validator<TEnt, EntBuilder<TEnt, TViewer, TInput, TExistingEnt>, TViewer, TInput, TExistingEnt>[];
|
|
32
|
+
viewerForEntLoad(data: Data, context?: Context<TViewer> | undefined): TViewer | Promise<TViewer>;
|
|
30
33
|
constructor(viewer: TViewer, builderCtr: BuilderConstructor<TEnt, TViewer, TInput, TExistingEnt>, options: ActionOptions<TEnt, TViewer, TInput, TExistingEnt>);
|
|
31
34
|
static createBuilder<TEnt extends Ent<TViewer>, TViewer extends Viewer, TInput extends Data, TExistingEnt extends TMaybleNullableEnt<TEnt> = MaybeNull<TEnt>>(viewer: Viewer, builderCtr: BuilderConstructor<TEnt, TViewer, TInput, TExistingEnt>, options: ActionOptions<TEnt, TViewer, TInput, TExistingEnt>): Builder<TEnt>;
|
|
32
35
|
/**
|
|
@@ -44,7 +47,7 @@ export interface BuilderConstructor<TEnt extends Ent<TViewer>, TViewer extends V
|
|
|
44
47
|
new (viewer: TViewer, operation: WriteOperation, action: Action<TEnt, any, TViewer, TInput, TExistingEnt>, existingEnt: TExistingEnt): EntBuilder<TEnt, TViewer, TInput, TExistingEnt>;
|
|
45
48
|
}
|
|
46
49
|
export declare function updateRawObject<TEnt extends Ent<TViewer>, TViewer extends Viewer, TInput extends Data>(viewer: TViewer, builderCtr: BuilderConstructor<TEnt, TViewer, TInput, TEnt>, existingEnt: TEnt, input: TInput): Promise<TEnt>;
|
|
47
|
-
export declare function getSimpleEditAction<TEnt extends Ent<TViewer>, TViewer extends Viewer, TInput extends Data>(viewer: TViewer, builderCtr: BuilderConstructor<TEnt, TViewer, TInput, TEnt>, existingEnt: TEnt, input: TInput): BaseAction<TEnt, TViewer, TInput, TEnt>;
|
|
48
|
-
export declare function getSimpleDeleteAction<TEnt extends Ent<TViewer>, TViewer extends Viewer, TInput extends Data>(viewer: TViewer, builderCtr: BuilderConstructor<TEnt, TViewer, TInput, TEnt>, existingEnt: TEnt, input: TInput): BaseAction<TEnt, TViewer, TInput, TEnt>;
|
|
49
|
-
export declare function getSimpleInsertAction<TEnt extends Ent<TViewer>, TViewer extends Viewer, TInput extends Data>(viewer: TViewer, builderCtr: BuilderConstructor<TEnt, TViewer, TInput, null>, input: TInput): BaseAction<TEnt, TViewer, TInput, null>;
|
|
50
|
+
export declare function getSimpleEditAction<TEnt extends Ent<TViewer>, TViewer extends Viewer, TInput extends Data>(viewer: TViewer, builderCtr: BuilderConstructor<TEnt, TViewer, TInput, TEnt>, existingEnt: TEnt, input: TInput, opts?: Omit<ActionOptions<TEnt, TViewer, TInput, TEnt>, "operation" | "input" | "existingEnt">): BaseAction<TEnt, TViewer, TInput, TEnt>;
|
|
51
|
+
export declare function getSimpleDeleteAction<TEnt extends Ent<TViewer>, TViewer extends Viewer, TInput extends Data>(viewer: TViewer, builderCtr: BuilderConstructor<TEnt, TViewer, TInput, TEnt>, existingEnt: TEnt, input: TInput, opts?: Omit<ActionOptions<TEnt, TViewer, TInput, null>, "operation" | "input" | "existingEnt">): BaseAction<TEnt, TViewer, TInput, TEnt>;
|
|
52
|
+
export declare function getSimpleInsertAction<TEnt extends Ent<TViewer>, TViewer extends Viewer, TInput extends Data>(viewer: TViewer, builderCtr: BuilderConstructor<TEnt, TViewer, TInput, null>, input: TInput, opts?: Omit<ActionOptions<TEnt, TViewer, TInput, null>, "operation" | "input" | "existingEnt">): BaseAction<TEnt, TViewer, TInput, null>;
|
|
50
53
|
export {};
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.BaseAction = void 0;
|
|
4
|
+
exports.updateRawObject = updateRawObject;
|
|
5
|
+
exports.getSimpleEditAction = getSimpleEditAction;
|
|
6
|
+
exports.getSimpleDeleteAction = getSimpleDeleteAction;
|
|
7
|
+
exports.getSimpleInsertAction = getSimpleInsertAction;
|
|
4
8
|
const privacy_1 = require("../core/privacy");
|
|
5
9
|
const action_1 = require("./action");
|
|
6
10
|
class BaseAction {
|
|
@@ -16,6 +20,12 @@ class BaseAction {
|
|
|
16
20
|
getValidators() {
|
|
17
21
|
return [];
|
|
18
22
|
}
|
|
23
|
+
viewerForEntLoad(data, context) {
|
|
24
|
+
if (this.options.viewerForEntLoad) {
|
|
25
|
+
return this.options.viewerForEntLoad(data, context);
|
|
26
|
+
}
|
|
27
|
+
return this.viewer;
|
|
28
|
+
}
|
|
19
29
|
constructor(viewer, builderCtr, options) {
|
|
20
30
|
this.viewer = viewer;
|
|
21
31
|
this.builderCtr = builderCtr;
|
|
@@ -30,6 +40,7 @@ class BaseAction {
|
|
|
30
40
|
}
|
|
31
41
|
this.input = options?.input || {};
|
|
32
42
|
this.builder = new builderCtr(viewer, operation, this, options.existingEnt);
|
|
43
|
+
this.options = options;
|
|
33
44
|
}
|
|
34
45
|
static createBuilder(viewer, builderCtr, options) {
|
|
35
46
|
let action = new BaseAction(viewer, builderCtr, options);
|
|
@@ -87,33 +98,32 @@ async function updateRawObject(viewer, builderCtr, existingEnt, input) {
|
|
|
87
98
|
});
|
|
88
99
|
return action.saveX();
|
|
89
100
|
}
|
|
90
|
-
exports.updateRawObject = updateRawObject;
|
|
91
101
|
// TODO need to fix types for all these
|
|
92
102
|
// creates an action which has no privacy, triggers, observers etc
|
|
93
103
|
// does do field validation
|
|
94
104
|
// useful to batch a bunch of writes together with BaseAction.bulkAction
|
|
95
105
|
// note that only editable fields in the builder can be passed here
|
|
96
|
-
function getSimpleEditAction(viewer, builderCtr, existingEnt, input) {
|
|
106
|
+
function getSimpleEditAction(viewer, builderCtr, existingEnt, input, opts) {
|
|
97
107
|
return new BaseAction(viewer, builderCtr, {
|
|
98
108
|
existingEnt: existingEnt,
|
|
99
109
|
operation: action_1.WriteOperation.Edit,
|
|
100
110
|
input,
|
|
111
|
+
...opts,
|
|
101
112
|
});
|
|
102
113
|
}
|
|
103
|
-
|
|
104
|
-
function getSimpleDeleteAction(viewer, builderCtr, existingEnt, input) {
|
|
114
|
+
function getSimpleDeleteAction(viewer, builderCtr, existingEnt, input, opts) {
|
|
105
115
|
return new BaseAction(viewer, builderCtr, {
|
|
106
116
|
existingEnt: existingEnt,
|
|
107
117
|
operation: action_1.WriteOperation.Delete,
|
|
108
118
|
input,
|
|
119
|
+
...opts,
|
|
109
120
|
});
|
|
110
121
|
}
|
|
111
|
-
|
|
112
|
-
function getSimpleInsertAction(viewer, builderCtr, input) {
|
|
122
|
+
function getSimpleInsertAction(viewer, builderCtr, input, opts) {
|
|
113
123
|
return new BaseAction(viewer, builderCtr, {
|
|
114
124
|
operation: action_1.WriteOperation.Insert,
|
|
115
125
|
input,
|
|
116
126
|
existingEnt: null,
|
|
127
|
+
...opts,
|
|
117
128
|
});
|
|
118
129
|
}
|
|
119
|
-
exports.getSimpleInsertAction = getSimpleInsertAction;
|
package/action/operations.js
CHANGED
|
@@ -15,13 +15,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
|
|
|
15
15
|
}) : function(o, v) {
|
|
16
16
|
o["default"] = v;
|
|
17
17
|
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
};
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
25
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
36
|
exports.ConditionalNodeOperation = exports.ConditionalOperation = exports.EdgeOperation = exports.EditNodeOperation = exports.NoOperation = exports.RawQueryOperation = exports.DeleteNodeOperation = void 0;
|
|
27
37
|
const action_1 = require("../action");
|
package/action/orchestrator.d.ts
CHANGED
|
@@ -73,6 +73,14 @@ export declare class Orchestrator<TEnt extends Ent<TViewer>, TInput extends Data
|
|
|
73
73
|
private getSQLStatementOperation;
|
|
74
74
|
private getWriteOpForSQLStamentOp;
|
|
75
75
|
getPossibleUnsafeEntForPrivacy(): Promise<TEnt>;
|
|
76
|
+
/**
|
|
77
|
+
* This gets the fields that were explicitly set plus any default or transformed values
|
|
78
|
+
* mainly exists to get default fields e.g. default id to be used in triggers
|
|
79
|
+
* NOTE: this API may change in the future
|
|
80
|
+
* doesn't work to get ids for autoincrement keys
|
|
81
|
+
* PS contrasted with getValidatedFields() which returns the format that would be written to the db
|
|
82
|
+
* i.e. includes lists which have been converted to JSON strings, etc
|
|
83
|
+
*/
|
|
76
84
|
getEditedData(): Promise<Data>;
|
|
77
85
|
/**
|
|
78
86
|
* @returns validated and formatted fields that would be written to the db
|
|
@@ -114,11 +122,11 @@ export declare class EntChangeset<TEnt extends Ent<TViewer>, TViewer extends Vie
|
|
|
114
122
|
readonly placeholderID: ID;
|
|
115
123
|
private conditionalOverride;
|
|
116
124
|
operations: DataOperation<any, TViewer>[];
|
|
117
|
-
dependencies?: Map<ID, Builder<Ent
|
|
125
|
+
dependencies?: Map<ID, Builder<Ent>> | undefined;
|
|
118
126
|
changesets?: Changeset[] | undefined;
|
|
119
127
|
private options?;
|
|
120
128
|
private _executor;
|
|
121
|
-
constructor(viewer: Viewer, builder: Builder<TEnt, TViewer>, placeholderID: ID, conditionalOverride: boolean, operations: DataOperation<any, TViewer>[], dependencies?: Map<ID, Builder<Ent
|
|
129
|
+
constructor(viewer: Viewer, builder: Builder<TEnt, TViewer>, placeholderID: ID, conditionalOverride: boolean, operations: DataOperation<any, TViewer>[], dependencies?: Map<ID, Builder<Ent>> | undefined, changesets?: Changeset[] | undefined, options?: OrchestratorOptions<TEnt, Data, TViewer> | undefined);
|
|
122
130
|
static changesetFrom<TEnt extends Ent<TViewer>, TViewer extends Viewer = Viewer>(builder: Builder<TEnt, TViewer, any>, ops: DataOperation<any, TViewer>[]): EntChangeset<any, TViewer>;
|
|
123
131
|
static changesetFromQueries<TEnt extends Ent<TViewer>, TViewer extends Viewer = Viewer>(builder: Builder<TEnt, TViewer, any>, queries: Array<string | parameterizedQueryOptions>): EntChangeset<any, TViewer>;
|
|
124
132
|
private static changesetFromEdgeOp;
|
package/action/orchestrator.js
CHANGED
|
@@ -15,13 +15,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
|
|
|
15
15
|
}) : function(o, v) {
|
|
16
16
|
o["default"] = v;
|
|
17
17
|
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
};
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
25
35
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
37
|
};
|
|
@@ -93,6 +103,7 @@ class Orchestrator {
|
|
|
93
103
|
this.edgeSet = new Set();
|
|
94
104
|
this.edges = new Map();
|
|
95
105
|
this.conditionalEdges = new Map();
|
|
106
|
+
this.validatedFields = null;
|
|
96
107
|
this.changesets = [];
|
|
97
108
|
this.dependencies = new Map();
|
|
98
109
|
this.fieldsToResolve = [];
|
|
@@ -401,10 +412,14 @@ class Orchestrator {
|
|
|
401
412
|
const { schemaFields, editedData } = await this.memoizedGetFields();
|
|
402
413
|
return this.getEntForPrivacyPolicyImpl(schemaFields, editedData, this.options.viewer);
|
|
403
414
|
}
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
415
|
+
/**
|
|
416
|
+
* This gets the fields that were explicitly set plus any default or transformed values
|
|
417
|
+
* mainly exists to get default fields e.g. default id to be used in triggers
|
|
418
|
+
* NOTE: this API may change in the future
|
|
419
|
+
* doesn't work to get ids for autoincrement keys
|
|
420
|
+
* PS contrasted with getValidatedFields() which returns the format that would be written to the db
|
|
421
|
+
* i.e. includes lists which have been converted to JSON strings, etc
|
|
422
|
+
*/
|
|
408
423
|
async getEditedData() {
|
|
409
424
|
const { editedData } = await this.memoizedGetFields();
|
|
410
425
|
return editedData;
|
|
@@ -519,7 +534,7 @@ class Orchestrator {
|
|
|
519
534
|
return errors;
|
|
520
535
|
}
|
|
521
536
|
async triggers(action, builder, triggers) {
|
|
522
|
-
|
|
537
|
+
const groups = [];
|
|
523
538
|
let lastArray = 0;
|
|
524
539
|
let prevWasArray = false;
|
|
525
540
|
for (let i = 0; i < triggers.length; i++) {
|
|
@@ -696,29 +711,12 @@ class Orchestrator {
|
|
|
696
711
|
data[dbKey] = value;
|
|
697
712
|
}
|
|
698
713
|
if (defaultValue !== undefined) {
|
|
699
|
-
// Format defaults early so JSON/list defaults are DB-ready in edited data.
|
|
700
|
-
let formattedDefaultValue = defaultValue;
|
|
701
|
-
if (defaultValue !== null && !this.isBuilder(defaultValue) && field.format) {
|
|
702
|
-
let valid = true;
|
|
703
|
-
if (field.valid) {
|
|
704
|
-
valid = field.valid(defaultValue);
|
|
705
|
-
if ((0, types_1.isPromise)(valid)) {
|
|
706
|
-
valid = await valid;
|
|
707
|
-
}
|
|
708
|
-
}
|
|
709
|
-
if (valid) {
|
|
710
|
-
formattedDefaultValue = field.format(defaultValue);
|
|
711
|
-
if ((0, types_1.isPromise)(formattedDefaultValue)) {
|
|
712
|
-
formattedDefaultValue = await formattedDefaultValue;
|
|
713
|
-
}
|
|
714
|
-
}
|
|
715
|
-
}
|
|
716
714
|
updateInput = true;
|
|
717
715
|
if (updateOnlyIfOther) {
|
|
718
|
-
defaultData[dbKey] =
|
|
716
|
+
defaultData[dbKey] = defaultValue;
|
|
719
717
|
}
|
|
720
718
|
else {
|
|
721
|
-
data[dbKey] =
|
|
719
|
+
data[dbKey] = defaultValue;
|
|
722
720
|
}
|
|
723
721
|
this.defaultFieldsByFieldName[fieldName] = defaultValue;
|
|
724
722
|
this.defaultFieldsByTSName[this.getInputKey(fieldName)] = defaultValue;
|
package/action/privacy.d.ts
CHANGED
|
@@ -2,11 +2,11 @@ import { Builder } from "./action";
|
|
|
2
2
|
import { Viewer, ID, Ent, PrivacyResult, PrivacyPolicyRule } from "../core/base";
|
|
3
3
|
export declare class DenyIfBuilder implements PrivacyPolicyRule {
|
|
4
4
|
private id?;
|
|
5
|
-
constructor(id?: ID | Builder<Ent
|
|
5
|
+
constructor(id?: (ID | Builder<Ent, any>) | undefined);
|
|
6
6
|
apply(_v: Viewer, _ent: Ent): Promise<PrivacyResult>;
|
|
7
7
|
}
|
|
8
8
|
export declare class AllowIfBuilder implements PrivacyPolicyRule {
|
|
9
9
|
private id?;
|
|
10
|
-
constructor(id?: ID | Builder<Ent
|
|
10
|
+
constructor(id?: (ID | Builder<Ent, any>) | undefined);
|
|
11
11
|
apply(_v: Viewer, _ent: Ent): Promise<PrivacyResult>;
|
|
12
12
|
}
|
package/action/relative_value.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.NumberOps = void 0;
|
|
4
|
+
exports.convertRelativeInput = convertRelativeInput;
|
|
5
|
+
exports.maybeConvertRelativeInputPlusExpressions = maybeConvertRelativeInputPlusExpressions;
|
|
4
6
|
const clause_1 = require("../core/clause");
|
|
5
7
|
function addNumber(delta) {
|
|
6
8
|
return {
|
|
@@ -101,7 +103,6 @@ function convertRelativeInput(rel, col, existing) {
|
|
|
101
103
|
}
|
|
102
104
|
throw new Error(`error in convertRelativeInput. shouldn't have gotten here`);
|
|
103
105
|
}
|
|
104
|
-
exports.convertRelativeInput = convertRelativeInput;
|
|
105
106
|
function maybeConvertRelativeInputPlusExpressions(rel, col, existing, expressions) {
|
|
106
107
|
if (rel === null) {
|
|
107
108
|
return rel;
|
|
@@ -122,4 +123,3 @@ function maybeConvertRelativeInputPlusExpressions(rel, col, existing, expression
|
|
|
122
123
|
expressions.set(col, clause);
|
|
123
124
|
return value;
|
|
124
125
|
}
|
|
125
|
-
exports.maybeConvertRelativeInputPlusExpressions = maybeConvertRelativeInputPlusExpressions;
|
package/auth/auth.d.ts
CHANGED
package/auth/auth.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.registerAuthHandler = registerAuthHandler;
|
|
4
|
+
exports.clearAuthHandlers = clearAuthHandlers;
|
|
5
|
+
exports.getLoggedInViewer = getLoggedInViewer;
|
|
6
|
+
exports.buildContext = buildContext;
|
|
4
7
|
const viewer_1 = require("../core/viewer");
|
|
5
8
|
const context_1 = require("../core/context");
|
|
6
9
|
const logger_1 = require("../core/logger");
|
|
@@ -8,11 +11,9 @@ let handlers = new Map();
|
|
|
8
11
|
async function registerAuthHandler(name, auth) {
|
|
9
12
|
handlers.set(name, auth);
|
|
10
13
|
}
|
|
11
|
-
exports.registerAuthHandler = registerAuthHandler;
|
|
12
14
|
async function clearAuthHandlers() {
|
|
13
15
|
handlers.clear();
|
|
14
16
|
}
|
|
15
|
-
exports.clearAuthHandlers = clearAuthHandlers;
|
|
16
17
|
async function getLoggedInViewer(context) {
|
|
17
18
|
for (const [name, authHandler] of handlers) {
|
|
18
19
|
let v = await authHandler.authViewer(context);
|
|
@@ -24,7 +25,6 @@ async function getLoggedInViewer(context) {
|
|
|
24
25
|
(0, logger_1.log)("info", "no auth handler returned viewer. default to logged out viewer");
|
|
25
26
|
return null;
|
|
26
27
|
}
|
|
27
|
-
exports.getLoggedInViewer = getLoggedInViewer;
|
|
28
28
|
async function buildContext(request, response) {
|
|
29
29
|
const ctx = new contextImpl(request, response);
|
|
30
30
|
let viewer = await getLoggedInViewer(ctx);
|
|
@@ -34,7 +34,6 @@ async function buildContext(request, response) {
|
|
|
34
34
|
}
|
|
35
35
|
return ctx;
|
|
36
36
|
}
|
|
37
|
-
exports.buildContext = buildContext;
|
|
38
37
|
class contextImpl {
|
|
39
38
|
constructor(request, response) {
|
|
40
39
|
this.request = request;
|
package/core/base.js
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.WriteOperation =
|
|
3
|
+
exports.WriteOperation = void 0;
|
|
4
|
+
exports.Allow = Allow;
|
|
5
|
+
exports.Skip = Skip;
|
|
6
|
+
exports.Deny = Deny;
|
|
7
|
+
exports.DenyWithReason = DenyWithReason;
|
|
4
8
|
// Privacy
|
|
5
9
|
var privacyResult;
|
|
6
10
|
(function (privacyResult) {
|
|
@@ -15,21 +19,18 @@ const allow = {
|
|
|
15
19
|
function Allow() {
|
|
16
20
|
return allow;
|
|
17
21
|
}
|
|
18
|
-
exports.Allow = Allow;
|
|
19
22
|
const skip = {
|
|
20
23
|
result: privacyResult.Skip,
|
|
21
24
|
};
|
|
22
25
|
function Skip() {
|
|
23
26
|
return skip;
|
|
24
27
|
}
|
|
25
|
-
exports.Skip = Skip;
|
|
26
28
|
const deny = {
|
|
27
29
|
result: privacyResult.Deny,
|
|
28
30
|
};
|
|
29
31
|
function Deny() {
|
|
30
32
|
return deny;
|
|
31
33
|
}
|
|
32
|
-
exports.Deny = Deny;
|
|
33
34
|
class DenyWithReasonError extends Error {
|
|
34
35
|
constructor(privacyPolicy, rule, msg, ent) {
|
|
35
36
|
super(msg);
|
|
@@ -52,7 +53,6 @@ function DenyWithReason(e) {
|
|
|
52
53
|
error: e,
|
|
53
54
|
};
|
|
54
55
|
}
|
|
55
|
-
exports.DenyWithReason = DenyWithReason;
|
|
56
56
|
var WriteOperation;
|
|
57
57
|
(function (WriteOperation) {
|
|
58
58
|
WriteOperation["Insert"] = "insert";
|